• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 无线通信 > 技术文章 > 基于μC/OS-II实时系统的CAN总线远程通信模块设计

基于μC/OS-II实时系统的CAN总线远程通信模块设计

录入:edatop.com     点击:

4. 基于缓冲队列支持下的CAN总线驱动程序设计

驱动程序是连接底层的硬件和上层的API函数的纽带,有了驱动程序模块,就可以把操作系统的API函数和底层的硬件分开来。任何一个硬件的改变、删除或者添加,只需要随之改变、删除或者添加提供给操作系统的相应的驱动程序就可以了,并不会影响到API函数的功能,更不会影响到用户的应用程序。同时,为了保证在实时多任务操作系统中,对硬件访问的唯一性,系统的驱动程序要受控于相应的操作系统的多任务之间的同步机制。

(1) μC/OS-II的通信机制

μC/OS-II在处理任务之间的通信和同步的时候,主要通过以下几种方式:信号量(Semaphore),邮箱(Mailbox),消息队列(Queue)和互斥信号量(Mutex)。具体的通过事件控制块(ECB)来实现。μC/OS-II中定义的数据结构OS_EVENT能够维护任务间通信和同步的所有信息,该数据结构不仅包含了事件本身的定义,如信号量的计数器、指向邮箱的指针、指向消息队列的指针数组、互斥量中能否获得资源的Flag和正在使用该互斥量的任务,还定义了等待该事件的所有任务列表。事件发生后,等待的优先级最高的任务进入就绪态。

(2) 缓冲队列的设计和通信任务的配合

在微机系统中,一般串行设备或者其他字符型设备都存在外设处理速度和CPU速度不匹配的问题,所以需要建立相应的缓冲区。向CAN口发送数据时,只要把数据写到缓冲区,然后由CAN控制器逐个取出往外发送。从CAN口接收数据时,往往等收到若干个字节后才需要CPU进行处理,所以这些预收的数据可以先存在缓冲区。缓冲区可以设置收到若干个字节后再中断CPU,这样就避免了因为CPU的频繁中断而降低系统的实时性。

在对缓冲区读写的过程中,经常会遇到想发送数据的时候,缓冲区已满;想去读的时候,接受缓冲却是空的。对于用户程序端,采用传统的查询工作方式,频繁的读取使得程序效率大为降低。如果引入读、写两个信号量分别对缓冲区两端的操作进行同步,问题自然解决:用户任务想写但缓冲区满时,在信号量上休眠,让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通信过程

来源:维库开发网

上一篇:用FIFO实现DSP间的双向并行异步通讯
下一篇:基于FPGA和SMT387的SAR数据采集与存储系统

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图