【单片机笔记】基于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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值