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

2023-11-12

【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 官网手册 线程静态、动态创建

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread 的相关文章

  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • 为什么隐式类型转换没有警告?

    我终于发现了程序中的一个错误 该错误是由返回类型的隐式类型转换引起的 即使g Wall对此没有任何警告 我想知道是否有什么办法可以快速找出这种无意识的错误 include
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • Fedora 21 带 clang,不带 gcc

    你能 合理地 让 Fedora 21 变得只有 llvm clang libc libc abi 吗 我发现有些东西暗示不可以 但它们都已经有 3 岁了 从那时起 llvm clang 已经取得了长足的进步 通过全新安装 我尝试了 yum
  • c - 将 .data 发送到不同的部分

    我想把其中的符号 data为特定 C 文件生成的节并将它们放在不同的节中 例如 mydata 在最终的可执行文件中 例如 normaldata c char my str this should appear in data special
  • GCC 和 -Wconversion

    让我们编译以下程序 int main uint16 t data 0 data uint16 t std round 3 14f return 0 with g Wconversion prog cpp 我们会得到warning conve
  • 使用 OpenMP 编译会导致内存泄漏

    根据 valgrind 的说法 使用 OpenMP 编译简单的 hello world 程序时可能会导致内存泄漏 这是没有意义的 因为 hello world 程序并没有有意使用任何 OpenMP 功能 假设下面的程序名为hi c并根据 g
  • 在 Linux 上将 libquadmath 与 C++ 链接

    我有一个示例代码 include
  • 这种对有效类型规则的使用是否严格遵守?

    C99和C11中的有效类型规则规定 没有声明类型的存储可以用任何类型写入 并且存储非字符类型的值将相应地设置存储的有效类型 抛开 INT MAX 可能小于 123456789 的事实不谈 以下代码对有效类型规则的使用是否严格符合 inclu
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • Gcc 4.2 版本缺失

    在我的带有 osx lion 和 XCode 4 1 的新 macbook pro 上 我遇到了一些 gcc 问题 In usr bin我找不到gcc 4 2 我只有以下版本 i686 apple darwin11 llvm gcc 4 2
  • 'goto *foo' 其中 foo 不是指针。这是什么?

    我正在玩标签作为值 https gcc gnu org onlinedocs gcc Labels as Values html并最终得到这段代码 int foo 0 goto foo 我的 C C 经验告诉我 foo means dere
  • 如何将输入传递到扩展汇编中?

    考虑这段代码 来自我的先前的问题 https stackoverflow com questions 37955538 segfault on movq instruction int main asm movq 100000000 rcx
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • C99 中数组的静态大小[重复]

    这个问题在这里已经有答案了 一个非常简单的 C 程序 include
  • 为什么是 ”\?” C/C++ 中的转义序列?

    C C 中有四种特殊的非字母字符需要转义 单引号 双引号 反斜杠 和问号 显然是因为它们有特殊的含义 对于单身char 对于字符串文字 对于转义序列 但为什么是 其中之一 我今天读了教科书上的转义序列表 我意识到我已经never逃脱了 以前
  • clang 是否提供类似于 GCC 6.x 的函数多版本控制 (target_clones) 的功能?

    我读了这篇 LWN 文章 https lwn net Articles 691932 饶有兴趣 执行摘要 GCC 6 x 支持所谓的函数多版本控制 它可以构建同一函数的多个版本 并针对不同的指令集进行优化 假设您有一台支持 AVX2 的机器
  • 无法链接 Boost 正则表达式

    我目前正在尝试编译一个KIT 的收缩层次实现 http algo2 iti kit edu english routeplanning php这需要 Boost Regex 提供的 Makefile 已经确保 并且我还手动仔细检查了这一点
  • C++11 Geany 设置

    我正在学习 C 我需要在 Geany 中为 C 11 正确设置编译和构建命令 我以为我的理解是正确的 但是当使用时auto 我收到以下错误 warning auto will change meaning in C 0x please re

随机推荐

  • Dubbo分布式日志追踪

    很多互联网公司都用的dubbo分布式框架进行微服务的开发 一个大系统往往会被拆分成很多不同的子系统 并且子系统还会部署多台机器 当其中一个系统出问题了 查看日志十分麻烦 所以我们需要一个固定的流程ID和机器ip地址等来把所有的日志穿起来 当
  • 如何安装vcpk

    如何安装vcpk 要安装 3fd 库 首先你需要安装 vcpkg 包管理器 以下是安装 vcpkg 的步骤 打开一个命令行终端 如 Windows 的命令提示符或 PowerShell 或者 Linux Mac 的终端 克隆 vcpkg 存
  • [云原生专题-53]:Kubesphere云治理-操作-通过Kubesphere应用商店一键部署微服务应用-消息中间件RabbitMQ的安装与部署

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122933831 目录 前言 第1章
  • exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp

    exportfs命令 参数说明如下 a 全部挂载 或卸载 etc exports文件内的设定 r 重新挂载 etc exports中的设置 此外同步更新 etc exports及 var lib nfs xtab中的内容 u 卸载某一目录
  • python面向对象编程 类与实例 继承与多态 isinstance

    class Student object def init self name gender self name name self gender gender def set gender self gender if gender ma
  • C语言学习

    目录 原码反码和补码 原码 true code 反码 complemental code 补码 ones complement code 溢出的处理 位运算符 移位操作符 lt lt gt gt lt lt 左移 gt gt 右移 按位操作
  • 2023深圳杯 C题无人机协同避障航迹规划 最新论文

    完整论文已发布 目录 无人机协同避障航迹规划 摘要 一 问题重述 1 1 背景 1 2 重述 二 模型的假设 三 符号说明 四 问题分析 4 1 问题一分析
  • IDEA 打开SpringBoot服务控制台,管理多个服务

    IDEA 打开SpringBoot服务控制台 管理多个服务 作者简介 努力的clz 一个努力编程的菜鸟 文章专栏 软件使用技巧 记录一下平时开发过程中 使用各种 编程软件 的一些使用技巧 实现步骤如下 第一步 选择 视图 工具窗口 服务 第
  • 传统数据库也能实现区块链存储

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本文节选自电子书 Netkiller Architect 手札 延伸阅读 Netkiller Blockchain 手札 微信订阅号 netkiller ebook 微信扫
  • shell脚本:函数

    shell脚本 函数 一 函数 1 定义 2 作用 3 格式 二 函数传参 1 定义 2 函数变量 3 递归 4 函数库 一 函数 1 定义 1 将命令序列按格式写在一起 2 可方便重复使用命令 2 作用 1 避免代码重复 2 把大工程分割
  • 2019南邮年微机原理及应用复试真题

    2019南邮年微机原理及应用复试真题 一 填空题 1 46的原码 反码以及补码的十六进制 H H H 2 8254实现日时钟定时的是 号计数器 计数初值 通常输出周期 3 每一个8254中有三个 位计数器 每一个计数器有 种工作方式 4 8
  • MMselfSup训练自监督模型之mocov3

    一 环境搭建 1 创建虚拟环境 conda create name openmmlab python 3 8 y 激活虚拟环境 conda activate openmmlab 2 安装pytorch torchvision 根据自己的配置
  • java 读取excel数据

    本文共介绍两种方式 第一种是常规POI读取 第二种是大文件读取 依赖包
  • AbstractQueuedSynchronizer(AQS) 原理

    一 AQS 简介 1 1 AQS 是什么 AQS AbstractQueuedSynchronizer 抽象队列同步器 是一个用来构建锁和同步器的框架 使用 AQS 能简单且高效地构造出应用广泛的大量的同步器 比如我们提到的 Reentra
  • 高光谱图像处理

    Development of a classification algorithm for efficient handling of multiple classes in sorting systems basesd on hypers
  • ps语义分割_解决实例分割任务中边缘不够精细:PointRend: Image Segmentation as Rendering...

    加入极市专业CV交流群 与6000 来自腾讯 华为 百度 北大 清华 中科院等名企名校视觉开发者互动交流 更有机会与李开复老师等大牛群内互动 同时提供每月大咖直播分享 真实项目需求对接 干货资讯汇总 行业技术交流 关注 极市平台 公众号 回
  • 计算机网络基础知识整理

    计算机网络 用通信设备和线路将处在不同地理位置 操作相对独立的多台计算机连接起来 并配置相应的系统和应用软件 在原本各自独立的计算机之间实现软硬件资源共享和信息传递等功能的系统 计算机网络的功能 数据通信 2 资源共享 3 增加可靠性 4
  • 【技术解析笔记】DDPM解析

    本文为youtube上一个ddpm解析视频的摘录笔记 youtube原视频链接 https www youtube com watch v W O7AZNzbzQ 基本介绍 DDPM指的是Denoising diffusion probal
  • hive - 面试题 - 最近一次购物在一年前(近一年内无购物)

    要求 有表 用户id 订单id 下单日期 该用户符合365天内无交易且当日有交易的数据打标签 如果当天有多条记录 同样打标签 思路 当前订单时间 最近一次的下单时间 gt 365 即最近365天内无订单记录 中间有个问题 一天内多次下单 只
  • 【GCC-RT-Thread】gcc交叉编译 STM32 - RT-Thread

    GCC RT Thread gcc交叉编译 STM32 RT Thread 最近在公司实习 公司想将原来在Windows keil上开发的项目移到Linux 并上RTT操作系统 最近就被安排做了这件事 首先 下载 RT Thread Nan