【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread

【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下

如下图:
【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread_第1张图片

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

【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread_第2张图片

7.编译 ----> 报错 重复定义

在 it.c 文件下注释掉 HardFault_Handler、PendSV_Handler和SysTick_Handler
【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread_第3张图片
【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread_第4张图片

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 */
【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread_第5张图片

然后rtt 就可以正常的启动了,接下来需要做的就是在 board.c中初始化时钟 以及 system tick,并将硬件初始化移到 board.c中,在main.c中创建线程。

具体操作详见 rtt 官网手册 线程静态、动态创建

你可能感兴趣的:(gcc,RT-Thread,嵌入式)