逐飞 RT1064 RT-Thread 库 GCC (VSCode) 移植踩坑

本文所记录的是我整个过程的踩坑经历,关于项目和其使用说明请参考项目主页: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:

解决 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:

解决符号冲突导致的编译错误

C 标准库里和 RT-Thread 库中有重复定义,需要配置 RT-Thread 以让出符号。

解决方案:添加了 Libraries/rttherad_libraries/bsp/cconfig.h 文件(来自 Github),添加到了 files.cmake 中的头文件搜索目录,在 flags.cmake 中添加了 HAVE_CCONFIG_H flag

ref:

解决一些链接错误

增加了 .rti_fn (用于 RT-Thread 自动初始化) .FSymTab .VSymTab (用于 FinSH)段的配置。

.heap(底)和 .stack(顶)间配置了 heap_start heap_end 作为 RT-Thread 的堆内存(用于分配线程栈等)。

ref:

解决线程不切换的问题

如默认项目里的 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 移植参考

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据