基于μC/OS-II实时系统的CAN总线远程通信模块设计
区已满;想去读的时候,接受缓冲却是空的。对于用户程序端,采用传统的查询工作方式,频繁的读取使得程序效率大为降低。如果引入读、写两个信号量分别对缓冲区两端的操作进行同步,问题自然解决:用户任务想写但缓冲区满时,在信号量上休眠,让CPU运行别的任务,待ISR从缓冲区读走数据后唤醒这个休眠的任务;类似的,用户任务想读但缓冲区空时,也可以在信号量上休眠,待外部设备有数据来了再唤醒。其中,μC/OS-II的信号量提供了超时等待机制,CAN端口本身也有超时读写能力。
接受和发送的数据缓冲区数据结构定义如下:
typedef struct {
INT16U BufRxCtr; //接受缓冲中的字符的数目
OS_EVENT BufRxSem; //接受信号量
INT8U BufRxInPtr; //接收缓冲中下一个字符的写入位置
INT8U BufRxOutPtr; //接收缓冲中下一个待读出字符的位置
INT8U BufRx[CAN_BUF_SIZE]; //接收环形缓冲区的大小
INT16U BufTxCtr; //发送缓冲中字符的数目
OS_EVENT BufTxSem; //发送信号量
INT8U BufTxInPtr; //发送缓冲中下一个字符的写入位置
INT8U BufTxOutPtr; //发送缓冲中下一个待读出字符的位置
INT8U BufTx[CAN_BUF_SIZE]; //发送环形缓冲区的大小
}CAN_BUF;
其他接口函数如下:
Void CanInitHW ( ); //设置CAN控制器端口中断向量
Void CANSendMsg ( ); //向CAN控制器端口发送数据
Void CANReceiveMsg ( ); //从CAN控制器端口接受数据
图3 基于缓冲队列的CAN通信过程
基于缓冲队列支持下的CAN通信任务通信过程如图3所示。
在该通信任务中,采用查询方式发送,中断方式接收,任何时候只要没有关中断,中断任务的优先级高于其他任何任务。可以说,该任务是“基于中断响应”的。这样处理的好处是能够最大的保证了通信的实时性,同时也使得系统资源的利用率大大提高(相比于收发都采用查询的方式)。任务间的通信和同步通过邮箱和信号量机制进行。
当用户应用程序(或任务)要求进行远程CAN通信的时候,应用程序(或任务)先要获得BufTxSem并向发送缓冲区BufTx装入报文,写入缓冲区结束后释放信号量BufTxSem,通过邮箱通知CAN通信任务处理报文并完成报文的发送。
当总线发来报文时,接受节点的CAN控制器会产生一个接收中断,当前运行任务被挂起,CAN通信任务被激活并抢占运行,获取信号量BufRxSem,然后从总线上读取报文并写入缓冲区 ,写入结束后释放信号量BufRxSem,并通过邮箱通知相应的用户应用程序(或任务);应用程序(或任务)通过获得信号量BufRxSem从缓冲区内读取相应的报文信息。
(3) μC/OS-II的中断任务的处理
在μC/OS-II中,中断服务程序一般用汇编语言来写。以下是中断服务程序的示意代码:
Void UserISR( void ) {
保存全部CPU寄存器;
调用OSIntEnter或OSIntNesting直接加1;
执行用户代码做中断服务;
调用OSIntExit;
恢复所有CPU寄存器;
执行中断返回指令;
}
μC/OS-II提供了两个ISR与内核的接口函数:OSIntEnter和OSIntExit。OSIntEnter通知内核中断服务程序开始运行了,并把一个全局变量OSIntNesting加1。此中断嵌套计数器可以确保所有中断处理完成后再作任务调度。另一个接口函数OSIntExit则通知内核,中断服务已结束。根据相应情况,返回被中断点(可能是一个任务或者被嵌套的中断服务程序)或由内核作任务调度。
用户编写的ISR必须被安装到某一位置,以便中断发生后,CPU根据相应的中断向量运行准确的服务程序。许多实时操作系统都提供了安装、卸载中断服务程序的API接口函数,有些成熟的RTOS甚至对中断控制器的管理都有相应的API函数。但 μC/OS-II内核没有提供类似的接口函数,需要用户在对应的CPU移植中自己实现。在DSP2407中,我们可以在设计中断向量表的时候把用户的中断入口写好,这样一旦CAN通信接受中断发生时,DSP2407就能自动从中断向量表里读取相应的程序入口,进而跳转执行用户的ISR程序。
结束语
基于RTOS平台上开发用户的应用程序,便于在实时操作系统内核下实现多任务处理,可以大大缩短产品开发周期,进一步提高应用程序的可移植性和可维护性。基于本文原理开发的应用于集散式数据采集系统的CAN总线远程通信构件具有良好的可扩充性和移植性,对各种实际现场情况能够进行灵活的配置和设定,真正实现了通信模块驱动程序的封装。
- 基于GPS的数据采集系统的研究(01-15)
- 无线射频识别技术在规模化奶牛场的应用(05-14)
- 瑞风智能一卡通社区解决方案(05-15)
- 短波发射机自动功率控制异常波形采集系统设计(08-29)
- 简易数字存储示波器的设计(07-24)
- 基于RFID技术的核心物品实时监控管理系统(05-31)