使用gcc手把手教你将RT-Thread移植到STM32平台

前言

网上大多数移植RT-Thread系统的教程都是基于Keil的,下面将带来基于gcc版本的移植教程,若你还没有基于gcc的环境,可以查看我的这篇文章:VSCode搭建STM32开发环境

1、下载RT-Thread源码

RT-Thread有好几个版本,我们只需下载 RT-Thread Nano 版本源码即可,Nano是Master的精简版,去掉了一些组件和各种开发板的BSP,保留了OS的核心功能,下载地址:RT-Thread Nano


下载完成后,解压一下,会有一些内容:

文件夹内容组成:

文件夹 描述
bsp 板级支持包
components/finsh RT-Thread组件
include 头文件
include/libc 头文件
libcpu 与处理器相关的接口文件
src RT-Thread内核源码

2、将文件夹rt-thread拷贝到裸机工程模板中

这里我默认你们看这篇教程了:VSCode搭建STM32开发环境

将rt-thread文件夹拷贝到模板工程中

3、删除多余文件

打开rt-thread文件夹,将以下无用文件删除

3.1、bsp文件夹

打开bsp文件夹,会发现里面有很多文件,这个文件夹下放的是一些板级支持包,能用到的文件只有board.crtconfig.h 两个文件,其他的都删除

3.2、 components文件夹

在这个文件夹下放的是一些其它第三方加进来的软件,也即是组件,比如gui、fatfs、lwip和finsh等。目前nano版本只放了finsh,其它的都被删除了,master版本则放了非常多的组件。finsh是RT- Thread组件里面最具特色的,它通过串口打印的方式来输出各种信息,方便我们调试程序。这个文件夹中的内容不做任何操作

3.3、docs文件夹

在这个文件夹里面有一个 docs.txt 文件,里面的内容是一些资料的网站,可以直接删除该文件夹docs

3.4、 include文件夹

include目录下面存放的是RT-Thread内核的头文件,是内核不可分割的一部分。

3.5、libcpu文件夹

在这个文件夹中放的是一些硬件接口,Nano版本里面放的有 arm系列芯片接口risc-v系列芯片接口,本实验是基于STM32F103的,所以 risc-v文件夹直接删除,再打开arm文件夹后,后发现里面也有好多文件夹,基本上是arm系列常见的架构,STM32F103是基于 cortex-m3内核的,所以我们将cortex-m3文件夹移动到 libcpu文件夹,其他的都删除。

3.6、 src文件夹

src目录下面存放的是RT-Thread内核的源文件,是内核的核心

4、修改Makefile

使用VSCode打开这个工程,接着打开Makefile

4.1、添加头文件路径

在头文件包含(C_INCLUDES)后面加入rt-thread源码中的头文件

# C includes
C_INCLUDES =  \
-I./User/Inc \
-I./Libraries/CMSIS \
-I./Libraries/STM32F10x_StdPeriph_Driver/inc \
-I./rt-thread/bsp     \
-I./rt-thread/include \
-I./rt-thread/libc    \
-I./rt-thread/components/finsh \
$(USER_INC)

如下图:

4.2、添加源文件.c

定义一个变量用来存放rt-thread的源文件路径:

# rt-thread源码
RTT_SOURCE = \
	$(wildcard ./rt-thread/bsp/*.c)               \
	$(wildcard ./rt-thread/libcpu/cortex-m3/*.c)  \
	$(wildcard ./rt-thread/src/*.c)

在Makefile的变量 C_SOURCES 后面加入变量 RTT_SOURCE:

4.3、添加接口文件.s

本教程是基于gcc的,所以我们使用的是 context_gcc.S 文件,找到Makefile中的变量 ASM_SOURCES ,在它后面添加 context_gcc.S 文件,再添加之前,将文件context_gcc.S大S后缀更改为小写s:

此时Makefile已经修改完成,下面将进行修改工程中的C文件。

5、修改工程代码

5.1、修改 stm32f10x_it.c 文件

此时,我们可以使用make命令构建一下此工程,构建结束后会报3个错误:

SysTick_Handler、PendSV_Handler、HardFault_Handler这三个函数重复定义,因为在接口文件 context_gcc.S 中已经实现了,此时应该将 stm32f10x_it.c 中的这三个中断处理函数屏蔽掉。

现在我们再使用make指令构建一下会发现可以正常编译了:

6、测试RT-Thread

接下来用动态线程的创建方法,而系统默认的是静态创建方法,所以先要修改配置文件,打开rtconfig.h 文件,使用搜索功能搜索 RT_USING_HEAP ,并将这个宏取消注释:

接着在 main.c 加入以下内容:

#include "stm32f10x.h"
#include "bsp_led.h"
 
#include <rthw.h>
#include "rtthread.h"
 
/* 定义线程控制块 */
static rt_thread_t led_thread = RT_NULL;
 
/*
*************************************************************************
*                             函数声明
*************************************************************************
*/
static void led_thread_entry(void* parameter);
 
 
int main( void )
{
 
    /* LED 端口初始化 */
    LED_GPIO_Config();
 
   led_thread =                          /* 线程控制块指针 */
    rt_thread_create( "led",              /* 线程名字 */
                      led_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      512,                 /* 线程栈大小 */
                      3,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                   
    /* 启动线程,开启调度 */
	rt_thread_startup(led_thread);
}
/*
*************************************************************************
*                             线程定义
*************************************************************************
*/
static void led_thread_entry(void* parameter)
{	
	while (1)
	{
		LED_G(ON);
		rt_thread_delay(500);   /* 延时500个tick */
	
		LED_G(OFF);     
		rt_thread_delay(500);   /* 延时500个tick */		 		
	
	}
}
 

重新构建后下载到开发板后,看一下效果。

呀,呀,呀,发现没有达到预期的效果,别着急,此时我们需要修改一下STM32的启动文件,根据
你自己的芯片型号选则:

在.s文件中将 bl main 修改为 bl entry:

修改之后再重新构建一下并下载到开发板后,就会发现LED小灯闪烁。

本教程只做了一个简单的移植,后面应该还有很多细节需要处理,这里就不过多演示了

本篇文章所用的开发板是野火的指南者型号,想要移植好的工程,评论区见~

物联沃分享整理
物联沃-IOTWORD物联网 » 使用gcc手把手教你将RT-Thread移植到STM32平台

发表评论