RT-Thread Nano版本在GD32F527I-EVAL评估板的移植
目录
概述
1 RT-Thread Nano
1.1 Nano版本介绍
1.2 RT-Thread Nano的特点
2 GD32F527I-EVAL上移植Nano
2.1 GD32F527I-EVAL评估版
2.1.1 开发板概述
2.1.2 主要特性与硬件资源
2.2 移植 RT-Thread Nano
2.2.1 下载固件库
2.2.2 移植RT-Thread
2.2.3 修改和RT-Thread相关的代码
3 验证
概述
本文主要介绍在 GD32F527I-EVAL 评估板上快速移植 RT-Thread Nano 的方法。RT-Thread Nano 版本是一个非常好的入门实践。Nano版本内核精简,非常适合资源受限或需要快速上手的场景。
1 RT-Thread Nano
1.1 Nano版本介绍
RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用32 位 ARM 入门级 MCU 。
下图是 RT-Thread Nano 的软件框图,包含支持的 CPU 架构与内核源码,还有可拆卸的 FinSH 组件:

1.2 RT-Thread Nano的特点
RT-Thread Nano 在使用上也非常简单,带给开发者友好的开发体验。
- 易裁剪:Nano 的配置文件为 rtconfig.h,该文件中列出了内核中的所有宏定义,有些默认没有打开,如需使用,打开即可。具体的配置可见 Nano 版块的 RT-Thread Nano 配置 教程。
- 易添加 FinSH 组件:FinSH 组件 可以很方便的在 Nano 上进行移植,而不再依赖 device 框架,只需要对接两个必要的函数即可完成 FinSH 移植。
- 自选驱动库:可以使用厂商提供的固件驱动库,本文使用GD32F527I_EVAL_Demo_Suites
- 完善的文档:包含 内核基础、线程管理 (例程)、时钟管理 (例程)、线程间同步 (例程)、线程间通信 (例程)、内存管理 (例程)、中断管理,以及 Nano 版块的移植教程。
2 GD32F527I-EVAL上移植Nano
2.1 GD32F527I-EVAL评估版
2.1.1 开发板概述
GD32F527I-EVAL评估板的核心是GD32F507IGT6芯片。这款MCU基于200MHz主频的ARM Cortex-M4内核,支持硬件FPU和DSP指令集,具有高达3072KB的Flash和256KB的SRAM,性能非常强劲。评估板使用 Mini USB 接口或者 DC-005 连接器提供 5V 电源。提供包括扩展引脚在内的及 SWD, Reset, Boot, User button key, LED, CAN, I2C, I2S, USART, RTC, LCD, SPI, ADC, DAC, EXMC, CTC, SDIO, DCI, ENET, USBFS, USBHS, GD-Link 等外设资源。
2.1.2 主要特性与硬件资源
1)核心微控制器
型号: GD32F507IGT6 (板载芯片,与GD32F527属于同一系列,性能和外设基本一致)
内核: ARM Cortex-M4 @ 200MHz,带FPU
存储: 3072KB Flash, 256KB SRAM
2)丰富的连接与接口
以太网: 10/100M 以太网接口 (RJ45),适用于网络应用。
USB:
USB FS (Full Speed) 接口
USB HS (High Speed) 接口,支持OTG功能。
CAN: 2.0B 接口,适用于汽车和工业通信。
音频:
音频编解码器芯片,提供音频输入和输出接口。
一个麦克风。
显示屏: 一块 2.4英寸TFT LCD 彩色显示屏,带电阻式触摸屏。
3) 板载调试器
集成了 GD-Link 调试器,通过一个USB Type-C接口即可完成供电、程序下载和调试,无需额外购买仿真器,非常方便。
2.2 移植 RT-Thread Nano
2.2.1 下载固件库
1) 在兆易创新的官网上下载驱动库和Demo库
https://www.gd32mcu.com/cn/product
https://www.gd32mcu.com/cn/download/7?kw=GD32F5
2) 解压文件后得到如下内容
2.2.2 移植RT-Thread
笔者选择以04_USART_Printf_rtos为例, 基于基于Keil开发软件 移植该系统。
1) 在Keil中选择RT-Thread
2) 配置编译器版本
完成以上配置后,项目软件架构如下:
2.2.3 修改和RT-Thread相关的代码
1) 在board.c文件中配置时钟,并初始化串口

配置串口相关的代码

源代码如下:
/*** This function will initial your board.*/
void rt_hw_board_init(void)
{
//#error "TODO 1: OS Tick Configuration."/* * TODO 1: OS Tick Configuration* Enable the hardware timer and call the rt_os_tick_callback function* periodically with the frequency RT_TICK_PER_SECOND. *//* configure systick */systick_config();// bsp_board_init();/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INITrt_components_board_init();
#endif#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}#ifdef RT_USING_CONSOLEstatic int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."/* configure EVAL_COM0 */gd_eval_com_init(EVAL_COM0);return 0;
}
INIT_BOARD_EXPORT(uart_init);void rt_hw_console_output(const char *str)
{uint32_t data;
//#error "TODO 3: Output the string 'str' through the uart."rt_size_t i = 0, size = 0;char a = '\r';size = rt_strlen(str);for (i = 0; i < size; i++){if (*(str + i) == '\n'){data = a;usart_data_transmit(EVAL_COM0, data);while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));}data = *(str + i);usart_data_transmit(EVAL_COM0, data);while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));}
}#endif
2) 在finsh_port.c中加载串口接收函数

源代码如下:
#include <rthw.h>
#include <rtconfig.h>
#include "gd32f527i_eval.h"
#include "systick.h"#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h
#endif#ifdef RT_USING_FINSHRT_WEAK char rt_hw_console_getchar(void)
{/* Note: the initial value of ch must < 0 */int ch = -1;//#error "TODO 4: Read a char from the uart and assign it to 'ch'."while (usart_flag_get(EVAL_COM0, USART_FLAG_RBNE) == RESET); // 等待接收完成ch= usart_data_receive(EVAL_COM0); // 返回接收到的数据return ch;
}#endif /* RT_USING_FINSH */
3) 修改rtconfig.h中相关的配置
step-1: 修改栈空间
step-2: 使能控制台
step-3: 在系统tick函数中调用rt_os_tick_callback()
完成以上步骤后,可以编译代码,编译结果如下:
3 验证
编译代码,下载到开发板中运行:
在主函数中调用rt_thread_mdelay(),在main.c中包含如下头文件:
#include "gd32f527.h"
#include "gd32f527i_eval.h"
#include "systick.h"
#include <stdio.h>
#include <rtthread.h>
下载代码至板块,其运行结果如下:
运行一些RT-Thead的一些命令:
help
ps
其他命令如下:
RT-Thread shell commands:
version - show RT-Thread version information
list_thread - list thread
list_sem - list semaphore in system
list_mailbox - list mail box in system
list_timer - list timer in system
help - RT-Thread shell help.
ps - List threads in the system.
free - Show the memory usage in the system.msh >
msh >
