一种软硬件自主可控的嵌入式实时控制系统

2017-03-31 01:23吕华溢谢政
单片机与嵌入式系统应用 2017年3期
关键词:开发板微控制器驱动程序

吕华溢,谢政

(1.中航工业北京长城计量测试技术研究所,北京 100095;2.重庆大学)

一种软硬件自主可控的嵌入式实时控制系统

吕华溢1,谢政2

(1.中航工业北京长城计量测试技术研究所,北京 100095;2.重庆大学)

本文基于国产GD32微控制器和RT-Thread实时操作系统,构建了一种软硬件自主可控的嵌入式实时控制系统。研究了RT-Thread操作系统在GD32芯片开发板上的移植方法和驱动程序改写,并编写多任务应用程序进行测试,证明了系统运行稳定可靠,为国产嵌入式控制系统的发展提供了一种技术实现途径。

嵌入式实时控制系统;自主可控;GD32;RT-Thread

引 言

由微控制器和实时操作系统共同构成的嵌入式实时控制系统在工业生产、交通运输、能源供给、国防装备等众多领域被广泛使用,是实现自动化技术的核心中枢。目前,国内所采用的嵌入式实时控制系统大多基于国外的微控制器芯片和软件产品,在“棱镜门”[1]和“Stuxnet病毒”[2]事件后,关键领域所采用的嵌入式系统的安全问题已被国内用户所重视,发展自主可控、安全可靠的嵌入式实时控制系统已成为必然趋势[3]。

伴随国产微控制器芯片和实时操作系统软件的不断发展和日趋成熟,基于国产软、硬件产品构建自主可控的嵌入式实时控制系统已经具备实现条件。本文采用具有ARM Cortex-M3内核的国产微控制器GD32F207芯片和RT-Thread实时操作系统建立了一套完全国产化的嵌入式实时控制系统,为国产自主可控嵌入式实时控制系统的建立及应用进行了技术经验总结和有益探索。

1 嵌入式实时控制系统的构成

嵌入式系统与通用计算机系统在体系结构上具有相似性,都是由主控制器芯片和外围功能芯片构成硬件电路基础,再由可提供底层硬件操作功能的软件作为操作系统,用户最终通过操作系统对硬件进行访问和控制[4-5];嵌入式系统通常针对某个特定控制任务设计,因而具有实时处理能力强、可靠性好的要求,通用计算机的处理适用范围广,因此更注重兼容性而实时处理能力较弱。

1.1 GD32F207微控制器与开发板

GD32F2系列国产微控制器芯片为基于ARM Cortex-M3内核架构设计的产品,本文采用的GD32F207ZET6(以下简称GD32)芯片主频最高可达120 MHz,具有128 KB的SRAM和512 KB的Flash存储容量,并且提供UART、ADC、以太网和LCD控制器等众多外设功能接口,可以很大程度上减少所需的外围功能电路配置。Colibri-F207ZE开发板是基于该芯片设计的一款“口袋实验室”类型产品,如图1所示,除了在板子上有与Arduino平台引脚布局兼容的引出I/O接口之外,还包括TFT显示屏接口、2个用户按键、3个LED指示灯、1个USB串口和板载GDLINK调试器功能。本文中以此开发板作为硬件平台构建嵌入式控制系统。

图1 Colibri-F207ZE开发板

1.2 RT-Thread实时操作系统

RT-Thread嵌入式实时操作系统的开发始于2006年,并且遵循GPLv2+的版权许可协议。在经过多年的能源、仪表、车辆等行业广泛使用后,RT-Thread已经被验证是一款稳定、可靠的嵌入式实时操作系统。从参考文献[6]中对RT-Thread与国际主流嵌入式实时操作系统进行的比较中,也可看出其具有优越的性能。RT-Thread系统的结构层次框图如图2所示,其中内核层(Kernel)是RT-Thread的关键部分涉及时钟管理、实时调度、任务切换等核心操作;组件层(Components)主要提供Shell交互、文件系统、协议栈等附加操作功能;在内核层与硬件之间是用于系统移植的软件接口部分(Porting),其实现了操作系统对于硬件的各种具体操作功能。在本文中以发布的 RT-Thread 2.1.0版作为移植对象进行分析、代码修改并最终实现与Colibri-F207ZE开发板共同构成嵌入式实时控制系统。

图2 RTThread操作系统层次结构

2 RT-Thread在GD32微控制器上的移植

RT-Thread操作系统已经在GitHub上做了代码托管,因此可直接从GitHub上下载获取到RT-Thread 2.1.0版的源代码压缩文件包[7]。本文中采用MDK 5.16a版本的ARM开发工具进行移植工作,并需要在MDK的Pack Installer中安装GD32F2系列芯片的DFP支持包。在移植工作中完成了RT-Thread操作系统的串口通信和LED灯驱动功能,可实现RT-Thread与主机之间的Shell交互操作和对测试程序中运行任务的直接观察。

2.1 RT-Thread目录结构的转换

打开下载得到的RT-Thread源代码文件包可看到按代码功能分类的目录结构,各文件夹所包含的内容和用途分别为:

① bsp文件夹。板级支持包,包含针对特定型号微控制器板卡和外部设备的驱动程序。

② components。对应RT-Thread操作系统的组件层,包含RT-Thread核心功能之外的大部分附加操作功能以及硬件设备驱动模型。

③ documentation。RT-Thread编程风格说明,对开发人员和用户掌握RT-Thread提供指引。

④ examples。针对RT-Thread操作系统的应用和测试程序示例。

⑤ include。RT-Thread操作系统使用的头文件,可供外部应用程序调用。

⑥ libcpu。CPU支持包,包含对各种常见CPU的底层驱动程序,大部分为汇编语言开发。

⑦ src。对应RT-Thread操作系统的内核层,包含RT-Thread实时调度、时钟管理、内存分配、线程管理等全部核心功能。

⑧ tools。Scons构建脚本文件,包含用于不同开发工具的各种脚本执行文件。

根据RT-Thread源代码文件包中各个文件夹的用途,结合GD32芯片所提供的外设固件库、CMSIS配置文件和Colibri-F207ZE开发板的板级支持包构建基于GD32F207芯片和RT-Thread操作系统的目录结构,如图3所示。其中App文件夹中包括RT-Thread的启动文件startup.c和用户开发的应用程序;GD32F207ZET6文件夹中包括硬件相关的两个子文件夹,Colibri_BSP中是开发板的外设驱动程序,GD32F20x_StdPeriph_Driver中是GD32芯片所提供的外设固件库、芯片驱动、配置和中断处理文件;Obj文件夹中为MDK所建立的工程文件和存放编译后得到的axf文件;RT-Thread210文件夹中包含RT-Thread操作系统的各软件模块,其为直接从源代码文件包中相关内容复制而来。

2.2 项目工程的建立与驱动程序改写

在完成上述目录结构的构建后,需要使用MDK开发工具将RT-Thread源代码和GD32芯片的相关文件有机结合起来,实现RT-Thread操作系统在Colibri-F207ZE开发板上的移植工作。在MDK工具内部各个文件按照逻辑关系进行分组管理,这里以GD32开头的组和嵌入式系统硬件相关,以RT开头的组与操作系统软件相关,如图4所示。这种分组结构可有效实现软硬件隔离,便于日后硬件部分或软件部分代码的升级替换工作。

图3 基于GD32芯片构建的RT-Thread系统目录结构

图4 对GD32芯片和RT-Thread系统文件的分组管理

2.2.1 软硬件配置与代码修改

在RT-Thread和GD32的配置中采用宏定义方式实现对所需软件功能模块的条件编译和芯片性能参数设置,以达到对嵌入式系统软、硬件裁剪和配置的目的。因此,在移植过程中需要对这些宏定义进行有选择的设置。

修改system_GD32f20x.c文件,该文件中主要实现GD32的系统时钟和AHB、APB总线上挂接各部件的时钟树配置,本文中将系统时钟设置为72 MHz。

修改colibri_board.h文件,该文件主要用于设置GD32芯片内、外部RAM的容量,根据本文中所使用的GD32F207ZET6芯片,将内部RAM容量设置为128 KB;开发板未扩展外部RAM,将对应的宏定义GD32_EXT_SRAM设置为0。

修改rtconfig.h文件,该文件主要用于RT-Thread操作系统的参数配置以及软件功能模块的裁减。用户可根据需要设置,保留的软件功能模块越多,则编译后的HEX文件尺寸越大且需要的运行RAM越多。本文中将RT-Thread最大优先级RT_THREAD_PRIORITY_MAX设置为16;每秒节拍数RT_TICK_PER_SECOND设置为100;启用了控制台和Shell交互功能RT_USING_CONSOLE以及RT_USING_FINSH以方便应用程序调试。

2.2.2 设备驱动程序的改写

编写驱动程序是操作系统移植过程中的重要一步,其用于实现软件对硬件的最终操作。在RT-Thread中驱动程序属于Porting层,采用了统一的设备驱动模型框架,可以被应用程序通过标准接口函数访问和调用,在参考文献[6,8-9]中对RT-Thread设备驱动框架的构成进行了说明。由于GD32F2系列微控制器与STM32微控制器在系统结构上具有相似性,因此在本文中通过对RT-Thread源代码文件包中/bsp/stm32f10x/drivers子文件夹内驱动程序进行改写的方法实现Colibri-F207ZE开发板上串口通信和LED灯的驱动程序。对于GD32芯片上其它功能接口的驱动程序,都可根据需求而参考此种方法进行改写。

图5 应用程序操作底层设备的接口函数映射

以实现串口通信功能的驱动程序改写为例,应用程序通过I/O设备模块中的标准接口函数和设备驱动程序中的函数二者之间的映射关系,实现对底层I/O设备控制,如图5所示。其中标准接口函数无需修改,由RT_DeviceDrivers分组中的serial.c文件实现;而串口驱动程序则由GD32_BSP分组中的colibri_board_usart.c文件实现,需要对相应的功能函数和配置进行修改。改写的内容主要包括替换片上外设访问层头文件、实现串口通信功能的芯片引脚定义、rt_hw_usart_init()函数中的串口参数设置和通过rt_hw_serial_register()函数将串口设备注册到RT-Thread设备驱动框架中,即实现标准接口函数与串口设备之间的关联。需要注意的是GD32与STM32两种芯片在各自外设固件库中提供的结构体定义和函数功能是类似的,但是名称不一致,需要在移植过程中进行修改,表1列出了串口驱动程序colibri_board_usart.c文件中需要修改的结构体和函数名称。得益于Cortex内核遵循的CMSIS接口标准和RT-Thread所采用的设备驱动框架机制,对设备驱动程序只需做上述少量改写,即可完成不同芯片间的移植工作。

表1 串口驱动程序中需要修改的结构体和函数名称

2.3 RT-Thread测试应用程序编写

图6 RT-Thread系统Shell交互界面

开发板在上电后,GD32芯片复位,通过文件startup_gd32f20x_cl.s中复位地址处的加载指令调用RT-Thread系统main()函数(位于startup.c文件中),在完成开发板、RT-Thread系统内核、定时器、用户任务和空闲任务等的初始化后,通过rt_system_scheduler_start()函数启动RT-Thread调度器实现对各个用户任务的实时调度。为验证RT-Thread在Colibri-F207ZE开发板上的移植是否成功,使用rt_thread_init()函数建立两个用户任务分别控制两个LED灯按照0.5 s和1 s的周期闪烁。

3 嵌入式实时控制系统的测试

在完成RT-Thread在Colibri-F207ZE开发板上的移植和测试程序编写后,将经过MDK编译得到的axf文件下载到开发板上运行。通过上位机的串口通信工具可以和RT-Thread提供的Shell进行交互操作,并使用相应指令观察RT-Thread系统运行和RAM的使用情况,如图6所示。可以看到共有4个任务在运行,其中LED_GREE和LED_RED是控制LED灯闪烁的用户任务,tshell和tidle分别是系统的shell交互任务和空闲任务;在RT-Thread中注册有一个设备,就是提供Shell功能的uart1串口。该测试结果表明RT-Thread已经在Colibri-F207ZE开发板上稳定运行,实现了预期的移植效果。

结 语

[1] 侯玉梅,朱向东.棱镜门事件对我国网络安全的警示[J].计算机安全,2014(5):33-35.

[2] 肖新光.管中窥豹-Stuxnet,Duqu和Flame的分析碎片与反思[J].信息安全与通信保密,2012(7):18-19.

[3] 万俊伟,赵辉,鲍忠贵,等.自主可控信息技术发展现状与应用分析[J].飞行器测控学报,2015(4):318-324.

[4] 王婷婷.通用计算机系统、嵌入式计算机系统和单片机的关系[J].铜仁师范高等专科学校学报(综合版),2005(6):39-41.

[5] 何立民.从现代计算机视角看嵌入式系统(3)-现代计算机的两大分支[J].单片机与嵌入式系统应用,2016(3):78-79.

[6] 涂撰,赵标.RT-Thread在LPC2378上的移植与应用[J].上海船舶运输科学研究所学报,2013(1):44-49.

[7] RT-Thread v2.1.0 released[EB/OL]. [2016-04-24].https://github.com/RT-Thread/rt-thread/releases/tag/v2.1.0.

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

[9] 叶思超. 基于RT-Thread的手持式高性能RFID读写器设计[D].成都:电子科技大学,2015.

吕华溢(工程师),主要从事力学传感器设计、智能化仪器及测控系统的研究工作;谢政(硕士研究生),研究方向为仪表测控系统设计、嵌入式系统开发。

参考文献

[1] Bachrach J,Vo H,Richards B,et al.Chisel:constructing hardware in a Scala embedded language[C]//Design Automation Conference.IEEE,2012:1212-1221.

[2] Krste Asanovic,David Patterson.The Case for Open Instruction Sets[J].MICROPROCESSOR report,2014(8):1-7.

[3] Celio Christopher,Patterson David A,Asanovic',Krste.The Berkeley Out-of-Order Machine(BOOM):An Industry-Com-

petitive, Synthesizable,Parameterized RISC-V Processor[R].EECS Department,University of California,Berkeley,2015.

[4] Chisel 2.2 Tutorial[EB/OL].[2016-10].https://chisel.eecs.berkeley.edu/2.2.0/chisel-tutorial.

雷思磊(工程师),研究方向为处理器架构、嵌入式处理器应用等。

(责任编辑:薛士然 收稿日期:2016-10-31)

Embedded Real-time Control System Based on Independent Controllable Software and Hardware

Lv Huayi1,Xie Zheng2

(1.AVIC Changcheng Institute of Metrology&Measurement,Beijing 100095,China;2.Chongqing University)

An independent controllable embedded real-time control system is established in the paper,which is based on both microcontroller GD32 and real-time operation system RT-Thread.It has been explored in the porting method of RT-Thread on GD32 development board and adaptation of device driver.A multi-tasking application has been developed to test the migration and it is proved stable and reliable.This work provides a means of implementation for the development of domestic embedded control system.

embedded real-time control system;independent controllable;GD32;RT-Thread

TP316.2

A

�迪娜

2016-10-25)

猜你喜欢
开发板微控制器驱动程序
计算机硬件设备驱动程序分析
物联网技术在微控制器实验教学中的应用
Microchip最新推出两款PIC32 Curiosity开发板
浅析单片机开发板的设计与制作
Mouser为您呈上开发关键之STMicroelectronics Nucleo开发板
Arduino和Atmel发布Arduino Zero开发板
Atmel针对新一代物联网应用发布全新32位微控制器
最新STM32设计工具增加对混合信号微控制器的支持
基于MPC8280的CPU单元与内部总线驱动程序设计
意法半导体(ST)推出世界首款基于ARM Cortex-M7的STM32 F7系列微控制器