逐飞 RT1064 RT-Thread 库 GCC (VSCode) 移植踩坑
2021-05-19
搭配上 RT-Thread
本文迁移自老博客,原始链接为 https://lookas2001.com/%e9%80%90%e9%a3%9e-rt1064-rt-thread-%e5%ba%93-gcc-vscode-%e7%a7%bb%e6%a4%8d%e8%b8%a9%e5%9d%91/
本文所记录的是我整个过程的踩坑经历,关于项目和其使用说明请参考项目主页:hilookas/SeekFree_RT1064_RTThread_Library_GCC_Porting | GitHub
关于逐飞 RT1064 库的移植项目请参考其项目主页:hilookas/SeekFree_RT1064_Library_GCC_Porting | GitHub
更多内容请参见另一篇博文: 逐飞 RT1064 库 GCC (VSCode) 移植踩坑 | lookas
统一文件编码为 UTF-8
这些文件本来就是 UTF-8:
./Libraries/rttherad_libraries/examples/*
./Libraries/rttherad_libraries/components/drivers/can/readme-zh.txt
有无 RT-Thread 逐飞库的区别(逐飞库 RT-Thread 移植修改了的文件)
使用命令 diff --brief --recursive dira dirb
nxp_libraries:
Libraries/nxp_libraries/drives/fsl_lpuart.c
Libraries/nxp_libraries/middleware/sdmmc/port/fsl_sdmmc_event.h
Libraries/nxp_libraries/middleware/sdmmc/port/usdhc/interrupt/fsl_sdmmc_event.c
seekfree_libraries:
Libraries/seekfree_libraries/board/board.c
Libraries/seekfree_libraries/board/board.h
Libraries/seekfree_libraries/common/common.c
Libraries/seekfree_libraries/common/common.h
Libraries/seekfree_libraries/headfile.h
Libraries/seekfree_libraries/zf_systick.c
Libraries/seekfree_libraries/zf_systick.h
seekfree_peripheral:
Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h
Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c
Libraries/seekfree_peripheral/SEEKFREE_MT9V03X_CSI.c
修改启动文件使 RT-Thread 启动
RT-Thread 要求通过设置 -eentry
到编译参数,使 main
函数运行前,先运行 entry
函数以初始化 RT-Thread。(Libraries/rttherad_libraries/src/components.c:157
objdump -d
可反汇编)
如果在 startup_MIMXRT1064.s
中使用 GCC 自带的 _start
(来自 GCC 自带的 crt0.o
),_start
在初始化 c 运行环境之后,会直接进入 main
函数,不会经过 entry
函数。故需要在启动文件中,手动初始化 c 运行环境(初始化 bss 段,调用 __libc_init_array
函数),并跳入 entry
函数。
ref:
- main - How to change entry point of C program with gcc? - Stack Overflow
- linux - How to change the start/main entrypoint of x86-64 assembly with NASM? - Stack Overflow
- gcc - understanding the __libc_init_array - Stack Overflow
- Using LD, the GNU linker - MEMORY
- Link Options (Using the GNU Compiler Collection (GCC))
- Entry Point (LD)
- objdump (GNU Binary Utilities)
- c++ - How to disassemble a binary executable in Linux to get the assembly code? - Stack Overflow
- elf - How to disassemble one single function using objdump? - Stack Overflow
- ARM® Instruction SetQuick Reference Card
- ARM Assembly Cheat Sheet by Syshella - Download free from Cheatography - Cheatography.com: Cheat Sheets For Every Occasion
- 汇编程序用户指南:LDR(立即偏移量)
- ARM IT指令解析 | lipeiqiang
- rt-thread/libcpu/arm/cortex-m7 at 9bc3896e41716f6415e948ffea153a5453fe4b34 · RT-Thread/rt-thread
- ARM Compiler toolchain Using the Linker
解决 context_gcc.S
中的编译错误
在 Libraries/rttherad_libraries/libcpu/arm/cortex-m7/context_gcc.S
中有错误:
Error: thumb conditional instruction should be in IT block -- `vstmdbeq r1!,{d8-d15}'
解决方案:在 flags.cmake
增加 -mimplicit-it=thumb
flag
ref:
- 编译遇到的新问题 - RT-Thread问答社区
- c++ - Assembler messages: Error: thumb conditional instruction should be in IT block -- `strexeq r1,r2,[r4]' - Stack Overflow
- c++ - -mimplicit-it compiler flag not recognized - Stack Overflow
解决符号冲突导致的编译错误
C 标准库里和 RT-Thread 库中有重复定义,需要配置 RT-Thread 以让出符号。
解决方案:添加了 Libraries/rttherad_libraries/bsp/cconfig.h
文件(来自 Github),添加到了 files.cmake
中的头文件搜索目录,在 flags.cmake
中添加了 HAVE_CCONFIG_H
flag
ref:
- 关于使用GCC编译器 NEWLIB库重复定义 - RT-Thread问答社区
- Exploring Startup Implementations: Newlib (ARM) - Embedded Artistry
- rt-thread工具之env使用 – xuxeu – 一个随便写写的博客
- rt-thread/cconfig.h at 9bc3896e41716f6415e948ffea153a5453fe4b34 · RT-Thread/rt-thread
解决一些链接错误
增加了 .rti_fn
(用于 RT-Thread 自动初始化) .FSymTab
.VSymTab
(用于 FinSH)段的配置。
在 .heap
(底)和 .stack
(顶)间配置了 heap_start
heap_end
作为 RT-Thread 的堆内存(用于分配线程栈等)。
ref:
- RT-thread组件初始化代码分析 - King先生 - 博客园
- RT-Thread 自动初始化详解_yang1111111112的博客-CSDN博客
- finish shell分析之语法解释器_a2988a的博客-CSDN博客_finsh shell
- RT-Thread源码学习第三篇,$Sub$$main与$Super$$main扩展main函数 - Konstantine的个人空间 - OSCHINA - 中文开源技术交流社区
解决线程不切换的问题
如默认项目里的 rt_thread_mdelay(100);
,在 100ms 后 LED 并没有切换状态。
发现是由于 Libraries/nxp_libraries/middleware/sdmmc/port/usdhc/polling/fsl_sdmmc_event.c
里的 SysTick_Handler
覆盖掉了 Libraries/seekfree_libraries/board/board.c
文件中的 SysTick_Handler
,其中 board.c
负责配置 SysTick 并且在 SysTick 定时结束时调用 RT-Thread 继续线程(初始化板子)。
解决方案:在 files.cmake
里注释掉 Libraries/nxp_libraries/middleware/sdmmc/port/usdhc/polling/fsl_sdmmc_event.c
(该错误解决后我根据 IAR 的配置继续注释掉了其他不需要的文件)
Tips:修改 Libraries/rttherad_libraries/include/rtdebug.h
可以开启内核功能调试输出
ref:
- RT-Thread的线程(任务)处理 rt_thread_create/rt_thread_init区别 - 江召伟 - 博客园
- rt-thread中基于开启设备驱动和未开启设备驱动下的rt_kprintf()函数的分析_SeniorZ的点滴记录-CSDN博客
- RT-Thread下Kendryte K210双核启动时完成的初始化工作 - 知乎 关于 RT-Thread SMP (多核心支持)
- RT-Thread编程指南
- 内核基础 - RT-Thread 文档中心
- ARM中断向量表与响应流程【转】 - sky-heaven - 博客园
- 【连载】从单片机到操作系统⑥——FreeRTOS任务切换机制详解 - 知乎
- stm32学习-nvic的理解与使用_z7________的博客-CSDN博客_nvic是什么意思
- 操作系统(六) 进程同步 - 爆炸的果核 - 博客园
- 开关中断与cpsid/cpsie指令_小小小小的专栏-CSDN博客
- 线程管理 - RT-Thread 文档中心
- 线程间同步 - RT-Thread 文档中心
- FreeRTOS 入门 - FreeRTOS
- STM32之CubeL4(四)--- SD/MMC + SDIO + HAL_流云-CSDN博客
RT-Thread 移植参考
- Nano 移植原理 - RT-Thread 文档中心
- 移植控制台/FinSH - RT-Thread 文档中心
- 使用VS Code开发RT-Thread - RT-Thread 文档中心
- [野火]RT-Thread内核实现与应用开发实战, ——基于RT1052
- 在picorv32上面对 rt-thread nano的移植 - RT-Thread问答社区
- rt-thread/STM32系列BSP制作教程.md at master · RT-Thread/rt-thread
- rt-thread搭建cmake基本编译环境 - 知乎
- ESP32上移植Rt-thread | spaceman
- GCC使用stm32cubemx使用RT-Thread环境搭建_淡定的慌张小白的博客-CSDN博客