欢迎来到天天文库
浏览记录
ID:25281946
大小:53.00 KB
页数:5页
时间:2018-11-19
《汽车总线电控系统的软件解决方案》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、汽车总线电控系统的软件解决方案
2、第1内容显示中.lunelCC03。为了使转换层和规则处理层的处理方法一致,同时为了让系统在增加新的功能时,不对软件作任何修改,我们摒弃了在程序中直接用If-Then-Else对每一种情况进行逻辑判断的传统方法,代之以类似于专家系统的规则匹配进行逻辑判断。该方法的基本思想是:将各组逻辑关系按一定的组织关系存储在数组中,每组逻辑关系我们称之为一组规则,规则的每个条件和结论都称之为因子,当有消息到来时,在数组中查找该消息的所属的规则,如果找到,则判断该组规则的条件是否都满足,是,则得到Then的结果,如果有必要,在条件不满足时得到Else的结果。该算法的关键是对各
3、种逻辑关系的组织,目前我们采取的方法是将条件和结论都表示成二元组(S,ID),这里的ID表示引脚或器件的逻辑编号,S的最高两位用来区分条件和结论,接下来的一位表示消息的类型,S的其他位表示状态等信息。当S的最高位为10时表示条件,而00为Then的结论,01为else结论,当有的消息需要延时一段时间发送时,使用11作为延时标志,这时S的其他位和ID一起表示延时的时间。类型字段只需一位来表示,并且只在结论因子中有效,对于输入转换模块,通过1、0来区分是发送给规则处理模块还是直接发给输出转换模块,输出转换模块用1、0来区分是发给输出驱动模块还是发给自己,而规则处理模块用它来区分是发给转换模块还是
4、发给自己。对于逻辑[<喇叭按钮:按下]==[>喇叭:鸣][Else]==[>喇叭:关],输入转换数组中将表示成:(1000000000000101)(0010000010000110)(0110000110000110)这里喇叭按钮的编号为5,状态值为0表示按下,喇叭的编号为134,由于喇叭的按钮和喇叭不在一个节点上,产生的是输入器件消息(类型为1)。当喇叭按钮有按下的时候,输入驱动模块将其打包成消息(0x80,0x05)发送给输入转换层,输入转换模块通过在转换数组中查找到ID为5的规则,通过判断该组规则,得到(0x20,0x85)的器件消息,然后经过通讯模块,将其发送给规
5、则处理模块,规则处理模块将处理后的消息,发给相关的子节点,经输出转换后由输出驱动模块执行。4、软件实现上述的软件构架的实现,我们可以采用不同的方案,下面给出基于实时操作系统的一般实现,并假定汽车总线是CAN的情况。与各个模块相对应,对于子ECU,我们定义了五个任务和两个中断服务,分别是输入转换任务(TskInTrans)、输出转换任务(TskOutTrans)、延时处理任务(TskDly)、输出驱动任务(TskOutput)和发送任务(TskCANSend),中断服务包括输入中断服务(ISPIn)和CAN接受中断服务(ISPCAN),而对于主ECU,还需一个规则处理任务(TskRule)。为
6、了实现任务间以及中断和任务间的通讯,定义了四个邮箱和一个延时数组,分别是输入转换邮箱(MailInTrans)、输出转换邮箱(MailOutTrans)、输出邮箱(MailOutput)、发送邮箱(MailCANSend)及延时数组ArrDly,对于主ECU还需增设规则处理邮箱(MailRule),这里的消息被定义成一个二元组(Val,ID),ID编号,Val为状态值,而延时数组的每个元素还包括一个延时字段是个三元组。主ECU的各个任务以及和中断服务间的通讯关系如图3。图3主ECU各任务及中断通讯间的关系图中的延时数组用虚框表示,它类似于消息邮箱,与邮箱中的消息相比,还包括一个延时的时间字段
7、,另外在往延时数组中放入消息时,它不会产生任务调度。延时数组中的延时消息来自于输出转换任务和规则处理任务,延时任务定时执行,它每隔一个时间单位,例如20ms,查询一下延时数组,并将非空的元素的时间节拍减一,如果时间节拍为0,则根据Type字段,将其放入规则邮箱或输出转换邮箱。对于总线中断服务程序,主ECU和子ECU的处理方式稍微有的不同,对于主ECU,它将总线上来的消息送到规则处理邮箱而子ECU则将其放入输出转换邮箱;而对于发送的任务,主ECU的消息来自于规则处理任务,子ECU的发送消息来自于输入转换任务。采用邮箱进行消息传递的并利用查表方法进行逻辑判断,转换任务和规则处理任务流程很类似,限
8、于篇幅,这里仅给出输入转换任务的流程图和示意性代码,另外,对于CAN及输入输出的驱动程序,与具体的硬件有关,这里也不在赘述。输入转换任务的示意性代码如下(基于KeilC编写):voidTskInTrans()reentrant{StrYzMsg;定义一个消息变量for(;;){Msg=(StrYz*)MsgPend(MailInTrans);//等待输入转换邮箱的消息sg->ID);从当前规则开始,以消
此文档下载收益归作者所有