单片机笔记基于Cotex-M3的RT-Thread的移植

Posted 沉默的小宇宙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机笔记基于Cotex-M3的RT-Thread的移植相关的知识,希望对你有一定的参考价值。

1、下载官方github源码

        NANO版本

https://github.com/RT-Thread/rtthread-nano/archive/refs/heads/master.ziphttps://github.com/RT-Thread/rtthread-nano/archive/refs/heads/master.zip        完整发行版

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接入腾讯云物联网开发平台

RT-Thread&BearPi 开发笔记 -- 小熊派基于RT-Thread使用ESP8266进行网络连接

RT-THREAD的升级方案

Cotex-M3内核LPC17xx系列时钟及其配置方法

直播预告基于TI MSP432P401R单片机的移植