FreeRTOS-基本介绍和移植STM32
FreeRTOS-基本介绍和STM32移植
- 一、裸机开发和操作系统开发介绍
- 二、任务调度和任务状态介绍
- 2.1 任务调度
- 2.1.1 抢占式调度
- 2.1.2 时间片调度
- 2.2 任务状态
- 三、FreeRTOS源码和移植STM32
- 3.1 FreeRTOS源码
- 3.2 FreeRTOS移植STM32
- 3.2.1 代码移植
- 3.2.2 时钟中断配置
一、裸机开发和操作系统开发介绍
- 裸机:前后台系统,前台系统指的是中断服务函数,后台系统指的是大循环,即应用程序
- 特点:实时性差、delay(浪费资源)、结构臃肿(实现功能都放在无限循环)
- FreeRTOS开发:实时操作系统,强调的是实时性
- 特点:分而治之(实现功能划分为多个任务)、延时函数(不会空等待,会让出CPU的使用权给其他任务,即任务调度)、抢占式(高优先级任务抢占低优先级)、任务堆栈(每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息)
二、任务调度和任务状态介绍
2.1 任务调度
- 任务调度器就是决定在某一个时刻调用哪一个任务,切换速度很快,造成在同一时刻有多个任务在运行的错觉
- 抢占式调度:针对优先级不同的任务,优先级高的可以抢占低优先级的任务
- 时间片调度:针对优先级相同的任务,在每一次系统时钟节拍到的时候切换任务
- 协程式调度:当前正在执行任务一直在执行,同时高优先级的任务不会抢占低优先级任务(不常用)
2.1.1 抢占式调度
- 运行条件:三个任务Task1、Task2和Task3,在FreeRTOS中任务设置的数值越大,优先级越高
高优先级任务,优先执行。高优先级任务不停止,低优先级任务无法执行。被抢占的任务会进入就绪态
2.1.2 时间片调度
- 同优先级任务轮流地享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期
同等优先级任务,轮流执行,时间片流转。一个时间片大小,取决为滴答定时器中断周期。注意没有用完的时间片不会再使用(阻塞-直接切换到下一个任务),下次任务Task3得到执行还是按照一个时间片的时钟节拍运行
2.2 任务状态
-
FreeRTOS中任务共存在4种状态:运行态、就绪态、阻塞态和挂起态
-
运行态:正在执行的任务,该任务就处于运行态,注意在STM32种,同一时间仅一个任务处于运行态
-
就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态
-
阻塞态:如果一个任务因延时或者等待外部事件发生,那么这个任务就处于阻塞态
-
挂起态:类似暂停,调用函数vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态
-
下图为四种任务状态间的转换图
-
仅就绪态可以转变为运行态。其他状态想运行,必须先转变为就绪态
- 四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表(链表)
- 就绪列表:pxReadyTaskList[x],其中x代表任务优先级数值0-31
- 阻塞列表:pxDelayTaskList
- 挂起列表:xSuspendedTaskList
调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。如果优先级一致,那么相同优先级的任务会连接在同一个就绪列表上,按照时间片轮流执行
三、FreeRTOS源码和移植STM32
3.1 FreeRTOS源码
- 从官网下载FreeRTOS源码,文件夹内容如下所示
- 打开内核文件夹
- 打开FreeRTOS源码文件夹
- FreeRTOS操作系统归根结底是一个软件层面的东西,FreeRTOS是如何跟硬件联系在一起,portable文件夹里的东西就是接口文件,使用Keil-MDK开发,需要使用Keil、RVDS和MemMang文件夹部分内容
3.2 FreeRTOS移植STM32
3.2.1 代码移植
-
以STM32F103C8T6单片机为例移植FreeRTOS,移植步骤如下
-
将STM32工程文件全部复制到FreeRTOS目录下,并新建FreeRTOS文件夹存放源码
- 将FreeRTOS源码文件夹复制到移植模板内
- 删除源码中多余的文件,保留接口3个文件夹
- 在FreeRTOS文件夹内新建FreeRTOS_core、FreeRTOS_port文件夹,分别用于存放FreeRTOS内核文件和接口文件(不同的平台文件不一样)
- 如下文件添加到FreeRTOS_core内核文件夹中,包括.c和所有.h文件
- 如下文件添加到FreeRTOS_port接口文件夹中
- STM32F103系列单片机为M3内核
- 在Keil里面包含头文件所在路径
- 将官方demo里面的FreeRTOSConfig.h添加到FreeRTOS_core内核文件夹中
- FreeRTOSConfig.h作用:对FreeRTOS进行功能配置和裁剪(config),以及API函数(INCLUDE)的使能,其他配置项(PendSV、SVC宏定义)
- 最后保留FreeRTOS_core、FreeRTOS_port文件夹即可
3.2.2 时钟中断配置
- SysTick是FreeRTOS的心跳时钟,驱动FreeRTOS运行,在SysTick时钟的节拍下进入中断函数,每次中断都会引发任务调度
- 在stm32f10x_it.c里的SysTick_Handler()中断里添加函数内容,并加上头文件
void SysTick_Handler(void)
{if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)xPortSysTickHandler();
}
- 在FreeRTOSConfig.h里添加函数宏定义,使用官方的中断函数,
- 注释掉stm32f10x_it.c里的PendSV_Handler()函数和SVC_Handler()函数,避免重定义
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
- 如果遇到xTaskGetSchedulerState()函数未定义或其他可选函数未编译的情况下,需要改其宏定义为1,或者在FreeRTOSConfig.h里添加宏定义为1
- xTaskGetSchedulerState()函数是一个可选函数,当宏定义为1时可以编译
相关文章:

FreeRTOS-基本介绍和移植STM32
FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…...
在C++中,如何避免出现Bug?
C中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C中的一些技术,这些技术不仅帮助编写简单明了的代码&…...

Linux 操作系统 进程(1)
什么是进程 想要了解什么是进程,或者说,为什么会有进程这个概念,我们就需要去了解现代计算机的设计框架(冯诺依曼体系): 计算机从设计之初就以执行程序为核心任务,也就是运算器从内存中读取,也只从内存中…...
clickhouse-v24.1-离线部署
部署版本 数据库版本:24.1.1.2048 jdk版本:jdk8 4个文件(三个ck的包): OpenJDK8U-jdk_x64_linux_hotspot_8u382b05.tar clickhouse-client-24.1.1.2048.x86_64.rpm clickhouse-common-static-24.1.1.2048.x86_64.…...

安卓13删除app 链接库警告弹窗Detected problems with app native
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码修改彩蛋1.前言 有些客户的APP,打开首次会弹窗提示窗口, Detected problems with app native libraries (please consult log for detail):,需要删除这个窗口,避免挡住用户APP。而且这个提示有些app是以t…...
第四次北漂----挣个独立游戏的素材钱
第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以…...
漫谈设计模式 [12]:模板方法模式
引导性开场 菜鸟:老大,我最近在做一个项目,遇到了点麻烦。我们有很多相似的操作流程,但每个流程的细节又有些不同。我写了很多重复的代码,感觉很乱。你有啥好办法吗? 老鸟:嗯,听起…...
CSS学习10[重点]--浮动、浮动的效果以及内幕特性
CSS布局——浮动 前言一、普通流二、浮动三、什么是浮动?四、浮动的内幕特性总结 前言 CSS盒子布具的三种机制:普通流(标准流)、定位、浮动。 一、普通流 普通流:网页内元素自上而下,从左到右排序。 二、浮动 浮动…...

matlab基本语法
基本语法 变量命名规则 区分大小写长度不超过63位字母开头,可以有字母、下划线和数字组成,但不能使用标点应该简洁明了 命令行窗口 >>>clc 清楚命令窗口 >>> claer all 清理工作区内容 注释 %% 注释符 数据类型 1.数字 11 2…...

【Leetcode152】乘积最大子数组(动态规划)
文章目录 一、题目二、思路三、代码 一、题目 二、思路 (0)读懂题意:题目的“连续”是指位置的连续,而不是说数字的连续,这是个大坑。 (1)确定状态:定义两个状态来记录当前子数组的…...

STM32(十二):DMA直接存储器存取
DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源。(运行内存SRAM、程序存储器Flash、寄存器) 12个独立可配置的通道&…...
关于我2020年7月至今(2024.9)的“炒股”经历和感受
声明:我远不是一个成熟的投资者(这个名词太大了,我那三瓜两枣似乎完全配不上投资者这三个字,或者“小小散”更加贴切)。本文不构成任何入(股)市的引导或者买卖股票的建议。 “炒股”这个词,相信绝大多数人看来都-是一个贬义词&…...
【Tools】Prompt Engineering简介
摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样 🎵 方芳《摇太阳》 大模型中的Prompt Engineering是指为了提高大模型在特定任…...

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信
目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds 总结 fd_set操作接口 timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充 获取新连接 注意点 -- 通信时的调用函数 添…...

乐鑫安全制造全流程
主要参考资料: 【乐鑫全球开发者大会】DevCon24 #10 |乐鑫安全制造全流程 乐鑫官方文档Flash加密: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/security/flash-encryption.html 【ESP32S3】使用 Flash 下载工具完成 Flash 加密功能…...
〖open-mmlab: MMDetection〗解析文件:configs/_base_/schedules
详细解析三个训练调度文件:schedule_1x.py、schedule_2x.py、schedule_20e.py 在深度学习模型训练过程中,训练调度(Training Schedule)是至关重要的,它决定了模型训练过程中学习率(Learning Rate, LR&…...
Android之Handler是如何保证延迟发送的
目录 核心组件延迟发送消息的工作原理具体步骤1. 创建 Handler:2.发送延迟消息3.消息入队列4.消息出队和处理: 关键点总结 在 Android 中,Handler 是用于在不同线程之间传递和处理消息的工具。它可以用于定时任务、延迟执行任务等。Handler 如何保证延迟发送消息的核…...
定位信标、基站、标签,定位信标是什么
定位信标、基站、标签,定位信标是什么 今天给各位分享定位信标、基站、标签的知识,其中也会对定位信标是什么进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 怎样做人员定位啊? 〖…...

2024国赛数学建模B题完整分析参考论文38页(含模型和可运行代码)
2024 高教社杯全国大学生数学建模完整分析参考论文 B 题 生产过程中的决策问题 目录 摘要 一、问题重述 二、问题分析 三、 模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.…...
Hive是什么?
Apache Hive 是一个基于 Hadoop 的数据仓库工具,用于在 Hadoop 分布式文件系统(HDFS)上管理和查询大规模结构化数据集。Hive 提供了一个类似 SQL 的查询语言,称为 HiveQL,通过这种语言可以在 HDFS 上执行 MapReduce 作…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...