基于提高CAN总线组网能力的考虑,提出一种新颖的CAN中继器设计方法;阐述以LPC2119控制器为核心的硬件设计方案;详细分析在μC/OSII实时操作系统下的软件实现过程;针对中继器的实时性和安全性以及总线与总线之间可能存在的速度不匹配的问题,确立提升紧急任务优先级、建立相关事件标志、合理地对事件与任务进行同步的改进方法,从而有效地解决组网中最远传输距离和最大节电数限制的问题。 引 言 CAN总线的直接通信距离只有10 km左右,而且由于收发器驱动能力的限制,总线上最多只能挂110个节点,给系统组网带来一定的困难。CAN中继器就是为了解决这个问题而设计的。由于中继器具有数据转发功能,不仅可以扩大通信距离,还可以增加节点的最大数目。对CAN中继器初始化参数进行设置,可以在不同的网段内采用不同的通信速率,还可以对报文进行过滤,减轻总线负担。
1 CAN中继器的硬件设计 1.1 微控制器LPC2119简介
CAN中继器是以ARM微控制器LPC2119为核心的软硬件系统。LPC2119是Philips公司生产的一款基于支持实时仿真和跟踪的16/32位ARM7TDMISMCU,带有128 KB嵌入的高速Flash存储器。独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30 %,而性能的损失却很小。LPC2119内部集成2个CAN控制器。它的主要特性有:单个总线上的数据传输速率高达1 Mb/s;32位寄存器和RAM访问;兼容CAN 2.0B, ISO 118981规范;全局验收滤波器可以识别所有的11位和29位Rx标识符;验收滤波器为选择的标准标识符提供Full CANstyle自动接收。 1.2 LPC2119内部CAN控制器与SJA1000比较 LPC2119内部集成的CAN控制器与Philips公司的SJA1000 CAN控制器相比较大致相同,只是在验收滤波这一环略有不同,这为习惯SJA1000的开发人员采用LPC2119提供了方便。SJA1000验收滤波器由验收代码寄存器和验收屏蔽寄存器定义,要接收报文的位模式在验收代码寄存器中定义,相应的验收屏蔽寄存器允许定义某些位为“无关”,通过模式寄存器可以选择不同的过滤模式:单过滤模式和双过滤模式。 而对LPC2119内部集成的CAN控制器,全局验收过滤器包含一个512×32(2 KB)的RAM,通过软件处理,可在RAM中存放1~5个标识符表格,整个RAM可容纳1024个标准标识符或512的扩展标识符或两种类型混合的标识符。同时有5个地址寄存器指向验收过滤器RAM的表格:Full CAN标准地址,标准单个地址,标准地址范围,扩展单个地址或扩展地址范围。当CAN控制器的接收端已接收到一个完整的标识符时,它将通知验收过滤器,验收过滤器响应这个信号,并读出控制器编号、标识符尺寸,以及来自控制器本身的标识符,然后通过验收过滤器搜索RAM中的表格,以决定接收或放弃这一帧信息。 1 .3 CAN中继器硬件结构 中继器的硬件结构框图如图1所示。LPC2119分别通过CAN总线收发器与两路总线相连;总线驱动器采用带隔离的DC/DC模块单独供电,不仅实现了两路CAN接口之间的电器隔离,也实现了中继器与CAN总线的电器隔离。除此之外,还有LED显示和键盘接口。LED用于显示中继器的工作状态,键盘用来修正总线的波特率。最终程序的调试与跟踪通过JTAG调试口完成。
图1硬件结构框图
2 系统软件设计 2.1 引入μC/OSII实时操作系统 随着应用的复杂化,采用传统前后台设计方法,会显得过于复杂,实时性得不到保证,而且容易发生死锁。解决这些问题的最好方法就是采用实时操作系统。 μC/OSII完全是占先式的实时内核, 是基于优先级的, 即总是让就绪态中优先级最高的任务先运行, 因此实时性比非占先式的内核要好。 它包含了实时内核、任务管理、时间管理、任务间通信同步(信号量、邮箱、消息队列) 和内存管理等功能; 它的绝大部分代码是用C 语言编写的, 可移植性强, 可以在绝大多数8 位、16 位、32 位以至64 位微处理器、微控制器、数字信号处理器(DSP) 上运行。 CAN中继器对系统的实时性和可靠性要求比较高。采用μC/OSII实时操作系统可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应,而且采用实时操作系统,降低了程序的复杂度,方便程序的开发。 2.2 软件设计中需考虑的问题 (1) 使用代码的容量
在前/后台系统的设计中,对存储器容量的需求仅仅取决于应用程序代码,而使用RTOS的情况则很不一样。RTOS 内核本身需要额外的代码空间。
总代码量=应用程序代码+内核代码 每个任务都是独立运行的,必须给每个任务提供单独的栈空间(RAM)。在决定分配给每个任务多少栈空间时,应该尽可能使之接近实际的需求量。栈空间的大小不仅要计算任务本身的需求(局部变量、函数调用等) ,还需要计算最多中断嵌套层数(保存寄存器、中断服务程序中的局部变量等)。内核的另一个应该具有的特性是,每个任务所需的栈空间大小可以分别定义。所有内核都需要额外的栈空间,以保证内部变量、数据结构、队列等。如果内核支持中断用栈分离,则总的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);
}
}
}同样,其他模块功能――波特率的设置、系统的监控、信息的显示等,也是通过任务间的通信―信号量的传递来实现的,以此来保证时间与任务的同步。
结语 μC/OSII实时操作系统在嵌入式硬件平台的基础上,用μC/OSII实时操作系统开发应用程序有其独到之处,用户可以直接利用系统的接口函数编写自己的应用程序,不需另行开发,大大方便了用户编程,缩短了软件的开发周期,提高了开发效率。基于μC/OSII和LPC2119的CAN中继器,在实验调试过程中,运行状况良好,工作稳定。
参考文献
1 Labrosses Jean J. 嵌入式实时操作系统μC/OSII. 邵贝贝等译. 北京:北京航天航空大学出版社,2003
2 周立功,等. ARM微控制器基础与实战. 北京:北京航空航天大学出版社,2003
3 饶运涛,等.现场总线CAN原理与应用技术. 北京:北京航空航天大学出版社,2003
4 Labrosses Jean J. 嵌入式系统构件. 袁勤勇等译. 北京:机械工业出版社,2002
沈跃:研究生,研究方向为计算机网络控制与嵌入式系统。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。