FreeRTOS从代码层面进行原理分析(4 移植)

news2024/10/9 18:22:14

FreeRTOS从代码层面进行原理分析(4 移植)

从前 3 篇博客中我们已经搞清楚了最开始对 FreeRTOS 有疑问的前 2 个问题。

1. FreeRTOS 是如何建立任务的呢?
2. FreeRTOS 是调度和切换任务的呢?
3. FreeRTOS 是如何保证实时性呢?

以下就是前三篇博客的连接,如果要开始移植首先真的是要搞清楚原理,这样就可以明确移植的过程中那些是重点。让自己的行动更明确。

FreeRTOS从代码层面进行原理分析(1 任务的建立)
FreeRTOS从代码层面进行原理分析(2 任务的启动)
FreeRTOS从代码层面进行原理分析(3 任务的切换)

在能实际的通过让代码跑起来的方式分析我们的第三个问题 FreeRTOS 是如何保证实时性 时,首先就是要把 FreeRTOS 移植到我自己的板子上。然后再通过调试(在之前的博客也有过介绍如何调试)或者代码设置等方式来搞清楚这个问题。

我做本次实验的设备:
1.翻出大学时候买的 STM32 开发板。MCU 型号 STM32F103RCT6
2. 同时期买的 ST-Link

移植前的准备工作

书接上文!既然知道原理了,那么用起来还会难吗? 接下来然我们开始把 FreeRTOS 移植到板子上吧~ 目前网上很多都是使用 Keil 作为环境进行 FreeRTOS 的移植,在这篇博客中我们将会使用GCC交叉编译的方式来移植 FreeRTOS。其实原理上也是相似的。废话不多说,让我们继续。

首先使用使用 CubeMX 随便生成一个简单的小项目。对于 CubeMX 的安装和简单的配置,详细的文章太多了,这里面就不仔细讲了。
为了能和其他代码隔离开,咱们在这个 CubeMX 生成的的项目内建立一个叫做 freertos 的文件夹,专门存放 FreeRTOS 的代码。

在这里插入图片描述
然后咱们再在 freertos 文件夹中建立三个文件夹,用于存放 FreeRTOS 不同部分的文件。
在这里插入图片描述

根据之前咱们对 FreeRTOS 的理解,一个项目首先是需要任务相关的全部代码。在下载的 FreeRTOS 源码的 source 目录下的文件(不包括文件夹)全部复制到 src 文件夹中。

在这里插入图片描述

然后把 source 下面的 include 目录中的内容复制到咱们的 include 目录中。

在这里插入图片描述
在前面的学习中,我们知道对于任务栈的初始化,切换任务的过程中需要针对不同架构的 MCU 对应实现的汇编函数。
在源码的 portable\GCC\ARM_CM3 文件夹中将 port.c 文件复制到咱们自己的 portable 文件夹中。
在 FreeRTOS 创建任务的时候还需要为任务栈申请对应的栈空间。所以我们要找到内存申请相关的函数,这些函数实现在源码的 \FreeRTOS\Source\portable\MemMang 目录中,我们先选择 heap4.c (一般都是用这个,各个heapX.c文件的区别可以看官方文档)也同样复制到我们自己的 portable 目录中。

在这里插入图片描述
我们知道还有一个叫做 FreeRTOSConfig.h 的头文件是用于配置 FreeRTOS 的。这个文件我们可以在对应架构的 Demo 中找到。比如我使用的就是从 FreeRTOS\Demo\CORTEX_STM32F103_Primer_GCC 找到的。 把这个 FreeRTOSConfig.h 也复制到咱们自己的 include 目录中。

至此,我们已经完成了 FreeRTOS 文件的移植工作。但是既然添加了文件就势必要改动 Makefile 文件,把新添加的文件也能够编译到项目中。

Makefile 的修改

原本的 Makfile 是 CubeMX 自己生成的,咱们只要把自己添加的文件添加到 Makfile 文件中就可以了。
首先,先添加头文件也就 include 目录。

在这里插入图片描述
然后咱们把其他所有的 C 文件也添加进去。

在这里插入图片描述
wildcard 是使用通配符,意思就是找到这个文件夹下所有的同类型文件。

到这里我们可以在 main.c 中添加上 FreeRTOS 最常用的头文件,然后编译一下看看有没有错误。

#include <FreeRTOS.h>
#include <task.h>

下图已经看到编译出来了可执行文件,说明编译成功了。

在这里插入图片描述
但是到这里还有其他问题不能运行~ 大家能想到是什么吗? 没错, FreeRTOS 的核心就是通过 systick 中断来处理任务的。所以我们要确定这些中断都能被正确触发。

设置中断向量

在 CubeMX 生成的项目中也是有启动文件的,叫做 startup_stm32f103xe.s。但是这个里面的中断向量的名称和 FreeRTOS 里面 Cortex-m3 的中断函数名称有点不匹配。因为这些中断函数全部定义在 port.c 中,所以在文件开始部分加入下面的定义来保证名称对应:

#define xPortSysTickHandler SysTick_Handler
#define xPortPendSVHandler  PendSV_Handler
#define vPortSVCHandler     SVC_Handler

然后不要忘记把项目本身中断的设置文件(stm32f1xx_it.c)中的这三个函数注释掉。下图仅展示一个,要不图片太大了。

在这里插入图片描述

这个时候已经把 FreeRTOS 和咱们 CubeMX 生成的项目融合在一起了。别忘了再编译一下检查有没有错误。

继续解决其他遇到的问题

这个时候编译并烧录以下,发现没有任何反应。 调试一下,方法可以参考以下两篇之前的博客:
在Windows上交叉编译STM32(环境搭建)
使用 OpenOCD 来调试 STM32

使用 GDB where 命令确认当前代码位置, 使用 info stack 命令打印栈的调用顺序,确认哪里出了问题。

在这里插入图片描述
一看这咱们都没把 FreeRTOS 的代码添加进去,怎么就能进 Systick 中断呢? 估计是 CubeMX 生成的代码处理中断的时候会打开 Systick 中断。但是完全咱们不需要呀~ 而且在 FreeRTOS 中 Cortex-m3 的代码中也会设置和打开 Systick 中断。所以这里我们写寄存器把它直接关掉。

在这里插入图片描述

加入任务相关的代码

好了到这里让我们加入 FreeRTOS 相关的代码吧~ 我在这里是建立了两个任务,已不同的时间对小灯进行关闭和打开,用于观察代码在 FreeRTOS 下“并行”现象。

在这里插入图片描述
在 main 函数中把任务给调用起来~ 任务栈的深度设置的小一点。

在这里插入图片描述

编译,烧录~ 成功!

在这里插入图片描述

总结

通过之前的几篇博客,我们已经知道了 FreeRTOS 创建任务,任务切换的原理。这个时候再进行移植,就会变得非常的轻松。
接下我们就有设备可以用来探究第三个问题啦~ FreeRTOS 是如何保证实时性呢?以及切换任务的损耗。

请添加图片描述

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

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

相关文章

LeetCode:300最长递增子序列 C语言

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子…

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…

Multisim14.0破解安装教程

Multisim14.0中文破解版是一款相当优秀的专业化SPICE仿真标准环境&#xff0c;Multisim14.0中文版功能强悍&#xff0c;为用户提供了所见即所得的设计环境、互动式的仿真界面、动态显示元件、具有3D效果的仿真电路、虚拟仪表、分析功能与图形显示窗口等等。Multisim破解版操作简…

Linux-1.常见指令以及权限理解

目录 本节目标 使用 XShell 远程登录 Linux 关于 Linux 桌面 下载安装 XShell 查看 Linux 主机 ip 使用 XShell 登陆主机 XShell 下的复制粘贴 Linux下基本指令 登录Linux服务器 新建多用户 全屏 1.快速认识5~6个命令 2.详细谈论课件的所有指令 01. ls 指令 02…

Linux 环境安装Nginx—源码和Dokcer两种安装方式

一、源代码编译安装Nginx 1.下载最新nginx源码 以nginx-1.25.3.tar.gz为例&#xff1a; 可以使用命令(联网)&#xff1a;curl -O http://nginx.org/download/nginx-1.25.3.tar.gz或在官网下载.tar.gz 2.解压缩 tar -zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3/ 3.安装依赖…

动态菜单设计

查询当前用户下的菜单权限 思路&#xff1a;根据用户id 左关联表 查询出对应的菜单选项 查询SQL select distinct-- 菜单表 去除重复记录sys_menu.id,sys_menu.parentId, sys_menu.name from -- 权限表sys_menu-- 角色与权限表 菜单表id 角色菜单表的菜单id left j…

数据分析之Power BI

POWER QUERY 获取清洗 POWER PIVOT建模分析 如何加载power pivot 文件-选项-加载项-com加载项-转到 POWER VIEW 可视呈现 如何加载power view 文件-选项-自定义功能区-不在功能区中的命令-新建组-power view-添加-确定 POWER MAP可视地图

Redis 6.0.8版本下载

简介&#xff1a;Java领域优质创作者楠木 分享Java项目、简历模板、学习资料、面试题库 想必大家在下载redis之前已经逛了很多教程了&#xff0c;可能不尽如意&#xff0c;找不到自己的想要的版本。既然刷到了我的这条博客&#xff0c;说明你是幸运的&#xff01; Redis6.0.8的…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介&#xff1a;文件存储路径&#xff1a; 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

【深耕 Python】Data Science with Python 数据科学(2)jupyter-lab和numpy数组

关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a;【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 Jupyter代码片段1&#xff1a;简单数组的定义和排序 import numpy as np np.array([1, 2, 3]) a np.array([9, 6, 2, …

flume配置文件后不能跟注释!!

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释&#xff0c;可以单起一行写注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDel…

AI的“换脸“魔术,究竟是弊大于利还是利大于弊?

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识&#xff0c;也有全栈交流学习摸鱼群&#xff0c;期待您的关注! 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0…

Rsyslog 日志集中管理实验

1.使用 进行日志集中管理 C/S 架构&#xff1a;客户端将其日志上传到服务器端&#xff0c;通过对服务器端日志的查询&#xff0c;来实现对其他客户端的日志进行集中管理 2.两台机器&#xff1a; &#xff08;server&#xff09;host-5(192.168.1.2)<------------>(192…

【51单片机入门记录】Onewire单总线协议 温度传感器DS18B20概述

一、温度传感器DS18B20概述 &#xff08;1&#xff09;数字化温度传感器 美国DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点&#xff0c;使用户可轻松地组建传感器网络&#xff0c;为测量系统的构建…

Redis与数据库的一致性

Redis与数据库的数据一致性 在使用Redis作为应用缓存来提高数据的读性能时&#xff0c;经常会遇到Redis与数据库的数据一致性问题。简单来说&#xff0c;就是同一份数据同时存在于Redis和数据库&#xff0c;如何在数据更新的时候&#xff0c;保证两边数据的一致性。首先&#…

博士科研最好用的科研绘图工具有哪些?

博士科研最好用的科研绘图工具有哪些&#xff1f; 1 chiplot 网址&#xff1a;chiplot ChiPlot是一个功能强大、易于使用的在线图表和数据可视化工具。它提供了多种图表类型和交互性&#xff0c;帮助用户轻松创建精美的图表&#xff0c;并从中获取有价值的信息。 &#xff0…

精准防灾新篇章:GIS与Python机器学习技术在地质灾害风险评价与信息化建库中的前沿应用

结合项目实践案例和科研论文成果进行讲解。入门篇&#xff0c;ArcGIS软件的快速入门与GIS数据源的获取与理解&#xff1b;方法篇&#xff0c;致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法&#xff1b;拓展篇&#xff0c;GIS在灾害重建…

C语言刷题(20)

指针笔试题 笔试题1&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&#xff1f; *(a 1)等同于a[1]&#xff0c;第一个是2&#xff0c;a的类型是int […

SQL映射文件

一、SQL映射的xml文件 1.1 mapper元素 二、select 三、别名与Java映射 四、resultMap 啊

类模板成员函数的类外实现

能够掌握类模板中的成员函数的类外实现&#xff1a; #include <iostream> #include <Windows.h> #include <string>using namespace std;template<typename T1, typename T2> class Person { public:T1 m_Name;T2 m_Age;Person(T1 name, T2 age);void…