【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread
最近在公司实习,公司想将原来在Windows keil上开发的项目移到Linux,并上RTT操作系统,最近就被安排做了这件事。
首先
下载 RT-Thread Nano内核
我使用的交叉编译器:gcc-arm-none-eabi-10.3-2021.10 编译器下载地址 gcc-arm-none-eabi 介绍及安装步骤 注:选择合适的gcc交叉编译器很重要,最早踩坑rtt不启动,就是因为gcc交叉编译器版本所致
正式移植开始
1.首先在工程目录下建立RT-Thread文件夹
2.在下载好的Nano内核文件中拷贝
include libcpu src components 四个文件 到工程RT-Thread下
3.删除掉libcpu中没用的文件
eg:我使用F429 所以只保留 arm 文件下 的 cortex-m4 注意:在移植contex-m4中 context_gcc.S文件时需要将此文件重命名为context_gcc.s。 启动文件一般是由汇编写成,此处需要注意的是,汇编文件的格式有.S和.s之分: .S:表明文件中含有预处理指令(比如#define),需要先进行处理; .s:表明文件不需要处理,可以直接编译; 之前我们添加的启动文件是小写.s,所以直接进行编译, 另外说一下,如果使用的是.S文件,那么需要带上-x assembler-with-cpp参数。
4.拷贝内核bsp文件夹下的 board.c rtconfig.h 文件 到工程RT-Thread下
如下图:
5.将文件添加到工程目录,添加头文件包含
gcc编译包含c文件:
RT-Thread/board.c \
RT-Thread/src/clock.c \
RT-Thread/src/components.c \
RT-Thread/src/cpu.c \
RT-Thread/src/idle.c \
RT-Thread/src/ipc.c \
RT-Thread/src/irq.c \
RT-Thread/src/kservice.c \
RT-Thread/src/mem.c \
RT-Thread/src/memheap.c \
RT-Thread/src/mempool.c \
RT-Thread/src/object.c \
RT-Thread/src/scheduler.c \
RT-Thread/src/slab.c \
RT-Thread/src/thread.c \
RT-Thread/src/timer.c \
RT-Thread/components/device/device.c \
RT-Thread/libcpu/arm/cortex-m4/cpuport.c
include文件:
-IRT-Thread \
-IRT-Thread/include \
-IRT-Thread/include/libc \
-IRT-Thread/libcpu/arm/cortex-m4
汇编文件:
RT-Thread/libcpu/arm/cortex-m4/context_gcc.s
6.Makefile中修改 FLOAT-ABI = -mfloat-abi=soft
7.编译 ----> 报错 重复定义
在 it.c 文件下注释掉 HardFault_Handler、PendSV_Handler和SysTick_Handler
8.startup()程序跳转:
芯片在 KEIL MDK 与 IAR 下的启动文件不用做修改, 会自动转到 RT-Thread 系统启动函数 rtthread_startup() 。 GCC 下的启动文件需要修改, 让其跳转到 RT-Thread 提供的 entry() 函数, 其中 entry() 函数调用了 RT-Thread 系统启动函数 rtthread_startup()。 /修改前: bl SystemInit bl main
//修改后: bl SystemInit bl entry /* 修改此处,由 main 改为 entry */
然后rtt 就可以正常的启动了,接下来需要做的就是在 board.c中初始化时钟 以及 system tick,并将硬件初始化移到 board.c中,在main.c中创建线程。
具体操作详见 rtt 官网手册 线程静态、动态创建
|