手把手教你移植rt-thread到stm32f10x(keil)

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 内核实现与应用开发实战指南》

​​​​​​​

  • 23
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值