2019物联网开发者大会 12.06 北京北辰洲际酒店→ 报名参会 ←
电子产品世界 » 论坛首页 » 高校专区 » 坤创E-Geek/天科大新电社 » RT-Thread操作系统在STM32上的移植

共6条 1/1 1 跳转至

RT-Thread操作系统在STM32上的移植

高工
2019-10-10 23:33:49    评分

1.准备工作:RT-Thread源码、STM32基础工程。

RT-Thread Nano源码获取,Nano去除了各种开发板的BSP,保留了OS核心功能。下载地址:https://github.com/RTThread/rt-thread

下载好RT-Thread Package后RT-Thread Package 容量很小)我们直接将安装在 KEIL PACK 目录下,然后将整个 RT-Thread 文件夹拷贝到我们的STM32 裸机工程里面RT-Thread 文件夹目录如下:

 

图片35.png


BSP:板级支持包;

components/finshRT-Thread组件;

include:头文件;

libcpu:与处理器相关的接口文件;

srcRT-Thread 内核源码
2. 在基础工程上新建RT-Thread文件夹,并在该文件夹下新建RT-Thread-PortRT-Thread-SourceRT-Thread-Include文件夹。

图片36.png


3.将路径RT-Thread/3.0.3/文件夹下面的 rtconfig.h和board.c文件复制到到user文件夹下。

图片37.png

4.将RT-Thread/3.0.3/src文件夹下的所有文件复制到新建的RT-Thread-Source文件夹中。

图片38.png

5.RT-Thread-Source文件夹的内容

图片39.png

6.将路径RT-Thread/3.0.3/libcpu/arm/cortex-m0/文件夹下的context_rvds.S文件和

cpuport.c文件复制到新建的RT-Thread-Port文件夹中。

图片40.png

7.RT-Thread-Port文件夹的内容

图片41.png

8.将路径RT-Thread\3.0.3\components\finsh文件夹复制到新建的RT-Thread-Include文件夹中。

图片42.png

9.将路径RT-Thread\3.0.3\include文件夹下的内容复制到新建的RT-Thread-Include文件夹中。

图片43.png


10.RT-Thread-Include文件夹内容如下

图片44.png

11.Keil新建RT-Thread-Source与RT-Thread-Port分组。

图片45.png

12.向RT-Thread-Source分组添加文件,将RT-Thread-Source文件夹的内容全部添加进去。

图片46.png

13.向RT-Thread-Port分组添加文件,将RT-Thread-Port文件夹的内容全部添加进去,不要忘记添加context_rvds.S文件哦!

图片47.png

14.向User分组中添加 rtconfig.h board.c 文件。

图片48.png


15. 最后就是将对应的头文件添加进去,将RT-Thread-Include文件夹的头文件路径添加进去。

图片49.png

16.第一次尝试编译,看是否会报错,不出意料肯定很多错误,这里提示不能打开RTE_Components.h 头文件。

图片50.png

17.原因是头文件 RTE_Components.h 是在 MDK 中添加 RT-Thead Package 时由 MDK 自动生成的,目前我们没有使用 MDK 中自带的 RT-Thread 的 Package,所以这个头文件不存在,如果包含了该头文件,编译的时候会报错,需要注释掉该头文件

图片51.png

18.再次编译,就剩下2处错误了,这样看着比刚才舒服多了,哈哈!这,这个提示很简单,一看就是stm32f10x_it.c和系统重复定义了中断函数。

图片52.png

19.将stm32f10x_it.c文件中的对应中断函数PendSV_HandlerHardFault_Handler SysTick_Handler屏蔽,再次编译就不会报错了。

图片53.png

图片54.png

虽然这里的RT-Thread工程已经移植好了,我们还是需要对一些配置进行修改,进一步了解RT-Thread!

修改rtconfig.h文件,rtconfig.h 是直接从 RT-Thread/3.0.3/bsp 文件夹下面拷贝过来的,该头文件对裁剪整个RT-Thread 所需的功能的宏均做了定义,有些宏定义被使能,有些宏定义被失能,一开始我们只需要配置最简单的功能即可,要想随心所欲的配置 RT-Thread 的功能,我们必须对这些宏定义的功能有所掌握

#define RT_THREAD_PRIORITY_MAX  8 

//表示 RT-Thread 支持多少个优先级,取值范围为 8~256,默认为 32。

#define RT_TICK_PER_SECOND 1000

//表示操作系统每秒钟有多少个 tick即是操作系统的时钟周期,默认为 1000,即操作系统的时钟周期 tick 等于 1ms。

#define RT_ALIGN_SIZE  4

//表示 CPU 处理的数据需要多少个字节对齐,默认为 4 个字节

#define RT_NAME_MAX  8
//表示内核对象名字的最大长度,取值范围为 2~16,默认为 8。

#define RT_USING_COMPONENTS_INIT

//RT-Thread 组件初始化,默认使能

#define RT_USING_USER_MAIN

//使用用户 main 函数,默认打开

#define RT_MAIN_THREAD_STACK_SIZE    512

// main 线程栈大小,取值范围为 1~4086,单位为字节,默认为512
#define RT_DEBUG_INIT   0

//调试配置。包括了内核调试配置,组件调试配置和线程栈溢出检测,目前全部关闭

#define RT_USING_TIMER_SOFT  0

//软件定时器配置,目前关闭,不使用软件定时器

#define RT_USING_SEMAPHORE

//内部通信配置,包括信号量、互斥量、事件、邮箱和消息队列,根据需要配置

#define RT_USING_SMALL_MEM

//内存管理配置

#define RT_USING_CONSOLE

//控制台配置。控制台即是 rt_kprintf()函数调试输出的设备,通常使用串口

修改board.cboard.c 是直接从 RT-Thread/3.0.3/bsp 文件夹下面拷贝过来的, 里面存放的是与硬件相关的初始化函数

static uint32_t _SysTick_Config(rt_uint32_t ticks)

//相关的寄存器定义和初始化函数,这个是跟处理器相关的,直接使用固件库函数,将其注释。

void *rt_heap_begin_get(void)  void *rt_heap_end_get(void)

//RT-Thread 堆配置,如果同时定义了 RT_USING_USER_MAIN 和RT_USING_HEAP 这两个宏, 表示 RT-Thread 里面创建内核对象时使用动态内存分配方案。

void rt_hw_board_init()

//RT-Thread 启动的时候会调用一个名为 rt_hw_board_init()的函数,从函数名称我们可以知道它是用来初始化开发板硬件的,比如时钟,比如串口等

void SysTick_Handler(void)

//SysTick 中断服务函数是一个非常重要的函数, RT-Thread 所有跟时间相关的事情都在里面处理

user 目录下新建一个 board.h 头文件,用来包含固件库和BSP 相关的头文件

图片55.png

board.h 头文件中代码如下

 

图片56.png


修改board.c中的代码,具体如下:

#include "board.h"
#include <rthw.h>
#include <rtthread.h>
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#define RT_HEAP_SIZE 1024
static uint32_t rt_heap[RT_HEAP_SIZE]; // heap default size: 4K(1024 * 4)
RT_WEAK void *rt_heap_begin_get(void)
{
    return rt_heap;
}
 
RT_WEAK void *rt_heap_end_get(void)
{
    return rt_heap + RT_HEAP_SIZE;
}
#endif
 
/**
 * This function will initial your board.
 */
void rt_hw_board_init()
{
/* System Clock Update */
SystemCoreClockUpdate();
    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}
void SysTick_Handler(void)
{
/* enter interrupt */
rt_interrupt_enter();
rt_tick_increase();
/* leave interrupt */
rt_interrupt_leave();
}


至此,RT-Thread的移植,我们也都全部进行完了,虽然RTT是国产操作系统,但是我个人还是很喜欢的。希望大家也能体会到它的乐趣!





关键词: RT-Thread     操作系统     STM32     移植         

助工
2019-10-15 18:31:00    评分
2楼

都快出完整一个系列了!


高工
2019-10-24 20:54:04    评分
3楼

给楼主点赞,整理的很详细


助工
2019-10-26 14:27:38    评分
4楼

干货   谢谢分享


助工
2019-10-26 14:34:16    评分
5楼

学习一下  谢谢分享


助工
2019-10-26 14:57:25    评分
6楼

感谢楼主分享


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]