RT-Thread Nano移植到STM32心得(基于GCC、HAL库)

发布于:2025-08-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

环境说明

1、芯片:STM32H723ZGT6(Cortex-M7)
2、编译和开发环境:arm-none-eabi-gcc、cmake、ninja(可换为make或mingw32-make)、VsCode(可不需要)、windows系统
3、裸机代码生成:STM32CubeMX
4、烧录:STM32CubeProgrammer

RT-Thread Nano移植

(一)基本框架移植

参考官方IAR教程:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/nano-port-iar/an0040-nano-port-iar

主要步骤:

1、复制rtthread nano源码的include、src、libmcu/arm/cortext-m7(选自己的目标芯片架构)、bsp/的board.c和rtconfig.h文件到自己的裸机工程下(可新建rtthread_nano目录)(记得在cmake中添加)

本项目使用的是gcc编译,所以启动脚本选 context_gcc.S

2、删除Core/Src/stm32h7xx_it.c的中断处理函数 HardFault_Handler()、PendSV_Handler()、SysTick_Handler()

3、修改board.c文件(参考官方教程)

4、(重点,使用gcc编译时需要此步骤,官方教程在刚开始的时候提到,后面具体步骤时没有提醒)将stm32启动脚本(startup_stm32h723xx.s)的入口函数main改为entry:

在这里插入图片描述

5、注释掉 rtconfig.h 的 【RT_USING_HEAP】和【RT_USING_SMALL_MEM】

在这里插入图片描述

6、注释掉 main() 函数的MPU_Config()函数

(二)移植rt_kprintf

cubemx中添加串口配置,在board.c的rt_hw_board_init()函数调用MX_USARTx_UART_Init()初始化

(三)移植FinSH

复制components文件夹到自己项目RTThread目录下,并通过cmakrlists添加源码

复制finsh_config.h到刚添加的目录 RTThread/components/finsh 下
(rtthread-nano源码中的bsp目录下是官方移植好的例子,可以从中复制一些配置好的文件到自己项目中使用,比如finsh_config.h)

修改board.c文件(参考官方教程:在 Nano 上添加 FinSH 组件(实现命令输入)

修改.ld链接脚本的 .text段为如下内容(主要是添加了一部分内容),这可以让INIT_BOARD_EXPORT等一些宏能够生效。

.text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    /* section information for finsh shell */
    . = ALIGN(4);
    __fsymtab_start = .;
    KEEP(*(FSymTab))
    __fsymtab_end = .;

    . = ALIGN(4);
    __vsymtab_start = .;
    KEEP(*(VSymTab))
    __vsymtab_end = .;

    /* section information for initial. */
    . = ALIGN(4);
    __rt_init_start = .;
    KEEP(*(SORT(.rti_fn*)))
    __rt_init_end = .;

    . = ALIGN(4);

    PROVIDE(__ctors_start__ = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array))
    PROVIDE(__ctors_end__ = .);

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH

添加的部分内容为:

/* section information for finsh shell */
    . = ALIGN(4);
    __fsymtab_start = .;
    KEEP(*(FSymTab))
    __fsymtab_end = .;

    . = ALIGN(4);
    __vsymtab_start = .;
    KEEP(*(VSymTab))
    __vsymtab_end = .;

    /* section information for initial. */
    . = ALIGN(4);
    __rt_init_start = .;
    KEEP(*(SORT(.rti_fn*)))
    __rt_init_end = .;

    . = ALIGN(4);

    PROVIDE(__ctors_start__ = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array))
    PROVIDE(__ctors_end__ = .);

这部分内容是从官方rtthread标准版源码的bsp的例子中获取的

(四)移植总结

1、复制内核rtos到自己的工程

2、复制跟底层硬件相关的代码(如libcpu中的代码)

3、复制并修改移植文件,如board.c

4、内核配置(与裁剪),如rtconfig.h

5、修改启动文件(如修改stm32启动文件的入口函数)

6、修改ld链接脚本

(五)项目开源地址

点击前往


网站公告

今日签到

点亮在社区的每一天
去签到