CAN-RS232转换器在实时操作系统RT-Thread上的实现

2012-12-01 10:08宋天楹张红梅
自动化仪表 2012年4期
关键词:开发板缓冲区线程

宋天楹 张红梅 冯 欢

(桂林电子科技大学信息与通信学院,广西 桂林 541004)

0 引言

Bosch公司开发的控制器局域网网络(controller area network,CAN)是国际上应用较为广泛的现场总线之一,由于其具有较高的可靠性和良好的纠错特性,在智能大厦、航空工业、矿山煤场等领域得到了广泛的重视与应用[1-2]。

CAN总线应用一般是针对各种工业现场、汽车内部的低速测量、控制设备等[3]。作为上位机的通用PC机,大部分没有配备CAN接口,一般只提供RS-232接口,而RS-232接口作为传统的工业控制通信方式,在生产生活中仍然大量使用。因此,实现CAN-RS232的通信转换具有重要的实际意义。

当今市场上相关的转换器产品大多数为单一功能的专门设备,考虑到实际应用场合中的通信环境复杂多变,本文采用嵌入式操作系统来实现转换功能,以便进行功能扩展。通过在性能、成本等方面与流行嵌入式系统μC/OS-II、RT-Linux等作比较,决定采用实时操作系统RT-Thread作为系统平台。硬件方面采用以LPC1768为核心的第二代Cortex-M3开发板作为硬件平台来进行设计。

1 系统简介

1.1 系统硬件设计

本文硬件平台采用以NXP公司的LPC1768为核心的开发平台,其MCU是第二代ARM Cortex-M3处理器,操作频率可达100 MHz。ARM Cortex-M3 CPU具有3级流水线和哈佛结构,带独立的本地指令和数据总线,以及用于外设的、性能略低的第三条总线;外设包含512 kB的Flash存储器、64 kB的SRAM、以太网控制器、USB主机/从机OTG接口、8通道的通用DMA控制器、4个UART接口(其中UART3连接 RS-485接口)以及SPI接口等,完全可以实现转换器的功能。系统硬件总体框图如图1所示。

图1 系统硬件总体框图Fig.1 Overall block diagram of system hardware

此开发平台使用的CAN收发器为SN65HVD230;RS-232电平转换器使用常用的MAX3232;开发过程中的程序烧写与调制使用JTAG接口。

1.2 实时操作系统RT-Thread

目前常用的嵌入式实时操作系统有μC/OS-II、RT-Linux、μCLinux、Vxworks等。RT-Linux与 μCLinux的实时性并不尽如人意,一般用于手持设备等应用;Vxworks高额的授权费用令一般的商家与开发者望而却步;针对小型设备设计的μC/OS-II体积小、实时性高,性能较为优秀,而其商用的文件系统组件μc/FS和网络组件μTCP/IP同样价格不菲[4]。考虑到转换器系统的网络化扩展方向,决定采用商用许可授权宽松灵活、源码免费、内核稳定的RT-Thread系统作为转换器的系统平台。RT-Thread与μC/OS-II的相关比较如表1 所示[5]。

表1 RT-Thread与μC/OS-II的相关比较Tab.1 Comparison of RT-Thread and μC/OS-II

RT-Thread作为国内优秀的开源实时操作系统,用C语言实现了非常友好的面向对象程序设计风格。RT-Thread将任务、信号量、接口设备均看作内核对象来进行处理,所有的内核对象从基对象进行派生。基对象派生为线程对象、IPC对象和定时器对象等。其中,在I/O管理模块中,RT-Thread的设备驱动框架从基对象中派生而来,分为字符型设备对象、块设备对象和网络设备对象等。设计风格与Linux的设备管理方式类似,同μC/OS-II等没有设备驱动框架的系统相比,驱动函数的代码结构不会因为开发者的不同而有大的改变,具有非常好的可读性与重用性[6]。RT-Thread系统的最小型配置为8 kB ROM、3 kB RAM。本文采用RT-Thread最近版本rt-thread-0.4.0 beta1来进行开发。此版本在LPC176x分支上已经提供了基本的系统功能以及UART基本驱动、LwIP网络协议栈与文件系统(SD卡)等组件功能[5]。RT-Thread的设备驱动框架为一个名为rt_device的结构体,其中定义了一些基本的关键成员与接口函数,具体如下。

其中,void* user_data为用户的私有数据域。用户可以定义自己的私有数据结构,然后赋值到此指针上,当然也可以在此rt_device对象基础上进行派生。本文采用的是第二种方法。如果实现了rt_device中规定的接口函数,系统就可以利用接口操作函数对接口设备进行初始化、控制与读写等操作[6]。

2 转换器的实现

2.1 CAN接口驱动设计

由上述分析可知,为了在RT-Thread系统上添加CAN通信设备,需要从rt-device对象中派生出CAN设备对象,并且实现 init、open、read、write、close 等接口函数。在rt_device中已经设计了基本的成员变量,只要增加CAN设备的接收缓冲区、读写索引标示、初始化相关参数等即可。转换器设计使用CAN1、CAN2两个接口,这种有多个相同设备的情况下,设备接口函数可以共用一套,而在各自的数据域进行区分。这里使用CAN设备寄存器的基地址来对CAN1、CAN2设备进行区分。

由于CAN总线在短距离上的传输速率最大为1 MB/s,RS-232的波特率大约为15 kB/s,因此两者的速率存在较大差别。为了使通信过程不会因为此差异的影响而产生大量数据成块丢失的现象,这里采用环形缓冲区结构来进行缓解。CAN接口与RS-232接口分别设计环形缓冲区结构来缓存数据,以CAN接口接收环形缓冲区为例,其缓冲区结构如下。

其中rt_CANMsg_t为CAN数据帧的数据结构。CAN设备对象的结构CAN_device设计如下。

要实现设备驱动框架规定的 init、open、read、write、close等接口函数,需把LPC1768通用的CAN接口操作函数,按照RTT-Thread系统中设备操作函数的形式进行改写,这里不一一赘述。特别需要注意的是在注册CAN设备中断处理函数时,需要修改/rt-thread-0.4.0 beta1/libcpu/arm/lpc17xx下的 start_rvds.S 文件中关于CAN中断服务处理函数的行,把中间项改为用户定义的中断服务处理函数名即可。

2.2 RS-232接口驱动设计及转换流程

RT-Thread在LPC176x下的分支已经把UART的基本驱动写好,不过只是简单支持单一串口的驱动。与CAN总线多设备驱动的方法类似,在rt_uart_lpc结构中加入寄存器基地址等成员变量,便可实现同时使用UART0、UART1两个串口的功能。以CAN为接收协议为例,其转换流程如图2所示。

图2 CAN接收过程流程图Fig.2 Flowchart of CAN receiving process

实现CAN-RS232间的透明通信,实际上就是实现RS-232数据帧与CAN数据帧的无缝连接。为了方便转换,参照CAN数据帧的格式,定义RS-232帧的数据结构如下(RS-232应用层的数据结构可由用户自定义)。

这样,flag、CID、data域即可形成一个完整的CAN协议帧。在用户的应用线程里,通过RT-Thread设备控制函数,利用环形缓冲区直接进行数据的转发即可[4]。

2.3 RT-Thread 线程设计

RT-Thread的用户应用程序入口在application.c文件的rt_application_init()中,在这个函数里,系统进行基本线程的创建并开始多线程调度。RT-Thread的线程调度算法是基于优先级的全抢占式多线程调度算法,支持256个优先级,相同优先级线程采用可设置时间片的轮转调度算法。本文设计了“RS_TX_thread”、“RS_RX_thread”和“SYS_init_thread”三个线程。前两个线程实现CAN-RS232转换功能,“SYS_init_thread”线程是“RS_TX_thread”与“RS_RX_thread”线程的入口。TX线程负责CAN信息转RS-232的工作,RX线程负责RS-232转CAN的工作,创建代码如下。

3 试验结果

这里使用两个LPC1768开发板进行试验,将两个开发板A、B的CAN1接口进行对连。在A开发板的串口输入信息,在B开发板的串口上进行监测。试验验证,B开发板可以成功接收到A开发板串口输入的数据,CAN与RS-232间通信正确、有效。

4 结束语

本文设计的CAN-RS232转换器在RT-Thread上进行实现,可以使用于CAN、RS-232通信方式并存的应用环境,可以利用PC机的RS-232接口直接处理CAN总线上传的数据信息。同时,利用RT-Thread的LwIP网络组件,可以扩充以太网接口,实现与以太网间的协议转换,适应更加复杂的通信环境。

[1]李婷.CAN 总线综述[J].数字技术与应用,2010(4):129-130.

[2]甘永梅,刘晓娟,晁武杰,等.现场总线技术及其应用[M].北京:机械工业出版社,2004:5-14.

[3]包磊,徐梁飞,林辛凡,等.燃料电池客车用10msTTCAN通信网络协议制订与测试[J].汽车工程,2009,31(1):65 -68,82.

[4]杨宗德,张兵.μC/OS-II标准教程[M].北京:人民邮电出版社,2009:1 -6,239 -242.

[5]邱祎.嵌入式实时操作系统RT-Thread的设计与实现[D].成都:电子科技大学,2007.

[6]陈是知.μC/OS-II内核分析、移植与驱动程序开发[M].北京:人民邮电出版社,2007:198-247.

[7]朱传宏,张丽全.嵌入式实时操作系统RT-Thread在SEP4020上的移植[J].计算机与数字工程,2010(11):93-96.

[8]柳沁.基于 ARM7的 CAN-USB转换器设计[J].设计天地,2007:109-110.

[9]蒋浩天.综合网络多协议转换的研究和实现[D].成都:电子科技大学,2007.

[10]宋琪,魏臻,吴永忠,等.CAN-RS-232接口电路及协议转换软件的设计[J].电子工程师,2005(1):69-71.

猜你喜欢
开发板缓冲区线程
基于C#线程实验探究
基于STM32H7的FDCAN通信系统设计与实现∗
基于国产化环境的线程池模型研究与实现
线程池调度对服务器性能影响的研究*
串行连续生产线的可用度与缓冲库存控制研究*
基于ARC的闪存数据库缓冲区算法①
浅析单片机开发板的设计与制作
ARM宣布mbed Enabled Freescale FRDM—K64F开发板通过微软认证
初涉缓冲区
多目标缓冲区生成算法