首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
μC/OS-II的CAN驱动程序设计
来源:本站整理  作者:佚名  2011-04-08 09:32:27



    其中,RI_DATA为定义的结构体CAN_MSG变量;CANlRFS、CANlRID、CANlRDA和CANlRDB分别为CAN控制器存储接收报文帧信息、标识符、数据字节的寄存器。CAN_MSG结构体如下所示:

5g.jpg

5.1.2 发送中断
    当发送中断处理函数通过TX_CNT判断出报文发送函数的消息队列中有待发送报文时,通过函数OSSemPost(CAN_TX_OVER)向其发送信号量,通知其可以发送报文了。若TX_CNT为0,说明消息队列中没有待发送的报文,则不发送信号量。
5.1.3 总线错误中断
    CANl BEI HANDLE()通过查询中断和捕获寄存器来判断是何种错误类型,并将它记录下来以便于系统诊断。
    由于CANl_RI_HANDLE()和OSSemPost()都可能就绪等待中的任务,所以为了保证系统能够严格按照优先级来执行任务。程序采用OSIntEx-it()函数进行中断级任务切换,在执行完中断服务程序后运行一个具有最高级别的任务,而不是返回被中断的任务。
5.2 应用层面临的问题及解决方法
    下面将结合应用层面临的实际问题,对报文处理和报文发送函数进行详细阐述。
    ①CAN节点将CAN中断设为FIQ中断,而其他中断设为不同优先级的IRQ中断。由于FIQ中断能够打断IRQ中断,所以节点在任何情况下都能尽快地响应CAN中断,提高了系统的实时性。
    编写的CAN中断服务程序应该越短越好,在不影响系统性能的情况下尽量将中断服务任务放到中断服务程序外执行,以便尽早退出FIQ中断模式,从而使节点能够响应新的中断,减少系统中的中断延时。其中,接收中断处理是最占用节点资源的,它不仅需要根据I-CAN协议对报文进行解析,还需要执行报文指定的功能,所以必须放到中断服务程序外执行。解决的办法是,通过μC/OS-II中的OSTaskCreate()函数建立一个报文处理任务,这个任务由一个请求消息队列函数OSQPend()和一个报文解析处理函数组成。报文处理函数如下:

5h.jpg

    如果需要发送CAN报文,首先要查询是否有可用的发送缓冲区:若有则可用就直接发送,无须通过消息队列作为中介,从而提高程序运行效率;若都被锁定,则调用OSQPost()将报文发送到报文发送函数的消息队列MESSAGE_TX中,并执行TX_CNT++操作。
    ②在繁忙的CAN网络中,节点可能会由于仲裁丢失而无法及时将数据传输,因此必须要对待发送的数据进行存储,等待节点获得总线使用权时再发送出去。LPC2368的CAN控制器有一个三态发送缓冲区,最多能够存储3个报文。若3个缓冲区都处于锁定状态(报文正在等待发送或正
处于发送过程),而又有一个报文需要发送,则需要额外的缓冲区先将它存储起来,以待节点获得总线使用权时再发送。
    定义一个指针数组,把建立的消息数据缓冲区的首地址存入这个数组中,然后再调用OSQCreate()函数来创建一个用于存储发送报文的消息队列MESSAGE TX,最后通过OSTaskCreate()函数建立一个负责发送报文的任务。该任务由一个请求消息队列函数OSQPend()和一个请求信号量函数OSSemPend()组成。报文发送函数如下:

5i.jpg

    其中,变量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()函数也应该做出相应的修改。修改之后的程序代码如下所示:

5i.jpg

    再结合CAN链路层的仲裁机制,就可以保证优先级别高的节点优先发送报文,并被接收节点优先处理。至此,CAN驱动程序的整个脉络已经非常清晰,其总体流程略——编者注。

结语
    本文基于μC/OS-II操作系统、针对实时性要求较高的CAN系统编写的CAN驱动程序简洁、高效,在不同的应用环境下只需添加相应的用户代码,就可以组成完整的CAN驱动程序。但在提高高优先级节点实时性的同时,在一定程度上也降低了低优先级节点的实时性,所以在工程应用中应根据实际需要兼顾高低优先级节点的实时性能。
 

上一页  [1] [2] [3] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:223,914.10000 毫秒