单片机-FreeRTOS(ing)

目录

一、基础介绍

1.1 调度策略

1.1.1 调度方式

1.1.2 调度器

1.2 任务以及优先级

1.2.1 任务与协程

1.2.2 任务状态

1.2.3 任务优先级

1.2.4 任务优先级分配方案

1.3 任务间通信 - 信号量

1.3.1 信号量

1.3.2 任务间计数信号量的实现

1.3.3 中断方式计数信号量的实现

1.3.4 计数信号量API函数

1.4 任务间通信 - 消息队列

1.4.1 消息队列

1.4.2 任务间消息队列的实现

1.4.3 中断方式消息队列的实现

1.4.4 消息队列常用API

1.5 任务间通信 - 互斥信号量

1.5.1 互斥信号量概念

1.5.2 优先级翻转

1.5.3 互斥信号量的实现

1.5.4 常用互斥锁API


一、基础介绍

1.1 调度策略

1.1.1 调度方式

抢占式调度、时间片调度、合作式调度;

其中以抢占式、时间片为主,少见合作式;

(1).抢占式调度:任务有优先级,程序被高优先级先抢占,或者遇到阻塞式API函数;

(2).时间片调度:每个任务优先级相同,任务运行固定的时间片;

1.1.2 调度器

调度器会使用相关的调度算法,来决定当前应该做哪个任务;
调度器的共同特性:
(1).可以区分就绪态、挂起态任务;
(2).可以激活就绪态任务,让它变成正在运行的运行态任务;
(3).不同调度器之间最大区别是如何分配就绪态任务间的完成时间;
操作系统核心是调度器和任务的切换;


1.抢占式调度器:
需要实现抢占式调度器,可以先在FreeRTOS配置文件FreeRTOSConfig.h中禁止使用时间片调度,这时候每个任务都需要配置不同优先级;
优先级值越大,优先等级越高;
比如,现在有任务Task1,Task2,Task3,他们的优先级分别是1,2,3;
此时会先运行Task3,直到它遇到系统阻塞式的API函数(比如延迟、标志位等),这时候Task3被挂起,到了Task2运行,以此类推;

2.时间片调度器:
这个可以理解为,在同优先级的情况下。把时间拆分成时间片,比如现在有Task1,Task2,Task3,那么时间片先都为5个系统时钟,Task1运行5个系统时钟然后到Task2,Task2也运行5个,到Task3。

不管你干完了没有,你的时间片用完了,就该到下一个任务运行。并且在这过程中,发生了阻塞,那么这个时间片过完了,也到下一个任务,并不会因为阻塞而等待;

1.2 任务以及优先级

1.2.1 任务与协程

!目前FreeRTOS 的协程功能在较新的版本中已被标记为 “过时”(deprecated),官方推荐使用轻量级任务(Lightweight Tasks) 或软件定时器替代。

协程与标准任务的区别:

  • 调度方式:任务是抢占式的(优先级决定执行权),协程是协作式的(需主动让出 CPU)。
  • 资源占用:协程栈开销小,适合内存紧张的系统;任务需要独立栈空间,内存消耗更大。
  • 实时性:任务适合强实时需求,协程适合对响应时间要求不高的场景。

适用场景:

  • 周期性执行但实时性要求不高的任务(如状态监测、日志打印)。
  • 内存受限的小型嵌入式系统。
  • 简化复杂状态机的实现(避免使用大量全局变量保存状态)。

1.2.2 任务状态

运行:正在执行,正在占用处理器;
就绪:任务准备执行,但是因为目前有更高优先级的任务在执行。这个不同于阻塞和挂起;
阻塞:任务在等待某个触发条件,一般进入阻塞态有个超时周期,超时后解除阻塞;
挂起:任务被强制暂停,不会参与调度,且无法被任何事件(包括超时)唤醒。

1.2.3 任务优先级

FreeRTOS最高优先级是通过 FreeRTOSConfig.h文件中的 configMAX_PRIORITIES进行配置的,实际可以用的优先级范围是 [0,configMax_PRIORITIES-1];
比如configMAX_PRIORITIES=5,那么优先级可以填 0,1,2,3,4;

优先级0表示的是空闲任务,一般建议configMAX_PRIORITIES<32;

1.2.4 任务优先级分配方案

IRQ任务:通过中断服务程序进行触发的任务,这种任务优先级最高;
高优先级后台任务:如按键检测、触摸检测、USB消息处理、串口消息处理;
低优先级:比如LED数码管显示,不需要实时性很强的任务;


这里记得把IRQ任务、高优先级任务设置成阻塞式,这样才能释放CPU使用权,让低优先级任务有机会执行;

1.3 任务间通信 - 信号量

1.3.1 信号量

信号量最初是为了共享资源建立一个标志,该标志表示占用情况;
像是停车场剩余车位,比如刚开始初始值设置为50个空闲位置。有车进来就-1,假如减到0了,也就是没车位了,那么需要停车场内有车出去,新来的车才能停进来,要不就等着;


功能:

(1).任务之间  或者  中断函数与任务之间  的同步;
(2).多个共享资源的管理;

1.3.2 任务间计数信号量的实现

任务间信号量,是指各个任务间使用信号量实现任务同步 或者 资源共享功能;
 

其实很好理解,有点像我们平时写代码时的标志位;
目前有两个任务 Task1、Task2,计数信号量可用资源为1;

任务Task1运行时,用xSemaphoreTake获取信号量资源,假如资源没被占用,那么Task1直接获取资源,或者Task2占用了信号量,那么Task1转到阻塞态,等待资源可用。Task1在获取资源,并且使用后,通过xSemaphoreGive释放资源;
在运行Task2时,也是按上面的逻辑;

1.3.3 中断方式计数信号量的实现

FreeRTOS中断方式信号量的实现,是指中断函数 与 FreeRTOS任务之间使用信号量;

目前假设有一个任务Task1,和一个串口接受中断;
信号量初始值为0,串口中断调用xSemaphoreGiveFromISR 释放信号量,Task1调用xSemaphoreTake获取信号量资源;

运行流程:
(1).Task1 调用xSemaphoreTake获取信号量,但是初始值是0,没资源可以用,进入阻塞态;
(2).串口接受中断接受到新数据,在中断服务函数中调用xSemaphoreGiveFromISR释放信号量资源,信号量数值+1,Task1从阻塞态到就绪态,获取信号量后,信号量计数值-1,变成0;
(3).再次循环时,Task1调用xSemaphoreTake没资源可用,再进入阻塞,再等串口接受新数据;

注意事项:
(1).中断函数执行时间要短,防止其他低于中断优先级的异常没及时响应;
(2).不要在中断中实现消息处理,应该在中断服务函数中发送消息通知,然后在任务中进行消息处理。并且要注意这个任务优先级,使退出中断服务函数后,任务可以及时执行;
(3).中断服务程序中一定要调用专用于中断的信号量设置函数,即以FromISR结尾的函数;

1.3.4 计数信号量API函数

单片机 - FreeRTOS 常用的API(未完)-CSDN博客

1.4 任务间通信 - 消息队列

1.4.1 消息队列

  • 指通过RTOS内核提供的服务,任务或者中断子程序可用把一个消息(FreeRTOS中传递的是实际数据)放入到队列,同时任务或者中断子程序 可用从中获取;
     
  • 支持 FIFO 和 LIFO 的数据存取方式;

1.4.2 任务间消息队列的实现

假设消息队列可以放10个消息;
创建了Task1 和 Task2 两个任务,Task1放数据,Task2取数据;
采用FIFO方式;

假如Task1放数据的速度,比Task2取数据的速度快,消息会放满,FreeRTOS的消息存放函数xQueueSend支持超时等待;
同样的,取的速度大于存的速度,消息获取函数xQueueReceive支持超时等待;

1.4.3 中断方式消息队列的实现

假设消息队列可以放10个消息;
创建任务Task1,和串口接收中断;
采用FIFO;

串口中断接受到消息后进行中断,往队列里放数据。Task1从队列里取数据,

(1).串口中断放数据速度 超过 Task1取数据的速度,则会造成存放过满,但是中断服务程序的消息队列发送函数 xQueueSendFromISR 不支持超时设置,所以发送前要用 xQueueIsQueueFullFromISR 检测消息队列是否满了;

(2).假如是取数据的速度  超过  放数据的速度。这时候消息队列是空的,Task1没东西取,而且Task1 获取消息的函数是 xQueueReceive ,这个函数可以设置超时等待,没消息Task1就等着,直到队列中有消息,或者是超过我们设定的时间;

1.4.4 消息队列常用API

单片机 - FreeRTOS 常用的API(ing)-CSDN博客

1.5 任务间通信 - 互斥信号量

1.5.1 互斥信号量概念

主要作用是对资源实现互斥访问,类似二值信号。互斥信号与二值信号的区别是 互斥信号可以防止优先级翻转;

1.5.2 优先级翻转

假设目前有3个任务 Task1,Task2,Task3,优先级分别是3,2,1,Task1优先级最高;

任务Task1 和 Task3互斥访问串口打印 printf,采用二值信号实现互斥访问;
Task3通过二值信号调用printf,被Task1抢占了,开始做Task1;

运行过程:
(1).Task1在运行时需要printf,这时候Task3正在用printf,就会把Task1挂起,等Task3释放printf;
(2).调度器的作用下,Task3运行过程中,Task2就绪,把Task3给抢了。优先级翻转出现在这;
(3).Task3因为被Task2抢了任务,所以没法及时释放printf,这时候变成得等待Task2干完之后,才能释放printf,然后才到Task1;
 

1.5.3 互斥信号量的实现

首先,我们引入互斥信号量这一步,是为了解决1.5.2 中的优先级翻转问题;
 

互斥信号量的实现是这样的:
比如Task1和Task2的优先级分别是1和3,首先先是Task1在执行,这时候Task2也需要占用这个资源。那么会先把Task1的优先级抬到3,也就是和Task2的优先级一样,这时候就算有一个优先级是2的任务,也无法抢占Task1;

然后是Task2被挂起,Task1释放资源,Task2等待资源,这里Task1释放完资源,又会回到1的优先级;
 

1.5.4 常用互斥锁API

单片机 - FreeRTOS 常用的API(ing)-CSDN博客

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

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

相关文章

为什么调用API总返回404,该如何调试

当调用一个应用程序接口&#xff08;API&#xff09;时&#xff0c;持续地收到“404 未找到”的错误&#xff0c;其核心原因在于客户端发起的“请求”&#xff0c;未能成功地&#xff0c;匹配到服务器上任何一个“真实存在”的、可供访问的“资源路径”。这本质上&#xff0c;是…

医疗信息化自主可控转型的实践探索 —— 以常德二院为例

目录 头雁领航 - 激发医疗新质生产力 核心支撑 - 电科金仓奠定数据底座 生态共建 - 携手护航医疗信创发展 信创产业发展是国家经济数字化转型、提升产业链发展的关键&#xff0c;是科技自立自强的核心基座&#xff0c;其本质是实现中国信息化产业的自主可控。医疗信创作为关…

Gin传参和接收参数的方式

Gin查询参数和接收参数的方式 常用 Gin 绑定方法对比方法用途特点c.Bind()自动识别 Content-Type最通用&#xff0c;根据请求头自动选择绑定方式c.ShouldBindJSON()只绑定 JSON强制使用 JSON 格式&#xff0c;类型明确c.ShouldBindXML()只绑定 XML强制使用 XML 格式c.ShouldBin…

MariaDB/MySQL 客户端工具与服务端配置精要指南

文章目录一、客户端与服务端程序二、用户账号管理三、MySQL 客户端命令3.1 命令类型​3.2 使用模式​3.3 常用选项​3.4 提示符定制​四、mysqladmin管理命令​​五、服务端配置​5.1 配置文件​​​5.2 Socket 通信配置​​六、最佳实践总结免费个人运维知识库&#xff0c;欢迎…

自动化项目日报生成工具测评与选型:如何匹配团队日报管理需求

引言在项目管理场景中&#xff0c;手动撰写日报常面临多重效率瓶颈&#xff1a;任务数据分散在协作群、Excel 表格、项目看板等多个平台&#xff0c;汇总时需反复核对&#xff1b;不同成员日报格式不统一&#xff0c;管理层整合分析耗时&#xff1b;任务进度与日报信息不同步&a…

基于SpringBoot+Vue的吴韵苏香文旅小程序(协同过滤算法、Echarts图形化分析、腾讯地图API、二维码识别)

&#x1f388;系统亮点&#xff1a;协同过滤算法、Echarts图形化分析、腾讯地图API、二维码识别&#xff1b;一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17小程序&a…

python numpy.random的基础教程(附opencv 图片转数组、数组转图片)

目录 1.在区间[a,b)随机生成n个整数。 2.在区间[a,b)随机生成n个数。 3.在区间[0,1)生成随机数 4.打乱顺序 5.从指定的列表中选择 NumPy&#xff08;Numerical Python&#xff09;是一个开源的科学计算库&#xff0c;专门用于高效处理多维数组&#xff08;ndarray&#xf…

Vue2.x核心技术与实战(二)

目录 三、Vue2.x:生命周期+工程化开发(组件入门) 3.1 生命周期 3.1.1 生命周期 & 生命周期四个阶段 3.1.2 生命周期钩子 Vue生命周期钩子案例 - 新闻列表 & 输入框自动聚焦 3.2 综合案例:小黑记账清单 3.3 工程化开发入门 3.3.1 工程化开发 & 脚手架Vue …

【鸿蒙心迹】7×24小时极限求生:当Origin_null遇上鸿蒙,我如何用100杯咖啡换一条跨域活路?

文章概要 大家好&#xff0c;我是那个把黑眼圈熬成华为工牌挂绳的倒霉蛋。过去100个夜晚&#xff0c;我在HarmonyOS NEXT的ArkWeb里被Origin:null反复按在地上摩擦——小程序白屏、OPTIONS 400、官方文档沉默三连击。最终&#xff0c;我用C、libcurl、OpenSSL和一堆速溶咖啡&am…

【git】删除一条本地提交的历史commit

在工程中&#xff0c;如果想要删除一条本地提交的历史commit&#xff0c;可以通过droprebase -i HEAD^n的方式。1.情景提交了三条commit&#xff0c;想删掉第二条commit。git logcommit_id_*******1 commit_id_*******2 commit_id_*******32.解决git rebase -i HEAD~2输出&…

软件测试中,JMeter 的作用以及优缺点是什么?

回答重点JMeter 是一款开源的软件测试工具&#xff0c;主要用来对各种软件或服务进行性能测试和负载测试。它可以模拟大量用户同时对服务器、网络或其他资源发起请求&#xff0c;从而测试它们的响应时间、吞吐量等性能指标。优点&#xff1a;1&#xff09; 开源且免费 &#xf…

STM32存储结构

我们在使用Keil编译程序成功后会,有一行各部分占用内存的提示信息,如下Program Size:Code7492 RO-data556 Rw-data72 ZI-data11688,这是stm32代码编译后的提示我们分析一下这个编译输出&#xff1a;- Code: 7492字节 -> 代码部分&#xff08;存放在Flash&#xff09;- RO-da…

手机 浏览器调用摄像头扫描二维码Quagga

注&#xff1a;需用谷歌浏览器才能调用权限1. 引入依赖&#xff1a;npm install ericblade/quagga2<template><el-button color"#188ae2" click"handleScan" class"scan-btn" :disabled"isInitializing || isScanning">{{…

【Oracle篇】伪列之Version Query:全链路追踪行数据变更的所有记录(不仅仅是被修改的最后时间)(第二篇,总共六篇)

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页__奈斯DB    &#x1f50e; IF Club社区主页__奈斯、 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对…

代理模式深度解析:从静态代理到 Spring AOP 实现

代理模式是软件开发中一种经典的设计模式&#xff0c;它通过引入 "代理对象" 间接访问目标对象&#xff0c;从而在不修改目标对象代码的前提下&#xff0c;实现功能增强&#xff08;如日志记录、事务管理&#xff09;、权限控制等横切需求。从简单的静态代理到灵活的…

算法 ----- 链式

目录 一 、链式 二 、题目 1、两两相加 &#xff08;1&#xff09;题目 (3) 代码书写 2、两两交换链表中的节点 &#xff08;1&#xff09;题目 &#xff08;2&#xff09; 解题思路 &#xff08;3&#xff09;代码书写 3、重排链表 &#xff08;1&#xff09;题目 …

运维监控prometheus+grafana

目录 一、环境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、验证、使用 一、环境 系统使用CentOS7虚拟机。 监控三台服务器&#xff1a; 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …

数字孪生 :提高制造生产力的智能方法

近年来&#xff0c;在先进数字技术深度整合的推动下&#xff0c;制造业经历了深刻变革。数字孪生技术作为其中最具前景的创新之一&#xff0c;正重塑工厂和生产流程的设计、监控和优化方式。该技术的核心在于为物理资产、系统或流程创建虚拟映射。这种虚拟映射实时同步现实世界…

【论文阅读】-《SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK》

Sign-OPT: 一种查询高效的硬标签对抗攻击 原文链接&#xff1a;https://arxiv.org/pdf/1909.10773 摘要 我们研究在访问受限情况下评估机器学习系统对抗鲁棒性的最实用问题设置&#xff1a;用于生成对抗样本的硬标签黑盒攻击设置&#xff0c;其中允许有限的模型查询&#xff…

安卓11 12系统修改定制化_____如何去掉 搜狗输入法 首次运行时权限授权弹窗 其他应用可借鉴

有些内置应用或者第三方应用在首次使用时会跳出权限允许弹窗。虽然这个是系统为了用户安全设置的一道检测机制。但无形之中会影响到定制类用户的使用。那么能不能去除这个首次运行的权限弹窗呢。其实也有多方法可参阅解决。 通过博文了解💝💝💝 1💝💝💝-----首次…