【基于gcc】手把手教你移植RT-Thread到STM32

news2024/11/22 15:04:12

前言

网上大多数移植RT-Thread系统的教程都是基于Keil的,下面将带来基于gcc版本的移植教程,若你还没有基于gcc的环境,可以查看我的这篇文章:VSCode搭建STM32开发环境

1、下载RT-Thread源码

RT-Thread有好几个版本,我们只需下载 RT-Thread Nano 版本源码即可,Nano是Master的精简版,去掉了一些组件和各种开发板的BSP,保留了OS的核心功能,下载地址:RT-Thread Nano

在这里插入图片描述
下载完成后,解压一下,会有一些内容:
在这里插入图片描述
文件夹内容组成:

文件夹描述
bsp板级支持包
components/finshRT-Thread组件
include头文件
include/libc头文件
libcpu与处理器相关的接口文件
srcRT-Thread内核源码

2、将文件夹rt-thread拷贝到裸机工程模板中

这里我默认你们看这篇教程了:VSCode搭建STM32开发环境

将rt-thread文件夹拷贝到模板工程中

在这里插入图片描述

3、删除多余文件

打开rt-thread文件夹,将以下无用文件删除
在这里插入图片描述

3.1、bsp文件夹

打开bsp文件夹,会发现里面有很多文件,这个文件夹下放的是一些板级支持包,能用到的文件只有board.crtconfig.h 两个文件,其他的都删除
在这里插入图片描述

3.2、 components文件夹

在这个文件夹下放的是一些其它第三方加进来的软件,也即是组件,比如gui、fatfs、lwip和finsh等。目前nano版本只放了finsh,其它的都被删除了,master版本则放了非常多的组件。finsh是RT- Thread组件里面最具特色的,它通过串口打印的方式来输出各种信息,方便我们调试程序。这个文件夹中的内容不做任何操作

3.3、docs文件夹

在这个文件夹里面有一个 docs.txt 文件,里面的内容是一些资料的网站,可以直接删除该文件夹docs

3.4、 include文件夹

include目录下面存放的是RT-Thread内核的头文件,是内核不可分割的一部分。

3.5、libcpu文件夹

在这个文件夹中放的是一些硬件接口,Nano版本里面放的有 arm系列芯片接口risc-v系列芯片接口,本实验是基于STM32F103的,所以 risc-v文件夹直接删除,再打开arm文件夹后,后发现里面也有好多文件夹,基本上是arm系列常见的架构,STM32F103是基于 cortex-m3内核的,所以我们将cortex-m3文件夹移动到 libcpu文件夹,其他的都删除。
在这里插入图片描述

3.6、 src文件夹

src目录下面存放的是RT-Thread内核的源文件,是内核的核心

4、修改Makefile

使用VSCode打开这个工程,接着打开Makefile

4.1、添加头文件路径

在头文件包含(C_INCLUDES)后面加入rt-thread源码中的头文件

# C includes
C_INCLUDES =  \
-I./User/Inc \
-I./Libraries/CMSIS \
-I./Libraries/STM32F10x_StdPeriph_Driver/inc \
-I./rt-thread/bsp     \
-I./rt-thread/include \
-I./rt-thread/libc    \
-I./rt-thread/components/finsh \
$(USER_INC)

如下图:

在这里插入图片描述

4.2、添加源文件.c

定义一个变量用来存放rt-thread的源文件路径:

# rt-thread源码
RTT_SOURCE = \
	$(wildcard ./rt-thread/bsp/*.c)               \
	$(wildcard ./rt-thread/libcpu/cortex-m3/*.c)  \
	$(wildcard ./rt-thread/src/*.c)

在Makefile的变量 C_SOURCES 后面加入变量 RTT_SOURCE:

在这里插入图片描述

4.3、添加接口文件.s

本教程是基于gcc的,所以我们使用的是 context_gcc.S 文件,找到Makefile中的变量 ASM_SOURCES ,在它后面添加 context_gcc.S 文件,再添加之前,将文件context_gcc.S大S后缀更改为小写s:
在这里插入图片描述
此时Makefile已经修改完成,下面将进行修改工程中的C文件。

5、修改工程代码

5.1、修改 stm32f10x_it.c 文件

此时,我们可以使用make命令构建一下此工程,构建结束后会报3个错误:
在这里插入图片描述
SysTick_Handler、PendSV_Handler、HardFault_Handler这三个函数重复定义,因为在接口文件 context_gcc.S 中已经实现了,此时应该将 stm32f10x_it.c 中的这三个中断处理函数屏蔽掉。
在这里插入图片描述
在这里插入图片描述

现在我们再使用make指令构建一下会发现可以正常编译了:
在这里插入图片描述

6、测试RT-Thread

接下来用动态线程的创建方法,而系统默认的是静态创建方法,所以先要修改配置文件,打开rtconfig.h 文件,使用搜索功能搜索 RT_USING_HEAP ,并将这个宏取消注释:
在这里插入图片描述
接着在 main.c 加入以下内容:

#include "stm32f10x.h"
#include "bsp_led.h"
 
#include <rthw.h>
#include "rtthread.h"
 
/* 定义线程控制块 */
static rt_thread_t led_thread = RT_NULL;
 
/*
*************************************************************************
*                             函数声明
*************************************************************************
*/
static void led_thread_entry(void* parameter);
 
 
int main( void )
{
 
    /* LED 端口初始化 */
    LED_GPIO_Config();
 
   led_thread =                          /* 线程控制块指针 */
    rt_thread_create( "led",              /* 线程名字 */
                      led_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      512,                 /* 线程栈大小 */
                      3,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                   
    /* 启动线程,开启调度 */
	rt_thread_startup(led_thread);
}
/*
*************************************************************************
*                             线程定义
*************************************************************************
*/
static void led_thread_entry(void* parameter)
{	
	while (1)
	{
		LED_G(ON);
		rt_thread_delay(500);   /* 延时500个tick */
	
		LED_G(OFF);     
		rt_thread_delay(500);   /* 延时500个tick */		 		
	
	}
}
 

重新构建后下载到开发板后,看一下效果。

呀,呀,呀,发现没有达到预期的效果,别着急,此时我们需要修改一下STM32的启动文件,根据
你自己的芯片型号选则:

在.s文件中将 bl main 修改为 bl entry:
在这里插入图片描述
修改之后再重新构建一下并下载到开发板后,就会发现LED小灯闪烁。

本教程只做了一个简单的移植,后面应该还有很多细节需要处理,这里就不过多演示了

本篇文章所用的开发板是野火的指南者型号,想要移植好的工程,评论区见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序路由跳转

小程序中的路由只是单纯页面地址的跳转&#xff0c;一般在页面中使用 navigator 组件来实现&#xff0c;也有很多场景需要在 js 中根据逻辑的执行结果跳转到某个页面&#xff0c;比如&#xff1a;如果检测到用户尚未登录就需要给他跳转到登录页面 1.1navigate navigate 跳转到…

软件工程开发文档写作教程(04)—开发文档的编制策略

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 开发文档编制策略 文档策略是由上级(资深)管理者制订的&#xff0c;对下级开发单位或开发人…

银河麒麟 Server V10 离线源建立+部署

前言 这国产操作系统真神奇&#xff0c;docker CentOS7&#xff0c; MySQL CentOS8 简直了&#xff0c;这缝合技术真是绝了&#xff01; docker CentOS7 能装最新版 23 很顺利的&#xff01; MySQL CentOS8 也是最新版8.0.33的&#xff0c;也很顺利&#xff01; 系统版本 …

权威解析,软件测试的当下分析现状

Parasoft是一家专门提供软件测试解决方案的公司&#xff0c;Parasoft通过其经过市场验证的自动化软件测试工具集成套件&#xff0c;帮助企业持续交付高质量的软件。Parasoft的技术支持嵌入式、企业和物联网市场&#xff0c;通过将静态代码分析和单元测试、Web UI和API测试等所有…

详解树与二叉树的概念,结构,及实现(下篇)

目录 一&#xff0c; 二叉树链式实现 1. 前置说明 2. 二叉树遍历&#xff08;主打的就是一个分治思想&#xff09; 2. 1 前序遍历 2. 2 中序遍历 2. 3 后序遍历 2. 4 层序遍历 3. 二叉树结点个数及高度 3. 1 二叉树节点个数 3. 2 二叉树叶子节点个数 3. 3 二叉树第…

数字信号处理技术(三)自适应噪声完备集合经验模态分解(CEEMDAN)-Python代码

本文仅对自适应噪声完备集合经验模态分解&#xff08;CEEMDAN&#xff09;的原理简单介绍和重点介绍模型的应用。 1. CEEMDAN原理 CEEMDAN&#xff08;Complete Ensemble Empirical Mode Decomposition with Adaptive Noise&#xff09;的中文名称是自适应噪声完备集合经验模…

一文全解经典机器学习算法之支持向量机SVM(关键词:SVM,对偶、间隔、支持向量、核函数、特征空间、分类)

文章目录 一&#xff1a;概述二&#xff1a;间隔与支持向量三&#xff1a;对偶问题&#xff08;1&#xff09;什么是对偶问题&#xff08;2&#xff09;SVM对偶问题&#xff08;3&#xff09;SMO算法 四&#xff1a;核函数&#xff08;1&#xff09;核函数的概述和作用&#xf…

车载应用生态:小程序容器技术成为保障安全的有力措施

随着智能交通和车联网技术的快速发展&#xff0c;越来越多的车载应用程序&#xff08;APP&#xff09;进入人们的视野&#xff0c;从而推动了车载业务生态的不断发展。然而&#xff0c;车载应用程序的安全问题也引起了人们的广泛关注。为此&#xff0c;小程序容器技术作为一种有…

4.24每日一练

题目 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcod…

毕业设计 医学图像阅读器 DICOM CT MRI 阅读器 三维重建 可视化编程技术及应用

一、 概述 此系统实现了常见 VTK 四视图&#xff0c;实现了很好的 DICOM 图像显示&#xff0c;可用于 DICOM 超声 X线 CT MR 三维重建 拾取像素值 窗宽 窗位 像素&#xff0c;距离测量&#xff0c;角度测量&#xff0c;提供源码&#xff1b; 并且通过三维重建实现可视化。使用…

客快物流大数据项目(一百一十七):网关 Spring Cloud Gateway

文章目录 网关 Spring Cloud Gateway 一、简介 1、功能特性

OSCP-Exfiltrated(Subrion、exiftool提权)

目录 扫描 WEB 提权 其他方法 扫描 WEB 添加 host信息 访问了该网站,并立即注意到该网站上制作的CMS(Subrion CMS)。

机器学习笔记之密度聚类——DBSCAN方法

机器学习笔记之密度聚类——DBSCAN方法 引言基本思想概念介绍算法过程完整算法描述 DBSCAN \text{DBSCAN} DBSCAN的优点和缺陷 引言 本节将介绍密度聚类—— DBSCAN \text{DBSCAN} DBSCAN方法。 对于其他聚类任务的笔记&#xff1a; K-Means \text{K-Means} K-Means聚类算法&…

PXE高效批量网络装机

PXE 定义 PXE(预启动执行环境&#xff0c;在操作系统之前运行)是由Intel公司开发的网络引导技术&#xff0c;工作在client /server模式&#xff0c;允许客户机通过网络从远程服务器下载引导镜像&#xff0c;并加载安装文件或者整个操作系统。 具备以下三个优点 1 规模化: 同时…

高通 Android 12 framework添加自定义按键上报应用层

Android下添加新的自定义键值和按键处理流程 首先分析下Android下怎么添加新的自定义键值。在Android的原生系统中键值默认情况下是92个&#xff0c;从0-91&#xff1b;一般情况下&#xff0c;这些键值是够用的&#xff0c;但是如果想扩充的话&#xff0c;还是需要添加新的键值…

Linux系统应用编程(五)Linux网络编程(上篇)

本篇主要内容&#xff1a; Linux系统应用编程&#xff08;五&#xff09;Linux网络编程&#xff08;上篇&#xff09;一、网络基础1.两个网络模型和常见协议&#xff08;1&#xff09;OSI七层模型&#xff08;物数网传会表应&#xff09;&#xff08;2&#xff09;TCP/IP四层模…

详解C语言string.h中常用的14个库函数(一)

我计划讲解C语言string.h这个头文件中&#xff0c;最常用的14个库函数。为了让大家更加深入的理解这些函数&#xff0c;部分函数我会模拟实现。篇幅所限&#xff0c;如果文章太长了&#xff0c;可能会较难坚持读完&#xff0c;所以我会分几篇博客来讲述。本篇博客主要讲解的函数…

FPGA时序约束(三)时序约束基本路径的深入分析

系列文章目录 FPGA时序约束&#xff08;一&#xff09;基本概念入门及简单语法 FPGA时序约束&#xff08;二&#xff09;利用Quartus18对Altera进行时序约束 文章目录 系列文章目录前言基本时序路径时钟偏差寄存器到寄存器&#xff08;reg2reg&#xff09;建立时间余量保持时…

PHP实现以数组var_dump,array_combine等函数的方法功能举例

目录 前言 一、什么是数组 二、把两个数组合并成一个数组 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 三、自动创建数组的一个案例 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 前言 1.若有选择&#xff0c;可实现在目录里…

小朋友排队

[蓝桥杯 2014 省 B] 小朋友排队 题目描述 n n n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。开始的时候&#xff0c;所有小朋友的不高兴程度都是 0 0 0。 如果某个小朋友…