当前位置: 首页 > news >正文

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

目录

    • 环境说明
    • RT-Thread Nano移植
      • (一)基本框架移植
      • (二)移植rt_kprintf
      • (三)移植FinSH
      • (四)移植总结
      • (五)项目开源地址

环境说明

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链接脚本

(五)项目开源地址

点击前往

http://www.dtcms.com/a/339088.html

相关文章:

  • Mac下载AOSP源代码
  • UE小:交叉编译linux的坑
  • 【集合框架HashSet底层原理】
  • IDEA:设置彩色输出
  • DataAnalytics之Tool:Metabase的简介、安装和使用方法、案例应用之详细攻略
  • 项目一系列-第5章 前后端快速开发
  • 虚拟环境安装了fastapi但是使用时报错:ModuleNotFoundError: No module named ‘fastapi‘
  • C++利用CerateProcess创建WPF进程并通过命名管道通讯
  • Scikit-learn通关秘籍:从鸢尾花分类到房价预测
  • 项目部署与持续集成
  • Android RxJava数据库操作:响应式改造实践
  • AUTOSAR进阶图解==>AUTOSAR_SWS_FunctionInhibitionManager
  • Spring Ai Chat Memory
  • Python 与 VS Code 结合操作指南
  • 【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案
  • 【什么是非晶合金?非晶电机有什么优点?】
  • Redis面试题及详细答案100道(71-85) --- 综合篇
  • Vim笔记:缩进
  • KMM跨平台叛逃实录:SwiftUI与Compose Multiplatform共享ViewModel的混合开发框架(代码复用率85%)
  • Qt5 GUI 编程详解
  • 【AI大模型的发展历史】从Transformer到2025年的多模态、推理与开源革命
  • mlir 类型
  • docker 数据卷、自定义镜像操作演示分享(第二期)
  • 【数据结构】堆和二叉树详解(下)
  • SpringAI——向量存储(vector store)
  • SpringClound——网关、服务保护和分布式事务
  • Redis-缓存-击穿-分布式锁
  • 使用ros2跑mid360的fastlio2算法详细教程
  • 【数据结构】用堆解决TOPK问题
  • 算法训练营day56 图论⑥ 108. 109.冗余连接系列