μC/OS-II的CAN驱动程序设计
文的任务。该任务由一个请求消息队列函数OSQPend()和一个请求信号量函数OSSemPend()组成。报文发送函数如下:
其中,变量TX_CNT记录MESSAGE_TX中的报文数目。任务向MESSAGE_TX发送一个报文,TX_CNT就加1;报文发送函数成功发送一个报文,TX _CNT就减1。这样,中断服务程序就可以根据TX_CNT来判断是否有向CAN_TX_OVER发送信号量的必要,减少了不必要的冗余操作。
除非在CAN节点任务中有比将处理好的CAN报文发送出去更重要的任务要做,一般来讲,报文发送任务在节点任务中应该具有最高的优先级,以保证CAN系统的实时性。
③LPC2368的最高运行速率可达72 MHz,而CAN最高传输速率为1 Mb/s。一般情况下,即使连续接收到2个报文,CPU也完全有能力在接收完第、2个报文前将第1个报文处理完毕,所以只需要建立一个报文处理任务。
还有些要完成较复杂任务的节点,譬如车载网络中的中央控制部件(BSI)。在全CAN车载网络中,它同时连接内部网、车身网和舒适网3个网络。作为汽车车载网络系统中枢,BSI任务繁重,对CAN报文的处理经常会被各种中断和内部任务打断,所以不能保证及时处理上一次接收的CAN报文。另外,由于消息队列是采取先进先出(FIF0)或者后进先出(LIFO)的方式来组织报文的,当消息队列中积攒多个还没处理的报文时,无法先取出优先级最高的报文进行处理。为了能够优先处理重要设备发送过来的报文,必须针对系统中每个与本节点有进行CAN通信关系的节点建立一个独立的报文处理任务。这个任务包含一个独立的消息队列,并且发送报文的节点优先级越高,该任务设置的优先级也应该越高。为此CANl_R1_HANDLE()函数也应该做出相应的修改。修改之后的程序代码如下所示:
再结合CAN链路层的仲裁机制,就可以保证优先级别高的节点优先发送报文,并被接收节点优先处理。至此,CAN驱动程序的整个脉络已经非常清晰,其总体流程略--编者注。
结语
本文基于μC/OS-II操作系统、针对实时性要求较高的CAN系统编写的CAN驱动程序简洁、高效,在不同的应用环境下只需添加相应的用户代码,就可以组成完整的CAN驱动程序。但在提高高优先级节点实时性的同时,在一定程度上也降低了低优先级节点的实时性,所以在工程应用中应根据实际需要兼顾高低优先级节点的实时性能。
- 基于μC/OS-Ⅱ的线控转向FlexRay通信控制(05-24)
- 基于CAN总线的数据采集与控制系统设计(05-10)