环境说明
1、芯片:STM32H723ZGT6(Cortex-M7)
2、编译和开发环境:arm-none-eabi-gcc、cmake、ninja(可换为make或mingw32-make)、VsCode(可不需要)、windows系统
3、裸机代码生成:STM32CubeMX
4、烧录:STM32CubeProgrammer
RT-Thread Nano移植
(一)基本框架移植
主要步骤:
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链接脚本