1.下载RT-Thread源码
1.1打开网站:Arm Keil | Devices
打开后就长上面那样,然后
1.2点击CMSIS Packs
点开后,
1.3在搜索栏输入RT-Thread,
回车:
你就看到了keil官网的pack包,点开它
1.4点击下载
下载3.0.3版本的(为什么不下最新版?因为3.0.3版本的参考资料多利于学习)
1.5安装
下载好了后点击打开,然后选择储存路径,(他一般默认存在你keil5的安装路径下面,所以不用改。)
安装成功之后,可以在 KEIL 的 PACK 目录下找到刚刚安装的 Package 的所 有的文件
找到keil的安装文件夹,点开PACK(如上图)
rtt的源码在RealThread里面:(如上图)
这就是T-thread的所有源码了,不过这是nano版本的,所谓nano版本就是rt-thread裁剪了多余的功能和组件,留下了操作系统的内核和重要组件,这对于初学者来说足够了
安装成功之后,就可以在 KEIL 里面的软件包管理器中将 RT-Thread Nano 直接添 加到工程里面,具体见图
2.裸机工程添加RT-Thread源码
找一个裸机32的工程,江科大的也可以火哥和原子哥的也可以,我用的江科大;然后按照上面说的打开rt-thread的源码
2.1源码文件夹介绍
先务必熟悉一下文件夹存放的文件为后续移植做准备
bsp :板级支持包,bsp 文件夹里面存放的是板级支持包,即 board support package 的英文缩写
components/finsh: RT-Thread 组件(finsh 是 RT-Thread 组件里面 最具特色的,它通过串口打印的方式来输出各种信息,方便我们调试程序)
include :头文件
ibcpu/arm/cortex-m3:与处理器相关的接口文件(f103是m3内核的处理器)
src :RT-Thread 内核源码(src 目录下面存放的是 RT-Thread 内核的源文件,是内核的核心)
2.2打开stm32f103裸机工程
上图是32的裸机工程。我们在裸机工程上一点一点加入rt-thread的源码
2.2.1 移植文件到User文件夹
拷贝 rtconfig.h 文件到 user 文件夹,拷贝 board.c 文件到 user 文件夹
1.RT-Thread/3.0.3/bsp 文件夹下面的 rtconfig.h 配套文件拷贝到工程根目录下面的 user 文件夹
2.将 RT-Thread/3.0.3/bsp 文件夹下面的 board.c 配套文件拷贝到工程根目录下面的 user 文 件夹
就是这两个,复制他们
然后再裸机的模版的User下粘贴:
复制粘贴总会吧
PS:rtconfig.h 是 RT-Thread 功能的配置头 文件,里面定义了很多宏,通过这些宏定义,我们可以裁剪 RT-Thread 的功能。用户在使 用 RT-Thread 的时候,用户只需要修改 board.c 和 rtconfig.h 这两个文件的内容即可,其它 文件我们不需要改动。
2.2.2添加 RT-Thread 源码到工程组文件夹
打开keil,新建 rtt/source 和 rtt/ports 组
不会新建?
右键Target1,然后看图:
然后:输入名字新建:rtt/source 和 rtt/ports
其中 rtt/source 用 于存放 src 文件夹的内容,rtt/ports 用于存放 libcpu/arm/cortex-m3文件夹的内容
建好后要添文件了:
刚刚复制到User路径下的两个文件先就加进去了(board.h先无视)
然后:一样的操作
这次的在你刚刚浏览器下载的源码包里的那个文件路径里找了,把src中的文件全部添加到:
接下来同样的操作:(再教一遍)
这次的在你刚刚浏览器下载的源码包里的那个文件路径里找了
找到了,加进去ADD;
到现在,该加的都加完了,但还没结束。。。。
2.3指定 RT-Thread 头文件的路径
RT-Thread 的源码已经添加到开发环境的组文件夹下面,编译的时候需要为这些源文 件 指 定 头 文 件 的 路 径 , 不 然 编 译 会 报 错 。我 们还将 RT-Thread\3.0.3\bsp 里面的 rtconfig.h 这个头文件拷贝到了工程根目录下的 user 文件 夹下,所以 user 的路径也要加到开发环境里面。RT-Thread 头文件的路径添加完成后的效 果具体见图
RT-Thread 的 源 码 里 面 只 有 RT-Thread\3.0.3\components\finsh、RT-Thread\3.0.3\include 和 RT-Thread\3.0.3\include\libc 这三 个文件夹下面有头文件,只需要将这三个头文件的路径在开发环境里面指定即可
配置结束,然后就改一改宏定义就能用了。。。。
2.4增删改
2.4.1修改 rtconfig.h
rtconfig.h 是直接从 RT-Thread/3.0.3/bsp 文件夹下面拷贝过来的,该头文件对裁剪整个 RT-Thread 所需的功能的宏均做了定义,有些宏定义被使能,有些宏定义被失能,一开始 我们只需要配置最简单的功能即可。
rtconfig.h 头文件的内容修改的不多,具体是:注释掉头文件 RTE_Components.h、修 改 了 RT_THREAD_PRIORITY_MAX 、 RT_TICK_PER_SECOND 和 RT_MAIN_THREAD_STACK_SIZE 这三个宏的大小
2.4.2修改 board.c
board.c 是直接从 RT-Thread/3.0.3/bsp 文件夹下面拷贝过来的,里面存放的是与硬件相 关的初始化函数
把该删的删了,最后留下这些:
/* 开发板硬件相关头文件 */
#include "board.h"
/* RT-Thread相关头文件 */
#include <rthw.h>
#include <rtthread.h>
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#define RT_HEAP_SIZE 1024
/* 从内部SRAM里面分配一部分静态内存来作为rtt的堆空间,这里配置为4KB */
static uint32_t rt_heap[RT_HEAP_SIZE];
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
/**
* @brief 开发板硬件初始化函数
* @param 无
* @retval 无
*
* @attention
* RTT把开发板相关的初始化函数统一放到board.c文件中实现,
* 当然,你想把这些函数统一放到main.c文件也是可以的。
*/
void rt_hw_board_init()
{
/* 初始化SysTick */
SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND );
/* 硬件BSP初始化统统放在这里,比如LED,串口,LCD等 */
/* 调用组件初始化函数 (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
}
/**
* @brief SysTick中断服务函数
* @param 无
* @retval 无
*
* @attention
* SysTick中断服务函数在固件库文件stm32f10x_it.c中也定义了,而现在
* 在board.c中又定义一次,那么编译的时候会出现重复定义的错误,解决
* 方法是可以把stm32f10x_it.c中的注释或者删除即可。
*/
void SysTick_Handler(void)
{
/* 进入中断 */
rt_interrupt_enter();
/* 更新时基 */
rt_tick_increase();
/* 离开中断 */
rt_interrupt_leave();
}
然后borad.h是自己新建的,在 user 目录下新建一个 board.h 头文件,用来包含固件库和 BSP 相关的头文件和存放 board.c 里面的函数声明:
#ifndef __BOARD_H__
#define __BOARD_H__
#include "stm32f10x.h"
void rt_hw_board_init(void);
void SysTick_Handler(void);
#endif
2.5最后注意:
SysTick中断服务函数在固件库文件stm32f10x_it.c中也定义了,而现在
在board.c中又定义一次,那么编译的时候会出现重复定义的错误,解决
方法是可以把stm32f10x_it.c中的注释或者删除即可。
全选注释即可,里面都是空函数
到现在准备工作都完成了!
3.最后的mian函数:
主函数添加这两个头文件就行了
#include <rtthread.h>
#include "board.h"
int main(void)
{
}
和硬件相关的头文件放在board.h里面:比如
硬件初始化放在:board.c中的void rt_hw_board_init()里,
因为这个函数比main函数还要先执行,因此就不放在main里面了
4.到现在移植结束了。
参考了野火的《RT-Thread 内核实现与应用开发实战指南》