基于正点原子战舰版RT-Thread嵌入式实时系统移植

移植RT-Thread到STM32f103

本文介绍的是基于keil mdk移植 RT-Thread Nano 。本历程亲测有效,可以完成所有的系统rtt历程。废话不多说,直接上干货。
	移植RT-Thread Nano的主要步骤:
		1:准备一个基于keil的基础工程,例如最简单的裸机历程点亮led灯。
		2:准备一份RT-Thread Nano源码,下载地址:https://www.rt-thread.org/download/mdk/   选择3.1.3版本
		3:点击安装刚下载的RT-Thread Nano.exe,安装目录选择跟keil安装目录一致
		4:进行适配,修改board.c文件和rtconfig.h文件。

## Nano pack安装
RT-Thread Nano安装有两种方式,一种是在MDK内部进行安装,不需要再去网站上下载,一种是手动安装。
方法1:mdk内部安装
打开mdk软件,点击工具栏上的pack installer
在这里插入图片描述
找到real rt_thread 一栏,点击install进行安装
在这里插入图片描述
方法2:手动安装
我选择的就是本地安装,至于为什么手动安装而不选择相对简单的内部mdk安装,省事还不容易出错。如果是基于mdk内部安装的pack包的话,当本工程文件拷贝到一个没有安装过RT-Thread Nano 源码的主机中,就会提示找不到源文件,鉴于pack包容量很小,我们就直接将安装在keil pack目录下的整个RT-thread源码文件拷贝到我们得工程文件中。
在这里插入图片描述
添加RT-Thread Nano 到工程
在开发环境中我们新建两个文件夹 rtt/source 和rtt/ports ,source中存放的是src中的内容,ports中存放的是libcpu\arm\cotex-m3中的内容。你是哪个内核版本的就选择哪个内核版本的文件。
将3.1.3/bsp文件夹下的board.c和rtconfig.h文件复制到user目录下,以方便对rt进行功能配置,最终如图所示:

在这里插入图片描述
指定头文件路径
指定rt_thread 的头文件路径,跟裸机开发是一样的。
我们需要将RT-thread源码中的rt-thread/3.1.3/components/finsh , rt-tread/3.1.3/include, rt-thread/3.1.3/include/libc这个三个文件包含在头文件路径中。
在这里插入图片描述
至此,整个系统移植已经完成了一大半了,可以说是基本成功了,剩下的就是修改一些时钟,中断,得以跟stm32系列的匹配。你看我们移植过来的文件还是有十几个,别看这么多,只需要我们修改的就两个文件,board.c和rtconfig.h。而且这两个文件里面的函数也不多也不复杂,很容易理解。
rtconfig.h文件里面主要是一些宏定义,用于功能的配置,假如你不需要这么多功能,就可以关闭这个宏。只不过这个文件是用配置表的语法进行编写的,有些人可能看起来不舒服,在mdk中是有configration wizard可以打开的,比较方便。
board.c 文件里面主要是对板子上硬件的一些初始化,例如时钟,定时器等等。
rtconfig.h文件修改
1:注释掉#include “RTE_Components.h”
2:修改宏RT_THREAD_PRIORITY_MAX 为 32
3:修改宏RT_TICK_PER_SECOND 1000 1000个节拍等于1ms
4:修改宏RT_MAIN_THREAD_STACK_SIZE 256 可自己修改具体大小
在这里插入图片描述

board.c 文件修改
1:新创建一个board.h的头文件
2:注释内核外设相关寄存器,系统时钟初始化。我们使用M3内核的系统时钟,不使用rtt的。关于中断的,我们也可以进行屏蔽 使用M3的。也可以保留看个人喜好。
在这里插入图片描述
在这里插入图片描述
至此,整个系统已经移植完毕了,此时我们点击编译,看是否移植成功。编译完后我们会发现还有三个错误的地方,提示我们得函数被重复定义了,这种错误的产生是因为我们stm32中定义的函数跟rtt中定义的函数重复了,至于你选择屏蔽哪个随你心意。我屏蔽是的stm32里面的,这样简单一些。
在stm32f10x_it.c文件中,将 void HardFault_Handler(void); void PendSV_Handler(void);void SysTick_Handler(void)这三个函数屏蔽。再次编译就ok了。
编写一个简单的单线程例子
在这里插入图片描述
由于你们看不到led是否闪烁,我们在窗口输出打印信息。这里还涉及到rt_kprintf()函数的重载,可以换成串口里面的重定义printf()函数。不管是什么,只要能过后输出信息即可。
注意事项:
我是在board,c文件里面进行的硬件初始化,没有在main函数里面,至于为什么可以在这个地方进行硬件初始化,还涉及到拓展main的知识,我会在另一篇文章中进行详解,目前这里你只需要知道这样做就可以了。
over!!!!!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值