当前位置:   article > 正文

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

rt thread 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 文件夹下面拷贝过来的,里面存放的是与硬件相 关的初始化函数

 把该删的删了,最后留下这些:

  1. /* 开发板硬件相关头文件 */
  2. #include "board.h"
  3. /* RT-Thread相关头文件 */
  4. #include <rthw.h>
  5. #include <rtthread.h>
  6. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  7. #define RT_HEAP_SIZE 1024
  8. /* 从内部SRAM里面分配一部分静态内存来作为rtt的堆空间,这里配置为4KB */
  9. static uint32_t rt_heap[RT_HEAP_SIZE];
  10. RT_WEAK void *rt_heap_begin_get(void)
  11. {
  12. return rt_heap;
  13. }
  14. RT_WEAK void *rt_heap_end_get(void)
  15. {
  16. return rt_heap + RT_HEAP_SIZE;
  17. }
  18. #endif
  19. /**
  20. * @brief 开发板硬件初始化函数
  21. * @param 无
  22. * @retval 无
  23. *
  24. * @attention
  25. * RTT把开发板相关的初始化函数统一放到board.c文件中实现,
  26. * 当然,你想把这些函数统一放到main.c文件也是可以的。
  27. */
  28. void rt_hw_board_init()
  29. {
  30. /* 初始化SysTick */
  31. SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND );
  32. /* 硬件BSP初始化统统放在这里,比如LED,串口,LCD等 */
  33. /* 调用组件初始化函数 (use INIT_BOARD_EXPORT()) */
  34. #ifdef RT_USING_COMPONENTS_INIT
  35. rt_components_board_init();
  36. #endif
  37. #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
  38. rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  39. #endif
  40. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  41. rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
  42. #endif
  43. }
  44. /**
  45. * @brief SysTick中断服务函数
  46. * @param 无
  47. * @retval 无
  48. *
  49. * @attention
  50. * SysTick中断服务函数在固件库文件stm32f10x_it.c中也定义了,而现在
  51. * 在board.c中又定义一次,那么编译的时候会出现重复定义的错误,解决
  52. * 方法是可以把stm32f10x_it.c中的注释或者删除即可。
  53. */
  54. void SysTick_Handler(void)
  55. {
  56. /* 进入中断 */
  57. rt_interrupt_enter();
  58. /* 更新时基 */
  59. rt_tick_increase();
  60. /* 离开中断 */
  61. rt_interrupt_leave();
  62. }

然后borad.h是自己新建的,在 user 目录下新建一个 board.h 头文件,用来包含固件库和 BSP 相关的头文件和存放 board.c 里面的函数声明:

  1. #ifndef __BOARD_H__
  2. #define __BOARD_H__
  3. #include "stm32f10x.h"
  4. void rt_hw_board_init(void);
  5. void SysTick_Handler(void);
  6. #endif

2.5最后注意:

SysTick中断服务函数在固件库文件stm32f10x_it.c中也定义了,而现在
  在board.c中又定义一次,那么编译的时候会出现重复定义的错误,解决
  方法是可以把stm32f10x_it.c中的注释或者删除即可。

全选注释即可,里面都是空函数

到现在准备工作都完成了!

3.最后的mian函数:

主函数添加这两个头文件就行了

  1. #include <rtthread.h>
  2. #include "board.h"
  3. int main(void)
  4. {
  5. }

和硬件相关的头文件放在board.h里面:比如

硬件初始化放在:board.c中的void rt_hw_board_init()里,

因为这个函数比main函数还要先执行,因此就不放在main里面了

4.到现在移植结束了。

参考了野火的《RT-Thread 内核实现与应用开发实战指南》

​​​​​​​

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/67476
推荐阅读
相关标签
  

闽ICP备14008679号