单片机笔记基于Cotex-M3的RT-Thread的移植
Posted 沉默的小宇宙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机笔记基于Cotex-M3的RT-Thread的移植相关的知识,希望对你有一定的参考价值。
1、下载官方github源码
NANO版本
rt-thread 标签 - Gitee.comhttps://gitee.com/rtthread/rt-thread/tags这两个版本的区别顾名思义了,无非是芯片、组件等支持的多少,但是我认为对于内核一样应该是一样的。我这里下载nano版本的,小一点。
分析下源码的目录结构
2、准备一个基础的demo工程,我这里用的是apm32
3、在demo工程下创建一个RT-Thread文件夹用以存放文件
然后将RT-Thread相关文件全部拷贝过到里面去
删除不需要的文件以节省工程存储空间
1) 删除docs、删除其他RT-Thread目录下非目录文件
2)BSP下面只保留以下两个文件
3)libcpu目录仅保留所使用的内核即可,我这里使用的是cortex-m3,其他不用的删掉即可
4、打开Demo工程,并配置
1)为方便分层,新建3个目录,分别存放内核、接口、配置
2)添加文件
内核添加src下面的文件,全部添加即可。
接口添加libcpu下面对应的文件
这里因为是keil工程,所以添加的是rvds.S,其他gcc/iar添加对应的即可。
配置文件,bsp下面的文件
3)配置头文件包含
4)解决编译报错
定位这个错误,将其删除即可 再次编译
解决重复定义问题
注释掉原工程对应的函数
再次编译
至此报错问题就算解决了。
5、修改时钟及滴答配置
在常用头文件中添加RT-Thread的常用头文件
延时相关函数
/** @fn u32 micros(void)
* @brief 获取系统运行时间
* @param none
* @return 系统运行时间:us单位
* @note rollover in 70minutes
*/
u32 micros(void)
register u32 uiMs, uiCycleNnt;
do
uiMs = millis();
uiCycleNnt = SysTick->VAL;
while (uiMs != millis());
return (uiMs * 1000) + (usTicks * 1000 - uiCycleNnt) / usTicks;
/** @fn u32 millis(void)
* @brief 获取系统运行时间
* @param none
* @return 系统运行时间:ms单位
* @note rollover in 49 days
*/
u32 millis(void)
return rt_tick_get();
/** @fn void delay_us(u32 uiUs)
* @brief 微秒延时
* @param uiUs : n微秒
* @return none
*/
void delay_us(u32 uiUs)
u32 uiNow = micros();
while (micros() - uiNow < uiUs)
;
/** @fn void delay_ms(u32 uiMs)
* @brief 毫秒延时
* @param uiUs : n毫秒
* @return none
*/
void delay_ms(u32 uiMs)
rt_thread_mdelay(uiMs);
6、编写线程测试
#include "bsp_led.h"
#include "rthw.h"
#include <rtthread.h>
#include "bsp_systick.h"
static rt_thread_t thread_1;
static rt_thread_t thread_2;
void led1_thread(void *parameter)
while(1)
LED1_TOG;
delay_ms(200);
void led2_thread(void *parameter)
while(1)
LED2_TOG;
delay_ms(200);
int main(void)
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /*全部配置为抢占式*/
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO);
GPIO_ConfigPinRemap(GPIO_REMAP_SWJ_JTAGDISABLE); /* 关闭JTAG ,保留SWD */
led_config();
thread_1 = rt_thread_create("thread_1",led1_thread,0,128,0,30 );
if(RT_NULL != thread_1)
rt_thread_startup(thread_1);
thread_2 = rt_thread_create("thread_2",led2_thread,0,128,0,30 );
if(RT_NULL != thread_2)
rt_thread_startup(thread_2);
while(1)
LED3_TOG;
delay_ms(1000);
编译发现rt_thread_create接口未定义,需要在rtconfg中把RT_USING_HEAP宏放开。
至此就完成基本的功能移植。
By Urien 2022.04.05
以上是关于单片机笔记基于Cotex-M3的RT-Thread的移植的主要内容,如果未能解决你的问题,请参考以下文章
RT-Thread学习笔记 --RT-Thread内存管理学习总结
RT-Thread&BearPi 开发笔记 -- 小熊派基于RT-Thread接入腾讯云物联网开发平台