FreeRTOS(调度锁,中断锁,任务锁,时间管理)

news2024/11/23 21:22:34

 资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理)

一、调度锁、中断锁,任务锁概念

1、调度锁

调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调度锁关之间的代码在执行期间是不会被高优先级的任务抢占的,即任务调度被禁止。这一点要跟临界段的作用区分开,调度锁只是禁止了任务调度,并没有关闭任何中断,中断还是正常执行的。而临界段进行了开关中断操作。

2、中断锁

中断锁就是 RTOS 提供的开关中断函数,FreeRTOS 没有专门的中断锁函数使用中断服务程序临界段处理函数就可以实现同样效果。

3、任务锁

为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制就是任务锁。FreeRTOS 也没有专门的任务锁函数,但是使用 FreeRTOS 现有的功能有两种实现方法:

①利用调度锁关闭任务切换  ② 利用 FreeRTOS 的任务代码临界段处理函数关闭 PendSV 中断和 Systick 中断,进而关闭任务切换。

二、调度锁编程测试

1、调度锁开启函数

调度锁开启函数:void vTaskSuspendAll(void)

使用这个函数要注意以下问题:

①. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。

②. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。

③. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。

调度锁关闭函数  BaseType_t vTaskResumeAll(void)

调度锁关闭后,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE。

使用这个函数要注意以下问题:

①. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。

②. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。

③. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。

2、应用方法

void LED0_Task(void const *argument) {
	/* USER CODE BEGIN LED0_Task */
	/* Infinite loop */
	for (;;)
	{

		HAL_Delay(2000);
		//调度器锁
		vTaskSuspendAll();

		HAL_Delay(5000);
		if (xTaskResumeAll() == pdTRUE)
		{
			taskYIELD(); //立即进行任务切换
		}
	}
	/* USER CODE END LED0_Task */
}

三、调度锁编程测试

1、测试方法

创建2个任务,情况如下:

任务1:优先级低,启用调度锁,调度锁开关之间使用HAL_Delay延时5s,退出调度锁后,使用HAL_Delay继续延时2s

任务2:优先级高,指示灯100ms快闪

2、分析

任务2本应该间隔100ms连续快闪,由于低优先级的任务一调用了调度锁开关函数,而且延时了5s,延时期间关闭了任务切换,在此期间,任务2不运行,结果就是任务2的指示灯间隔5s快闪10次。

四、时间管理

1、系统节拍

FreeRTOS实时操作系统需要一个时钟节拍,以供系统处理诸如延时、超时、软件定时器等与时间相关的事件。滴答定时器 Systick:SysTick 定时器位于 NVIC 中,用于产生 SysTick 异常(异常号:15),滴答定时器是一个 24 位的递减计数器,支持中断。使用比较简单,专门用于给操作系统提供时钟节拍。FreeRTOS 的系统时钟节拍可以在配置文件 FreeRTOSConfig.h 里面设置:

#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )

如上所示的宏定义配置表示系统时钟节拍是 1KHz,即 1ms。

2、延时相关函数

①作用:FreeRTOS 中的时间延迟函数主要有以下两个作用:

 为周期性执行的任务提供延迟。

 对于抢占式调度器,让高优先级任务可以通过时间延迟函数释放 CPU 使用权,从而让低优先级任务可以得到执行。

②相关函数

 vTaskDelay ():osDelay(200) )用于任务的延迟。 属于相对延时,指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间(参数:滴答值)结束。 

vTaskDelayUntil ():用于周期性延迟。 属于绝对延时,指间隔指定的时间(参数:滴答值),执行一次调用vTaskDelayUntil()函数的任务。使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1

#define INCLUDE_vTaskDelayUntil 1

xTaskGetTickCount() :用于获取系统当前运行的时钟节拍数。使用这个函数要注意以下问题:

此函数用于在任务代码里面调用,如果在中断服务程序里面调用的话,需要使用函数xTaskGetTickCountFromISR,这两个函数切不可混用。

xTaskGetTickCountFromISR() :用于获取系统当前运行的时钟节拍数。使用这个函数要注意以下问题:

 此函数用于在中断服务程序里面调用,如果在任务里面调用的话,需要使用函数 xTaskGetTickCount,这两个函数切不可混用。

 3、相对延时与绝对延时

 相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间(参数:滴答值)结束。

 绝对延时:指间隔指定的时间(参数:滴答值),执行一次调用vTaskDelayUntil()函数的任务。

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

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

相关文章

喜报!诚恒科技与赛时达科技达成BI金蝶云星空项目合作

随着全球数字化浪潮轰轰烈烈袭来,仅仅凭借手工处理的方式难以在庞大的数据海洋中精准获取信息、把握市场需求、了解目标用户,为企业创新提供强有力的支持。深圳赛时达科技有限公司(简称赛时达科技)希望通过数字化转型实现从手工处…

在Excel中将数值差距极大的两个序列用对比明显的折线图表示

在Excel中,如果两个数据序列的数值差距太大,用这样的数据序列生成折线图时,折线图会显得过于平缓,趋势对比不明显。如下图: 这时候只要将趋势图设置成双坐标轴,将其中一条趋势线绘制到次坐标轴上&#xff0…

PHP傻瓜也能搭建自己框架

PHP最简单自定义自己的框架(一) PHP最简单自定义自己的框架创建目录结构(二) PHP最简单自定义自己的框架定义常量自动生成目录(三) PHP最简单自定义自己的框架控制器自动加载运行(四&#xf…

算法随笔:图论问题之割点割边

割点 定义 割点的定义:如果一个点被删除之后会导致整个图不再是一个连通图,那么这个顶点就是这个图的割点。举例: 上图中的点2就是一个割点,如果它被删除,则整个图被分为两个连通分量,不再是一个连通图。…

CSS 中的优先级规则是怎样的?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐内联样式(Inline Styles)⭐ID 选择器(ID Selectors)⭐类选择器、属性选择器和伪类选择器(Class, Attribute, and Pseudo-class Selectors)⭐元素选择器和伪元素选择器…

Flink源码之JobMaster启动流程

Flink中Graph转换流程如下: Flink Job提交时各种类型Graph转换流程中,JobGraph是Client端形成StreamGraph后经过Operator Chain优化后形成的,然后提交给JobManager的Restserver,最终转发给JobManager的Dispatcher处理。 Completa…

激活函数总结(五):Shrink系列激活函数补充(HardShrink、SoftShrink、TanhShrink)

激活函数总结(五):Shrink系列激活函数补充 1 引言2 激活函数2.1 HardShrink激活函数2.2 SoftShrink激活函数2.3 TanhShrink激活函数 3. 总结 1 引言 在前面的文章中已经介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swis…

新一代分布式融合存储,数据场景All In One

1、摘要 2023年5月11日,浪潮信息全国巡展广州站正式启航。会上,重磅发布新一代分布式融合存储AS13000G7,其采用极致融合架构设计理念,实现同一套存储满足四种非结构化数据的“All In One”高效融合,数据存力提升300%&a…

机器学习基础之《特征工程(4)—特征降维—案例》

一、探究用户对物品类别的喜好细分 1、找到用户和物品类别的关系 数据如下: (1)order_products__prior.csv:订单与商品信息 字段:order_id,product_id,add_to_cart_order,reordered…

【已解决】mac端 sourceTree 解决remote: HTTP Basic: Access denied报错

又是在一次使用sourcetree拉取或者提交代码时候,遇到了sourcetree报错; 排查了一会,比如查看了SSH keys是否有问题、是否与sourcetree账户状态有问题等等,最终才发现并解决问题 原因: 因为之前公司要求企业gitlab中…

平板选择什么电容笔比较好?ipad手写笔推荐品牌

在现在的生活上,有了iPad平板,一切都变得简单了许多,也让我们的学习以及工作都更加的便利。这其中,电容笔就起到了很大的作用,很多人都不知道,到底要买什么牌子的电容笔?哪些电容笔的性价比比较…

佛祖保佑,永不宕机,永无bug

当我们的程序编译通过,能预防的bug也都预防了,其它的就只能交给天意了。当然请求佛祖的保佑也是必不可少的。 下面是一些常用的保佑图: 佛祖保佑图 ——————————————————————————————————————————…

那些年的iOS开发经验记录

【iOS】Cydia Impactor 错误:file http.hpp; line:37; what: _assert(code 200) Cydia Impactor 报错,信息如下 file http.hpp; line:37; what: _assert(code 200)解决方案:Cydia Impactor 已被弃用,切…

一文盘点 Zebec 生态的几个利好预期

Zebec Protocol 是目前商业进展最快的流支付体系,也是推动流支付向 Web2 世界发展的主要生态。目前,其已经与包括 Visa、Master 等支付巨头展开了合作,以推出银行卡的方式进一步向金融发达地区推出 Zebec Card 以拓展业务,前不久其…

电商系统架构设计系列(八):订单数据越来越多,数据库越来越慢该怎么办?

上篇文章中,我给你留了一个思考题:订单数据越来越多,数据库越来越慢该怎么办? 今天这篇文章,我们来聊一下如何应对数据的持续增长,特别是像订单数据这种会随着时间一直累积的数据。 引言 为什么数据量越大…

牛客小白月赛71E题题解

文章目录 猫猫与数学问题建模问题分析1.转换条件2.分析新的gcd3.方法1筛约数判断代码 4.方法2筛质因子判断代码 猫猫与数学 问题建模 给定两个正整数a,b,问能否找到最小的整数c,使得gcd(ac,bc)不等于1,若可以输出c,不…

PE启动盘和U启动盘(第三十六课)

PE启动盘和U启动盘(第三十六课) 一 WindowsPE工具盘 1. 制作WinPE镜像光盘 双击WePE64_V2.2-是-点击右下角光盘图标-选择ISO的输出位置-立即生成ISO 2. 通过光盘启动WinPE

Vue [Day7]

文章目录 自定义创建项目ESlint 代码规范vuex 概述创建仓库向仓库提供数据使用仓库中的数据通过store直接访问通过辅助函数 mapState(简化)mutations传参语法(同步实时输入,实时更新辅助函数 mapMutationsaction (异步辅助函数map…

【Java学习】System.Console使用

背景 在自学《Java核心技术卷1》的过程中看到了对System.Console的介绍,编写下列测试代码, public class ConsoleTest {public static void main(String[] args) {Console cs System.console();String name cs.readLine("AccountInfo: ");…

谷粒商城第十一天-完善商品分组(主要添上关联属性)

目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 一、总述 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口,还有就是加上关联的那一套逻辑,…