0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于GD32构建软硬件自主可控的嵌入式实时控制系统的介绍和应用

GD32MCU 来源:djl 作者:吕华溢 2019-10-22 09:50 次阅读

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

引 言

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

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

01

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

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

1.1 GD32F207微控制器与开发板

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

关于GD32构建软硬件自主可控的嵌入式实时控制系统的介绍和应用

图1 Colibri-F207ZE开发板

关于GD32构建软硬件自主可控的嵌入式实时控制系统的介绍和应用

图2 RT-Thread操作系统层次结构

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开发板共同构成嵌入式实时控制系统。

02

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操作系统的各软件模块,其为直接从源代码文件包中相关内容复制而来。

关于GD32构建软硬件自主可控的嵌入式实时控制系统的介绍和应用

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

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

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

2.2.1 软硬件配置与代码修改

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

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

修改colibri_board.h文件,该文件主要用于设置GD32芯片内、外部RAM的容量,根据本文中所使用的GD32F207ZET6芯片,将内部RAM容量设置为128KB;开发板未扩展外部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以方便应用程序调试。

关于GD32构建软硬件自主可控的嵌入式实时控制系统的介绍和应用

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

2.2.2 设备驱动程序的改写

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

以实现串口通信功能的驱动程序改写为例,应用程序通过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所采用的设备驱动框架机制,对设备驱动程序只需做上述少量改写即可完成不同芯片间的移植工作。

关于GD32构建软硬件自主可控的嵌入式实时控制系统的介绍和应用

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

芯片 STM32 GD32 定义位置
结构体 USART_TypeDef USART_InitPara gd32f20x_usart.h
GPIO_InitTypeDef GPIO_InitPara gd32f20x_gpio.h
NVIC_InitTypeDef NVIC_InitPara gd32f20x_misc.h
函数 USART_Cmd USART_Enable gd32f20x_usart.h
USART_ITConfig USART_INT_Set
USART_GetITStatus USART_GetIntBitState
USART_ClearITPendingBit USART_ClearIntBitState
USART_GetFlagStatus USART_GetBitState
RCC_APB2PeriphClockCmd RCC_APB2PeriphClock_Enable gd32f20x_rcc.h

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

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

开发板在上电后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秒和1秒的周期闪烁。

03

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

在完成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开发板上稳定运行,实现了预期的移植效果。

关于GD32构建软硬件自主可控的嵌入式实时控制系统的介绍和应用

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

结 语

本文基于GD32微控制器和RT-Thread实时操作系统构建了一种嵌入式实时控制系统,其具有软硬件自主可控、安全可靠的特点为工业生产、国防装备等军民应用的关键领域提供了有效解决方案。通过本文的研究和探索,在自主可控嵌入式实时控制系统的构建方面积累了技术检验,为后期配套应用开发奠定了坚实基础。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7560

    浏览量

    151494
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3593

    浏览量

    129511
  • 计算机
    +关注

    关注

    19

    文章

    7504

    浏览量

    88050
收藏 人收藏

    评论

    相关推荐

    基于飞腾腾珑E2000 CPU的自主可控DCS系统成功投运

    近日,基于 飞腾腾珑E2000 CPU打造的自主可控DCS(分散控制系统)等主辅机系统,在华电江苏望亭电厂顺利完成部署投运。该型自主
    的头像 发表于 12-20 10:34 205次阅读

    嵌入式系统开发与硬件的关系 嵌入式系统开发常见问题解决

    嵌入式系统开发与硬件的关系 嵌入式系统是专为特定应用设计的计算机系统,它们通常
    的头像 发表于 12-09 09:38 277次阅读

    嵌入式学习建议

    对广大渴望学习嵌入式系统的学子提出几点基础阶段的学习建议: ①嵌入式系统软件硬件密切相关,一定要打好
    发表于 10-22 11:41

    嵌入式系统硬件架构

    嵌入式系统是一种专用的计算机系统,它以应用为中心,以现代计算机技术为基础,能够根据用户的具体需求(如功能、可靠性、成本、体积、功耗、环境等)灵活裁剪软硬件模块。这类
    的头像 发表于 09-29 16:29 412次阅读

    开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束

    粤港澳大湾区国家技术创新中心操作系统业务负责人柯善风做了“国创面向工业机器人的OS解决方案和落地实践”专题报告。柯善风介绍国创中心的发展情况,分享了面向工业场景、自主可控、中立普惠
    发表于 08-30 17:24

    【「ARM MCU嵌入式开发 | 基于国产GD32F10x芯片」阅读体验】+书籍整体概况

    是国产芯片的佼佼者,此书籍深入浅出地讲解了嵌入式系统开发的基础知识,当然阅读者还是需要掌握一定的C语言知识的,案例是基于GD官方的标准库函数实现的。 四、目录展示 第一章为概述内容,主要包含理解
    发表于 08-25 22:48

    GD32 MCU 入门教程】GD32 MCU 常见外设介绍(14)RTC 模块介绍

    GD32 MCU内部提供了一个RTC(实时时钟)模块,通过RTC可以实现日历时钟、闹钟等功能。RTC也可以用于深度睡眠或待机模式的低功耗唤醒。不同系列的GD32 MCU在RTC设计和功能上有所区别,总体可以分为三大系列:
    的头像 发表于 08-23 09:18 493次阅读
    【<b class='flag-5'>GD32</b> MCU 入门教程】<b class='flag-5'>GD32</b> MCU 常见外设<b class='flag-5'>介绍</b>(14)RTC 模块<b class='flag-5'>介绍</b>

    GD32 MCU 入门教程】GD32 MCU 常见外设介绍(12)FMC 模块介绍

    闪存控制器(FMC),提供了片上闪存需要的所有功能。FMC 也提供了页擦除,整片擦除,以及32 位整字或 16 位半字编程闪存等操作。 GD32 MCU 支持不同类型编程的具体说明如下表 GD32 MCU 不同系列编程区别所示。
    的头像 发表于 08-21 09:56 1151次阅读
    <b class='flag-5'>GD32</b> MCU 入门教程】<b class='flag-5'>GD32</b> MCU 常见外设<b class='flag-5'>介绍</b>(12)FMC 模块<b class='flag-5'>介绍</b>

    嵌入式系统怎么学?

    嵌入式系统怎么学? 随着物联网、智能制造等新技术的兴起,嵌入式系统的应用范围更加广泛。包括但不限于工业控制、汽车电子、医疗设备、智能家居、
    发表于 07-02 10:10

    如何提升嵌入式编程能力?

    、SPI、CAN、WIFI、MQTT等多种通信协议。 4. 使用开发工具:熟练掌握嵌入式开发工具,如编译器、调试器、仿真器和实时操作系统(RTOS)。 5. 阅读数据手册:仔细阅读你所使用的微
    发表于 06-21 10:01

    嵌入式系统基础

    嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 它由
    的头像 发表于 06-19 09:10 476次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>基础

    从事嵌入式方向,一定要软硬件通吃?

    软件工程师的职责嵌入式软件工程师的主要职责是为嵌入式系统编写和调试代码,确保系统按预期工作。他们需要处理底层硬件接口、
    的头像 发表于 06-05 08:10 1204次阅读
    从事<b class='flag-5'>嵌入式</b>方向,一定要<b class='flag-5'>软硬件</b>通吃?

    嵌入式系统软硬件基础知识大全

    制约的,只有硬件和软件协同工作,才能使嵌入式系统正常运行。本文将从嵌入式系统的定义和特点出发,详细介绍
    发表于 05-09 14:12

    再谈嵌入式实时操作系统

    程序的可移植性得到了增强,系统开发的工作量减轻的同时也提高了开发效率。对实时性和可靠性日益增长的要求正在塑造某些现代领域的嵌入式实时操作系统
    的头像 发表于 04-09 17:27 807次阅读
    再谈<b class='flag-5'>嵌入式</b><b class='flag-5'>实时</b>操作<b class='flag-5'>系统</b>

    电池管理系统(BMS)软硬件介绍

    电子发烧友网站提供《电池管理系统(BMS)软硬件介绍.pdf》资料免费下载
    发表于 03-27 09:20 9次下载