微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 汽车电子 > 基于代码生成的车身网络电控系统设计

基于代码生成的车身网络电控系统设计

时间:11-21 来源:21ic 点击:

SCAN模块的代码如下:

  CANCTL1(MSCANx)|=CANCTlLl_CANE_MASK;

  其中的CANCTL1是为了便于对多个MSCAN模块做统一处理,以及便于选择使用某个特定模块而手动编写的函数宏。在使用时只需将MSCANx赋值为相应的整数值(对于MC9S12XSl28,可以是O~4)。

  2.2.2 第2层一外围硬件类的抽象

  第2层需要调用第1层类的操作,这可以通过活动图实现。在活动图中,新建一个Action,根据需要选择CallOperation(调用成员函数)或Call Behavior(调用活动图的行为),再指定具体调用哪个成员函数或行为即可(调用的参数通过Action的Arguments属性传递)。最后,将各个Action按照程序流程连接起来。

  这里,使用CAN协议(上层协议使用J1939)发送一个数据帧(活动图略--编者注)。为了能够实现行为图(包括活动图)的代码生成,必须将所有的行为图及其元素都放在某个类中。活动图经过转换后生成的代码如下所示:


2.2.3 第3层一车身网络各个节点类的抽象

  除了同样需要调用第1层、第2层类的操作之外,第3层还需要对中断服务程序(ISR)进行建模。ISR的建模涉及两个问题:ISR的返回值和ISR的定位。

  (1)ISR的返回值问题。CodeWarrior支持两种ISR的声明方式。一种是使用预编译指令pragma定义一个TRAP_PROC符号,TRAP_PROC会提示编译器下面的函数是ISR,编译器会使用一个特殊的中断返回指令来结束这个函数(一般是RTI指令)。此方法需要同时修改CodeWarrior工程中的PRM文件,将ISR与中断向量表中的向量联系起来,不便于使用UML建模。

  另一种是使用与C51类似的interrupt关键字,并指定相应的中断向量号,这样就同时完成了ISR的声明和与中断向量表的关联。在EA中修改类的代码生成模板,添加一个衍型(stereotype)并命名为define,并添加相应的模板代码。其核心部分代码如下:

  修改完成后,在建模过程中只需将类的衍型设置为define,将类名设置为新定义的符号,类的父类设置为原符号即可。以CANO模块的接收中断的返回值为例,可将类名设置为ISR_CAN0_RX,将父类设置为interrupt 38void(此父类并不存在)。最后生成的代码如下:

  #define ISR_CAN0_RX interrupt 38 void

  然后将ISR的返回值指定为ISR_CANO_RX即可。

  (2)ISR的定位问题。中断服务程序的声明和定义都必须定位于non-banked区域,通过使用"#pragma CODE_SEG NON_BANKED"实现。同时,中断服务程序末尾需要添加"#pragma CODE_SEG DEFAULT",否则后面的函数也会被定位在non-banked区域而导致错误。因此,中断服务程序必须被"#pragma CODE_SEG NON_BANKED"和"#pragma CODE_SEG DEFAULT"包围起来。这也可通过修改代码生成模板实现。结合ISR返回值的宏定义,只需在当函数返回值的前3个字符是"ISR"时,在函数前后输出上述两条pragma预编译指令即可。生成ISR声明的代码生成模板的核心部分如下:

仍以上述CAN0模块的接收中断为例,最终生成的函数声明如下;

3 调试与验证

  本设计除了使用USBCAN卡作为数据采集节点以外,为了验证两种总线协议的实现是否符合标准,更直观地查看总线帧中各个字段的值以及随时检测总线上是否发生帧错误等,使用PC示波器PicoScope 5203搭配总线协议分析软件WaveBPS捕获两种总线信号并进行协议分析。Pi-coScope的两个通道可同时捕获CAN总线及LIN总线上的信号,进一步方便了网关节点的调试。

  图5为在控制面板节点(源地址为0x26)打开左转向灯时发送给车灯节点(目标地址为0x20)的CAN数据帧。其中,标记为S的位是根据位填充规则自动插入的填充位。图6为车灯节点收到上述CAN数据帧后,根据网关路由策略及帧转换规则,发送到LIN总线上的数据帧。

4 结论

  本设计借助EA的代码生成功能,通过修改代码生成模板以满足车身网络电控系统开发中C语言及编译器的要求,进行了车身网络系统的开发和初步实验验证。此方法极大地方便了设计开发,并可提高系统的可靠性。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top