用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

μC/OS-II的多任务信息流与CAN总线驱动

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:31:09
由SJA1000控制器逐个取出往外发。从CAN口接收数据时,往往等收到若干个字节后才需要CPU进行处理,所以这些预收的数据可以先存于缓冲区。缓冲区可以设置收到若干个字节后再中断CPU,这样避免了因为CPU的频繁中断而降低系统的实时性。
javascript:window.open(this.src);" style="cursor:pointer;"/>
  在对缓冲区读写的过程中,经常会遇到想发送数据时,发送缓冲已满;想去读时,接收缓冲却是空的。对于用户程序端,可以采用查询工作方式,即放弃无法读写的操作,然后再频繁地去尝试这个操作直到成功,这样程序效率显然降低。如果引入读、写两个信号量分别对缓冲区两端的操作进行同步,问题将迎刃而解。用户任务想写但缓冲区满时,在信号量上睡眠,让CPU运行别的任务,待ISR从缓冲区读走数据后唤醒此睡眠的任务;类似地,用户任务想读但缓冲区空时,也可以在信号量上睡眠,待外部设备有数据来了再唤醒。由于μC/OS-II的信号量提供了超时等待机制,CAN口当然也具有超时读写能力。

  带缓冲和信号量的CAN口接收和发送部分见本刊网络补充版(http://www.dpj.com.cn)。

  接口函数总结如下。

void CanInitHW(UI segment,BYTE irq0,BYTE IRQ1)

/*设置SJA1000控制器端口中断向量*/

int canReleaseHW() /* 清除SJA1000控制器端口中断向量*/

int canSendMsg( CANBYTE port, MSG_STRUCT msg)

/* 向定制SJA1000控制器端口发送数据*/

int canReceiveMsg( CANBYTE port, MSG_STRUCT msg_ptr)

/*从定制SJA1000控制器端口接收数据

int canConfig( CANBYTE port, CAN_STRUCT can)

/*初始化和配置SJA1000控制器 */

int canNormalRun( CANBYTE port )

/*设置SJA1000正常(Normal)运行模式 */

int canReset( CANBYTE port )

/* SJA1000控制器端口重新设置,缓冲区置位0xff*/

CANBYTE can0r( CANBYTE addr)

/*读取SJA1000控制器端口0的定制寄存器的值 */

CANBYTE can1r( CANBYTE addr)

/*读取SJA1000控制器端口1的定制寄存器的值 */

接收和发送数据缓冲区数据结构定义:

typedef struct {

INT16U RingBufRxCtr; /* 接收缓冲中字符数目 */

OS_EVENT RingBufRxSem; /* 接收信号量 */

INT8U RingBufRxInPtr; /* 接收缓冲中下一字符的写入位置 */

INT8U RingBufRxOutPtr; /* 接收缓冲中下一待读出字符的位置 */

INT8U RingBufRx[CAN_RX_BUF_SIZE]; /* 接收环形缓冲区*/

INT16U RingBufTxCtr;

/* 发送缓冲中字符数目 */

OS_EVENT *RingBufTxSem; /* 发送信号量 */

INT8U *RingBufTxInPtr;

/* 发送缓冲中下一字符的写入位置 */

INT8U *RingBufTxOutPtr;

/* 发送缓冲中下一待读出字符的位置 */

INT8U RingBufTx[CAN_TX_BUF_SIZE]; /* 发送环形缓冲区*/

} CAN_RING_BUF;

结 语

  本文是在嵌入式计算机技术领域的应用背景下提出的,整个工程开发结束以后,系统正常运作时间超过27天。希望本文的提出对开发嵌入式操作系统的技术人员能有所帮助,同时也希望同一领域的开发人员共同探讨、共同发展。



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

Tags:

作者:佚名

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

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:3,843.75000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号