3. DAVinci Developer 基础操作:SWC 创建、端口定义、接口设计与 Runnable 配置

好,咱们进入 DAVinci Developer 的核心操作区。说实话,很多新手拿到这个工具,第一反应是「这么多窗口,从哪下手?」。我当年也一样,对着空白的模型界面发愣。其实没那么复杂,你只要抓住四个关键动作:建组件、开端口、定接口、写逻辑。把这四步走顺了,AUTOSAR 的静态设计部分你就拿下了大半。

核心原则:DAVinci Developer 是「设计时」工具,它只负责定义 SWC 的骨架和接口契约。具体的算法代码,那是后面交给 Simulink 或手写 C 代码去填充的。别想着在 Developer 里写业务逻辑,它不干这个。

3.1 创建 SWC(软件组件)

打开 DAVinci Developer,新建一个项目后,第一步就是创建 SWC。我个人习惯先创建好包结构(Package),再在包里建组件,这样后期管理起来清晰得多。

操作步骤:

  1. 在 Component 视图里,右键点击目标 Package。
  2. 选择 New → Atomic SWC(或者 Application SWC,看你项目架构)。
  3. 输入组件名称,比如 SwcEngineControl。
  4. 点击 Finish。

嗯,这里要注意一个坑:组件命名一定要规范。我曾经在一个项目里接手过一堆叫 SWC1、SWC2 的组件,光看名字完全不知道它是干嘛的。后来重构时,光改名就花了两天。建议你们用 Swc_模块名_功能 这种格式。

命名示例 含义 推荐度
Swc_Body_LightCtrl 车身域灯光控制组件 ⭐⭐⭐⭐⭐
Swc_Power_BatteryMgr 动力域电池管理组件 ⭐⭐⭐⭐⭐
TestComp1 无意义测试组件 ❌ 不推荐

3.2 Port(端口)定义

组件建好了,它就是个封闭的黑盒子。怎么跟外界通信?靠端口。端口分两种:提供端口(PPort)和需求端口(RPort)。说白了,PPort 是「我能给你什么」,RPort 是「我需要你给我什么」。

创建端口:

  • 在组件编辑器中,找到 Ports 标签页。
  • 右键点击空白区域,选择 New PPort 或 New RPort。
  • 命名端口,比如 Port_SpeedSensor。
  • 关联一个 Interface(接口),这个我们下一节细说。

小技巧:端口名最好带上方向标识。我习惯用 P_ 前缀表示提供端口,R_ 前缀表示需求端口。比如 P_VehicleSpeed、R_EngineTemp。这样在组件图上扫一眼,数据流向就一目了然。

3.3 Interface(接口)设计

接口是端口的数据契约。它定义了端口能传输哪些数据元素(Data Element)或触发哪些事件(Event)。

DAVinci Developer 里常用的接口类型有三种:

接口类型 用途 典型场景
Sender-Receiver (S/R) 发送/接收数据 传感器值、状态信号
Client-Server (C/S) 远程过程调用 请求计算、设置参数
Mode Switch 模式切换通知 唤醒、休眠、故障模式

创建接口的步骤:

  1. 在 Interface 视图里,右键 Package → New → SenderReceiverInterface(或其他类型)。
  2. 添加 Data Element,比如 VehicleSpeed_kmh,类型选 uint16。
  3. 保存接口,然后回到端口属性页,把接口关联上去。

避坑指南:我曾经犯过一个低级错误——两个组件用同一个接口名,但接口内部的数据元素定义不一致。一个用了 uint8,另一个用了 uint16。编译时没报错,但运行时数据截断了,车速显示直接翻倍。排查了整整一个下午。所以,接口定义一定要在团队内统一管理,最好建一个共享的 Interface Library。

3.4 Runnable(可运行实体)配置

Runnable 是 SWC 里真正干活的东西。你可以把它理解成一段可被调度的函数。每个 Runnable 都需要绑定一个触发事件,告诉 RTE(运行时环境)什么时候该调用它。

常见的触发事件:

  • Timing Event:周期性执行,比如每 10ms 调用一次。
  • Data Received Event:当某个端口收到新数据时触发。
  • Operation Invoked Event:当客户端调用某个服务时触发。
  • Init Event:组件初始化时执行一次。

配置 Runnable 的步骤:

  1. 在组件编辑器中,找到 Runnables 标签页。
  2. 点击 New Runnable,命名比如 Runnable_ReadSpeed。
  3. 在 Events 子标签页里,添加一个 Timing Event,周期设为 0.01(即 10ms)。
  4. 在 Data Access 里,把需要读写的端口数据元素映射进来。

关键点:Runnable 的周期不是随便设的。我见过有人把所有 Runnable 都设成 1ms,结果 CPU 负载直接爆表。正确的做法是:根据信号的变化频率来定。比如车速信号 20ms 更新一次,你设 10ms 的 Runnable 去读就足够了。设得太快,纯属浪费算力。

3.5 知识体系总览

下面这张图把 SWC、Port、Interface、Runnable 的关系串起来了。你对照着看,应该会更清楚。

DAVinci Developer 核心操作关系图 SWC 设计四要素关系图 Atomic SWC Port (PPort / RPort) Interface (S/R, C/S) Runnable + Event 包含 关联 类型引用 调度执行 操作顺序建议: ① 创建 SWC → ② 定义 Interface → ③ 创建 Port 并关联 Interface → ④ 配置 Runnable 及触发事件 这个顺序能避免反复修改引用关系,减少不必要的版本冲突。

3.6 常见问题与避坑

  • 端口没连上?检查一下 PPort 和 RPort 是否关联了同一个 Interface。名字一样但 UUID 不同,在 AUTOSAR 里就是两个东西。
  • Runnable 不执行?大概率是触发事件没配,或者周期设成了 0。我见过有人把 Timing Event 的周期写成 0.0,结果 RTE 直接忽略了这个 Runnable。
  • 接口改了,端口没更新?DAVinci Developer 不会自动同步。你改了 Interface 里的 Data Element,必须手动去端口属性页里重新映射一下。

个人习惯:每次修改完接口或端口后,我都会跑一次 Check Model(快捷键 Ctrl+Shift+C)。这个功能会帮你检查出未连接的端口、未映射的 Runnable、类型不匹配等问题。别等到生成代码时才发现,那时候改起来就麻烦了。

好了,这一章的内容就到这。SWC 的创建、端口定义、接口设计、Runnable 配置,这四个动作是 DAVinci Developer 的日常操作。你多练几次,形成肌肉记忆,后面做复杂架构时就会顺手很多。