新闻中心

EEPW首页 > 汽车电子 > 设计应用 > 基于代码生成的车身网络电控系统设计

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

作者:时间:2010-12-09来源:网络收藏


LIN从机节点使用Freescale公司8位单片机MC9S08DZ60作为主控芯片,使用其SCI模块连接LIN收发器TJAl020,再连接其他外围执行器组成。LIN从机节点功能框图如图3所示。


2.2 软件建模
目前,大多数单片机所支持的软件编译器均以C语言为主,而在C语言中没有类及继承等相关概念,同时出于可移植性的考虑,软件模型采用分层思想。将整个设计的软件结构分为4层:第0层为类型定义及中断服务程序返回值的宏定义,第1层为单片机及其内部功能模块类的抽象,第2层为外围硬件类的抽象,第3层为各个节点类的抽象。上层的类通过调用下层类提供的函数实现特定功能,各层的依赖关系如图4所示。其中,虚线表示调用关系。下面具体介绍第1~3层的建模方法。


2.2.1 第1层一单片机及其内部功能模块类的抽象
第1层的函数功能通过对单片机寄存器的读写实现,故使用类的成员函数,将寄存器的读写代码直接写在成员函数Behavior属性的Ini-tial框中。如使能S12中的MSCAN模块的代码如下:
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即可。



评论


相关推荐

技术专区

关闭