3.2 系统构成
嵌入式网关的功能主要是进行以太网数据报文和CAN 数据帧之间的协议转换,实现以太网和CAN 总线的互连;其次是根据应用环境,通过人机交互接口改变网关的IP 地址和CAN 总线的波特率。整个嵌入式系统的构成如图3 所示。在进行任务设计之前的前期工作有:
① 实时操作系统的移植。μC/OS-II 可以在绝大多数8 位、16 位、32 位、以至64 位微处理器、微控制器、数字信号处理器(DSP)上运行。μC/OS-II 在LPC2292 上的移植可参考文献[1]。
② TCP/IP 协议和CAN 协议的嵌入。由于μC/OS-II 操作系统只包含了实时内核、任务管理、时间管理、任务间的通信同步(信号量、邮箱、消息队列)和内存管理等功能,所以用户必须根据自己的需要添加一些功能模块。网关的设计将TCP/IP 和CAN 协议嵌入到操作系统中,并提供一些API 接口函数供用户调用。
3.3 系统实现
采用RTOS 使整个设计简单且易调试,各个任务相互独立,而且各个任务具有不同的优先级可以保证紧急任务及时响应,从而能有效地对任务进行调度。系统软件设计由操作系统和一系列用户应用程序构成。 主函数是程序首先执行的一个函数。该函数永远不返回,主要实现系统的硬件(包括中断、键盘、显示等)和操作系统(包括任务控制块、事件控制块)的初始化,而且在启动多任务调度之前,必须至少创建一个任务。在本系统中创建了一个启动任务,主要负责时钟的初始化和启动、中断的启动、CAN 控制器的初始化与启动、端口与IP 地址的初始化和RTL8019 的初始化与启动,并且对各个应用任务进行了划分。在交出CPU 的使用权之后自做一些空闲处理。
3.3.1 任务的划分
要完成多任务系统的各种功能必须对任务进行划分。本程序根据各个任务的重要性和实时性,把整个模块分成7 个具有不同优先级的应用任务:系统监控、CAN 数据发送、键盘扫描、以太网数据发送、协议转换、LED显示、系统配置等。表1 所示为任务划分表。
表1 任物划分表
除了7 个主要应用任务之外,还有两个中断服务子程序:一个时钟节拍中断,提供周期性信号源;另一个接收中断,把接收到的数据写入缓冲区。
3.1.2 任务的具体实现任务划分后,各任务具有独立的堆栈空间,彼此争夺CPU 的使用权。一旦获得CPU 的使用权,就会独立运行而完成特定的功能。
CAN 总线通信模块包括数据传输和总线管理两个部分。数据传输实现的功能有CAN 初始化、CAN 报文发送和CAN 报文接收。CAN 初始化及报文的接收在启动任务与中断服务程序中实现,CAN 报文发送和总线管理作为一个单独的任务独立运行。总线管理功能块实现的主要是总线检测,判断一路总线是否良好。如果不是,就进入另一路总线检测;如果冗余总线良好,就采用冗余总线通信。CAN 数据发送任务需要系统调度器通知是否有待发送数据进入发送队列,任务的实现如图4 所示。
图4 数据发送任务实现图
以太网通信模块由以太网数据收发功能块和数据协议管理功能块构成。数据的收发功能块主要实现RTL8019 的初始化、数据报文的发送与接收。同理,RTL8019 的初始化在系统的启动任务中实现。数据的接收在RTL8019 的中断服务程序中实现。数据协议管理主要实现对接收数据报文的解析,以及给待发送数据添加协议报头。以太网数据发送与协议管理分别作为独立任务运行。
以太网数据发送任务同样需要系统调度器通知发送队列中是否有待发送的数据。若没有数据发送,则将 该任务挂起,系统运行其他任务。以太网数据发送任务通过对RTL8019 的操作完成,根据RTL8019 的状态,将发送队列中数据通过DMA 传送到8019 的发送缓冲区启动发送,并根据发送结果,对发送队列指针进行调整。
以太网协议管理即协议转换任务在用户数据与8019 驱动需要的数据报文之间进行协议转换。TCP/IP 协议为应用层、传输层、网络层和数据链路层等4 层模型,每层具有不同的功能,并对应相应的子协议,而且层与层之间在逻辑上是相互独立的。在编程时,可以直接调用嵌入的TCP/IP 协议的API 函数对数据报文进行分层。该任务对从8019 传过来的数据处理示意图如图5 所示。不同的子协议具有不同的功能号,任务根据功能号对协议进行区别。把用户数据传递给8019 驱动的示意图是图5 的逆序表示。
图5 协议转换任务的数据处理的示意图
3.3.3 任务间的同步与调度
通常多任务操作系统的任务不同于一般的函数,它是一个无限循环,而且没有返回值。如果没有更高优先级的任务进入就绪态,当前任务是不会放弃对CPU 的使用权的。为了实现操作系统的正常运行和有关事件的同步,必须正确处理任务间的通信和事件标志的设置。整个系统的功能结构如图6 所示。
图6 系统运行示意图
各个任务具有不同的优先级,通过调用系统挂起函数或延时函数可以启动具有更高优先级的进入就绪态的任务。高优先级的任务,例如1、2、3、4 号任务,往往由于申请某个资源而发生阻塞,进入挂起态。系统调度器启动低优先级的任务,通过对延时参数的设置,每隔一定时钟节拍就启动键盘扫描或LED 显示任务。如果其中有任何一事件发生就启动相关的任务,这个过程通过信号量的通信机制来实现。对每一个事件分配一个信号量,一旦事件发生就启动信号量的等待任务列表中进入就绪态的任务,从而保证任务与事件的同步。
4 结束语
在嵌入式硬件平台的基础上,用μC/OS-II 实时操作系统开发应用程序有其独到之处,用户可以直接利用系统的接口函数编写自己的应用程序,毋需另行开发,大大方便了用户编程,缩短了软件的开发周期,提高了开发效率;基于ARM LPC2292 CAN 总线和以太网间的网关,在实验调试过程中运行状况良好,工作稳定。