前言
Clion作为一款跨平台的 C/C++工程IDE,因其强大的功能、优异的人机界面以及丝滑的用户体验广受程序员的喜爱。RT-Thread作为一款国产开源嵌入式操作系统,从2006年发展至今展现了强大的生命力,组件丰富、安全易用、高度可伸缩性以及跨多款芯片平台等,自然受到众多嵌入式工程师的青睐,称之为目前国内第一嵌入式操作系统都不为过。因此,本节详细介绍使用 Clion 移植 RT-Thread进行嵌入式开发。
1.前期准备
1.运行环境windows10; 2.stm32f103x开发板一套; 3.安装好STM32CubeMX; 4.安装好Clion;
其中,需配置Clion满足嵌入式开发要求,如果没有安装可以参考《使用 CLion 进行嵌入式开发》
2.预期结果
使用 CubeMX 配置好工程,移植 RT-Thread 操作系统。使用 Clion 运行工程,编译、调试,并下载至 STM32F103RC开发板运行,通过串口输出调试信息。
3.使用CubeMX生成工程
step1:运行 CubeMX ,新建工程并选择芯片 STM32F103RCTx,如下图。
step2:系统时钟配置为外部时钟,如下图。
step3:使能下载调试接口 SWD,如下图,后续需要通过该接口下载程序至单片机。
step4:使能串口 uart1,如下图所示,串口用于输出调试信息。
step5: 安装 RT-thread 软件包(摘录于RTT官方教程) 要获取 RT-Thread Nano 软件包,需要在 CubeMX 中添加 https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc 。

check 通过后,点击 OK 回到 User Defined Packs Manager 界面,再次点击 OK,CubeMX 自动连接服务器,获取包描述文件。回到 Manage embedded software packages 界面,就会发现 RT-Thread Nano 3.1.3 软件包,选择该软件包,点击 Install Now,如下图所示:

点击安装之后,弹出 Licensing Agreement ,同意协议,点击 Finish,如下图所示:

等待安装完成,成功安装后,版本前面的小蓝色框变成填充的黄绿色,现象如下图所示:

至此,RT-Thread Nano 软件包安装完毕,退出 Manage embedded software packages 界面,进入 CubeMX 主界面。
step6:将 RT-thread添加至工程中,如下图。
其中,RT-Thread Nano 软件包中包含 kernel 与 shell 两个部分,仅选择 kernel 表示只使用 RT-Thread 内核,工程中会添加内核代码;选择 kernel 与 shell 表示在使用 RT-Thread Nano 的基础上使用 FinSH Shell 组件,工程中会添加内核代码与 FinSH 组件的代码,可按需选择。

如下图所示,选中 RT-Thread,其中③处为操作系统的参数设置,我们不做修改,保持默认值。

step7:RT-Thread 操作系统重定义 HardFault_Handler 、PendSV_Handler 、SysTick_Handler 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt , Pendable request , Time base :System tick timer)

step8:配置工程

上图中,①、②分别为工程名字和存储地址,根据自己需要填写。③比较关键,由于后续需要使用clion,因此选择SWSTM32。因下载最新的固件版本需要时间,故这里取消④,点击⑤生产工程。
4.使用Clion打开工程并修改代码
step1:使用 clion打开工程,如下图所示,点击①Open or Import ,选择工程目录下的后缀名为 .ioc的文件,依次点击③、④。

step2:将 main.h中 main()函数中所有初始化函数挪至 board.c文件的 rt_hw_board_init()函数中,如下图。
更新后,rt_hw_board_init()函数代码如下:
/**
* This function will initial your board.
*/
void rt_hw_board_init()
{
HAL_Init(); //from main
SystemClock_Config();//from main
/* System Clock Update */
SystemCoreClockUpdate();
/* System Tick Configuration */
_SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
rt_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
/* Initialize all configured peripherals */
MX_GPIO_Init();//from main
MX_USART1_UART_Init();//from main
}
step3:同时需将头文件 #include "stm32f1xx_hal.h", 上述挪动的函数及函数体添加至 board.c文件中:
#include "stm32f1xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
void Error_Handler(void);
step4:Clion 一般使用 gcc 编译器,而不是像 Keil-MDK 使用 ARMCC ,因此,需要将 startup 文件夹下 startup_stm32fxx.s 文件中 bl main 改成 bl entry,该步骤尤为重要。
step5:需要使用 RT-Thread的 rt_kprintf()打印调试信息至串口 uart1,需重定义函数 rt_hw_console_output(const char *str)如下,并将该函数放在 board.c文件中。
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = '\r';
__HAL_UNLOCK(&huart1);
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == '\n')
{
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
}
HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
}
}
step6:main()函数中添加头文件 #include <rtthread.h>,并添加串口输出测试代码:
#include <rtthread.h>
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
rt_kprintf("\r\nbuild RT-Thread on clion by www.rymcu.com!\r\n");
while (1);
}
5.使用Clion编译工程并查看测试结果
点击 Build-->Rebuild Project完成代码编译,结果如下图②所示成功生成 .hex,.bin可执行文件,表明移植成功。
将上述可执行代码下载至开发板,串口 uart1连接至 PC,通过串口调试助手观察测试结果。串口调试助手设置为:115200--N--8--1。

6.小节
至此,完成了 Clion移植 RT-thread嵌入式操作系统全过程:《github完整工程代码》