基于LPC2119和μC/OSII 的CAN中继器设计
该尽可能使之接近实际的需求量。栈空间的大小不仅要计算任务本身的需求(局部变量、函数调用等) ,还需要计算最多中断嵌套层数(保存寄存器、中断服务程序中的局部变量等)。内核的另一个应该具有的特性是,每个任务所需的栈空间大小可以分别定义。所有内核都需要额外的栈空间,以保证内部变量、数据结构、队列等。如果内核支持中断用栈分离,则总的RAM需求量的表达式为:RAM总需求=应用程序RAM 需求+内核数据区RAM需求+各任务栈需求的总和+最多中断嵌套栈需求。
除非有特别大的RAM空间可以使用,对栈的分配与使用均要特别小心。实时多任务系统比前后台系统需要更多的代码(ROM) 和数据空间(RAM) 。额外的代码空间取决于内核的大小,而RAM的用量则取决于系统中的任务数。
(2) 实时性和安全性
CAN中继器是系统组网的关键设备之一,在稍大型的CAN总线系统中经常会用到中继器。它给系统组网带来方便的同时,也给系统增加了一些存储转发时延,因此在软件设计中必须考虑系统的实时性,尽量缩短数据的存储转发时间。这除了要求给系统数据转发任务分配较高的优先级之外,还应建立一种通信机制,保证在收到一路总线上的数据时,能即时向另一路总线发送。另外,中继器是两路总线之间通信的桥梁,为了保证两路总线之间正常的通信,应尽量避免类似死锁、总线故障之类的情况发生。所以系统必须设计一个监控任务,能对这类情况作出即时反应,同时为了不丢失还未转发的数据,必须为每一路总线设置一环形缓冲区,用于存放新接收到的数据,维护系统的安全性。
2.3 系统设计实现
嵌入式CAN中继器主要实现两路CAN总线数据之间相互转发,并且可以根据实际需要,改变某一路CAN控制器的波特率。采用μC/OSII实时操作系统,整个设计由操作系统和一系列用户应用程序构成。
主函数是程序首先执行的一个函数。该函数永远不会返回,主要实现系统的硬件和操作系统的初始化。硬件包括中断、键盘、显示等初始化;操作系统包括任务控制快和事件控制快的初始化,而且在启动多任务调度之前,必须至少创建一个任务。在此系统中创建了一个启动任务,主要负责时钟的初始化和启动,中断的启动,CAN控制器的初始化及启动及任务的划分等。在交出CPU的使用权之后,只做一些空闲处理。
(1) 任务的划分
要完成实时多任务的各种功能,必须对任务进行划分。本程序根据各个任务的重要性和实时性,把程序分成六个具有不同优先级的任务,包括系统监控、数据转发、键盘输入、LED显示、接收队列监视和波特率设置。表1为任务划分表。
除了6个主要应用任务之外,还有两个中断服务子程序:一个时钟节拍中断,用于提供周期性信号源;一个CAN接收中断,用于把接收数据写入环形缓冲区。

(2) 任务的同步与调度
通常多任务操作系统的任务不同于一般的函数,它是一个无限循环,而且没有返回值。如果没有更高优先级的任务进入就绪态,当前任务是不会放弃对CPU的使用权的。为了实现操作系统的正常运行和有关事件的同步,必须正确处理任务间的通信和事件标志的设置。整个系统的功能结构如图2所示。

图2系统功能结构
各个任务具有不同的优先级,通过调用系统挂起函数或延时函数,可以启动具有更高优先级的进入就绪态的任务。在嵌入式CAN中继器的设计中,通过对延时参数的设置,系统每隔一定的时钟节拍,就启动接收队列监视任务,定期扫描环形缓冲区。一旦发现读指针与写指针不相等时,就将环形缓冲区中新接收到的数据存入TEMPBUF中,同时发送信号量SendSem。数据转发任务接收到信号量,启动运行,完成数据转发功能。
数据转发任务如下:void CANDATA_ExchangeTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3/* 给CPU状态寄存器分配存储器*/
OS_CPU_SRcpu_sr;
#endif
INT8U err;
pdata=pdata;/*避免编译器警告*/
for(;;) {
OSSemPend (SendSem,0,err);/*等待发送信号量,若无信号则将本函数挂起,并启动其他任务,如系统监控或键盘输入或LED显示等*/
if (CANNUM == CAN1) {/*判断是哪一路总线接收到数据,如是CAN1,则向CAN2发送数据*/
ToSendData (TEMPBUF,FORTXBUF );/*将存放在TEMPBUF中的数据转换成可用于发送的数据格式,存放在FORTXBUF中*/
CanSendData (CAN2,0x00,FORTXBUF);/*向另一路总线发送数据*/
}
else {
ToSendData (TEMPBUF,FORTXBUF );
CanSendData (CAN1,0x00,TXBUF);
}
}
}同样,其他模块功能——波特率的设置、系统的监控、信息的显示等,也是通过任务间的通信—信号量的传递来实现的,以此来保证时间与任务的同步。
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
