[应用相关] RT-Thread NANO V 4.1.1 的移植

[复制链接]
29|1
Xiashiqi 发表于 2026-2-3 18:44 | 显示全部楼层 |阅读模式
1.RT-Thread Nano 的功能介绍
        RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 ARM 入门级 MCU 的场合。
下图是 RT-Thread Nano 的软件框图,包含支持的 CPU 架构与内核源码,还有可拆卸的 FinSH 组件

         8433569804c37062a0.png

支持架构:ARM:Cortex M0/ M3/ M4/ M7 等、RISC-V 及其他。

功能:线程管理、线程间同步与通信、时钟管理、中断管理、内存管理。

2.RT-Thread Nano V4.1.1
        4.1.1版本是当前NANO最新的内核系统,这个版本官网提供的SDK中在堆栈的动态内存分配的管理中存在一些问题,可能是工作人员在调整代码时忘记修改匹配对应内存管理的匹配算法,导致系统的堆栈内存没有配正确初始化,导致对应的api功能不能正常使用,此次移植过程中以进行修改。

2.1.1RT-thread NANO V4.1.1源码的获取
        源码链接如下:
null
https://github.com/RT-Thread/rtthread-nano

6241269804c2fdaff5.png

2.1.2移植过程
        首先将解压好的文件放到我们的工程目录下:

4839169804c2abc475.png

        然后将文件夹下,src文件内的所有文件添加到工程对应的属组中,具体如下:

9818069804c26b0431.png

        再将下图对应目录下的board.c和rtconfig.h文件添加到对应的工程属组中,具体如下:

4298569804c1c490ae.png

        再添加rt-thread nano支持系统的对应内核文件,具体如下:      

757369804c182a1a7.png

        这里博主的MCU是M0的内核,这里各位可以根据自己芯片的内核选择不同内核文件。

        添加好的工程文件如下图所示:

8314769804c13ce098.png

        然后在工程中包含对应的系统库头文件的路径,具体如下:

8932769804c0e0126d.png

        这里博主是将bsp文件下的对应的board.c放到了src文件下,rtconfig.h文件放到了对应的include文件下。

        到这里,RT-thread nano对应的系统文件以及添加到了我们的工程中。

2.1.3代码的修改
        由于NANO系统已经实现了,HardFault_Handler和SVC_Handler等中断服务函数,故需要将原本的中断服务函数屏蔽或者之间删除。另外RT-Thread的系统运行是基于系统定时器进行运行的,故需要对系统定时器进行配置,对应系统定时器的配置可以根据自己的芯片手册进行配置,配置完成后找到系统定时器的中断服务函数,具体如下:      

9724269804c0820729.png

        点击右键跳转到对应的服务函数中,若无对应的服务函数,可以根据如下形式进行定义:

5483969804c029b9b8.png

        这里我们将定时器中断调用的服务函数中的内容放到系统定时器的中断服务函数中。完成后,找到对应的RT-THREAD NANO系统对应的相关硬件的初始化,具体如下:

2212069804bfe439f5.png

        这里,对系统定时器进行了配置,及对RTT进行了初始话,方便进行后续的调试。

        完成这些代码的修改后,若程序有50个作用的报错后,是有对应的头文件没有被包含,再如下图所示的文件中包含对应的头文件即可,具体如下:      

2390469804bf6bfedc.png

        完成后,程序基本就不会报错了。

        然后再main.c文件中编写对应的系统测试函数,具体如下图:

1727769804bf08a7e0.png

        RT-thread 系统中main函数是作为系统的一个线程进行执行的程序,系统再进入main函数前会优先执行如下图所示的函数:

7604069804beb39ad8.png

        这个函就是RT-thread系统的启动功能,其中包含了各种硬件以及软件的初始化,感兴趣的可以详细看一下。

        当系统初始化并且启动后,才会执行对应main函数,也就是我们所说的线程。

        main函数中的内容修改完成后,可以将代码烧录至我们的IC中,通过RTT,或者各位可以调试的功能观察情况。

        烧录完成后,我们发现,系统一直处于空闲状态下,对应的main线程并没有正常的启动,这时,便发现系统正常启动了,但是创建的对应线程也没有启动,于是我在如下图所示的内容中添加了一系列的调试信息,具体如下:      

7602569804be2251c3.png

        rt_application_init这个函数在刚刚的rtthread_startup函数中有对应的信息,系统启动后创建了main线程,并且启动了main线程。

8503769804bdcc7348.png

        这里添加了调试信息后,发现这个tid的返回值为0,说明了当前main线程创建失败了,这个时百思不得,又在创建线程的函数中添加了对应的调试信息,具体如下:

5675269804bd843f91.png

        将修改后的代码烧录后,发现在创建线程时,为系统对象申请内存空间失败了。

        解决上述问题的方法具体如下:

8176969804bd1cb9ac.png       

        上图表示,当前系统使用的内存分配算法为小内存分配算法,而NANO系统在创建线程时是通过动态分配内存空间的,当前小内存的分配算法不适配NANO系统的内存申请,导致系统对应的堆栈没有被正确初始化,进而导致对应的api功能不能正常使用。

        在工程中全局搜索RT_USING_SMALL_MEM这个宏,将所有这个宏更换为此RT_USING_SMALL_MEM_AS_HEAP,然后将程序再进行编译和烧录,再去看日志,这时发现main线程已经正常运行了。

        于是我又编写了如下内容的主程序进行系统测试:

/************************************************************************************************/
/**
* @file               main.c
* @author             MCU Ecosystem Development Team
* @brief              应用程序主流程。
*                     
*
**************************************************************************************************
* @attention
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
*
**************************************************************************************************
*/

/*------------------------------------------includes--------------------------------------------*/
#include "main.h"

/*-------------------------------------------functions------------------------------------------*/
rt_thread_t task1handle = NULL;
rt_thread_t task2handle = NULL;

rt_thread_t task3handle = NULL;
void test1func(void *parameter)
{
        while(1)
        {
                SEGGER_RTT_printf(0,"test thread 1 is normal\r\n");
                rt_thread_mdelay(1000);
        }
}

void test2func(void *parameter)
{
        while(1)
        {
                SEGGER_RTT_printf(0,"test thread 2 is normal\r\n");
                rt_thread_mdelay(1000);
        }
}


void test3func(void *parameter)
{
        while(1)
        {
                SEGGER_RTT_printf(0,"thread 3 start success\r\n");
                rt_thread_mdelay(1000);
        }
}

int main(void)
{   
        task1handle = rt_thread_create("test thread1",test1func,NULL,256,3,20);
        if(!task1handle)
        {
                SEGGER_RTT_printf(0,"thread1 create is failed\r\n");
        }
        rt_thread_startup(task1handle);
       
        task2handle = rt_thread_create("test thread2",test2func,NULL,256,2,20);
       
        if(!task2handle)
        {
                SEGGER_RTT_printf(0,"thread2 create is failed\r\n");
        }
        rt_thread_startup(task2handle);

        if(RT_Thread_Create_AndStar(&task3handle,
                                                        "test thread3",
                                                        test3func,
                                                        NULL,256,3,20))
        {
                SEGGER_RTT_printf(0,"thread create is success and start thread\r\n");
        }
       
       
        while(1)
    {
                SEGGER_RTT_printf(0,"main\r\n");
                rt_thread_delay(1000);
    }
}



     此处对应的内容为博主个人实现的一个创建线程,并且启动线程的函数,这里就不详解释了。

2435369804bc04204b.png

         程序输出的日志如下:      

5740569804bb80a725.png

        可见系统创建的线程也已经正常运行了。

        至此,RT-Thread NANO V4.1.1版本的系统已移植完成。
————————————————
版权声明:本文为CSDN博主「wxy888888」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wxy888888/article/details/149193503

heisexingqisi 发表于 2026-2-6 14:39 | 显示全部楼层
移植的核心是适配目标芯片的底层硬件接口。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

388

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0