微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > 基于μC/OS-II实时系统的CAN总线远程通信模块设计

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

时间:09-14 来源:互联网 点击:

引言

应用实时多任务操作系统(RTOS)作为嵌入式设计的基础和开发平台将成为嵌入式应用设计的主流。μC/OS-II是一种源码公开、可移植性、可固化、可裁剪、占先式的实时多任务操作系统,目前已经得到广泛的应用。

在为电力系统接地选线装置开发的数据采集监测系统的设计中,笔者设计了集散式的数据采集结构,灵活的组态适应了目前国内多数中低压输配电网的数据采集需求。在此硬件平台上,笔者将实时操作系统μC/OS-II移植到TMS320LF2407A型号的DSP上,实现了多任务的并行执行,系统的可靠性和实时性得到大幅提升;设计了CAN总线驱动程序,使得下位采集处理模块与上位的主控制器具备了可靠快速的通信功能和协调功能。

1. 集散式的数据采集系统设计

系统的整体结构如图1所示:

图1 集散式选线系统整体结构

图中反映出目前变电站常见的网络结构。一般的基于集中式数据采集方式在应用上存在一定的缺点,比如针对不同变电站实际情况配置不够灵活等。而基于集散式的数据采集系统却具有系统适应能力强,组态方便,可靠性高等优点。因此,根据变电站网络的这种结构,本装置设计采用集散式数据采集的方式,即在每条支路上均挂接一个独立的智能数据采集及处理模块负责实时采集和数据预处理;主控制器与各智能采集处理模块通过CAN现场总线进行通讯,从而不仅实现主控的功能,还具备灵活的集散扩充性能。

2. CAN总线接口的设计

在各种现场总线网络中,最早为汽车电子设备互连而开发的CAN总线由于其简单灵活的配置以及强大的实时控制和检错纠错能力而在诸多自动化领域中得到了广泛的使用。

美国TI公司DSP产品线中的2000系列是专为工业控制应用设计的数字信号处理器,具有强大的数字信号处理能力,还集成了丰富的外设和I/O,成为现代电机控制、电力系统自动化等应用中很好选择。在这款DSP处理器上,自带了兼容CAN2.0B标准的CAN总线控制器,因此只需外接一片CAN总线收发芯片即可使模块具有完整的CAN总线通信能力,在此使用支持1M bps的PCA82C250收发器芯片,接口设计见图2。

图2 采集模块CAN总线接口

3. μC/OS-II在2407上的移植

绝大部分μC/OS-II的源码是用移植性很强的ANSI C写的,只有和微处理器硬件相关的那部分是用汇编语言写的。而TI公司提供的编译器Code Composer Studio (C2000) V2.20支持C语言和汇编语言开发,笔者在此编译器的基础上完成了μC/OS-II的移植。移植工作主要集中在三个文件的修改工作:修改头文件OS_CPU.H相关的内容,包括:数据类型定义、堆栈增长方向、中断相关的一些宏定义等;OS_CPU_C.C中编写任务堆栈初始化函数及系统HOOK函;OS_CPU_A.ASM中编写四个汇编语言函数:OSStartHighRdy(), OSCtxSw(), OSIntCtxSw()和OsTickISR()。

具体移植过程由于不是本文重点,恕笔者不再详述。

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的频繁中断而降低系统的实时性。

在对缓冲区读写的过程中,经常会遇到想发送数据的时候,缓冲

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top