FreeRTOS学习(十):任务调度器挂起与恢复机制详解

news2025/3/31 2:21:17

FreeRTOS学习(十):任务调度器挂起与恢复机制详解


文章目录

  • FreeRTOS学习(十):任务调度器挂起与恢复机制详解
  • 简介
  • 一、 任务挂起与恢复的API函数
    • 1.1 任务挂起函数
    • 1.2 任务恢复函数
  • 二、重要特性
    • 与临界区的区别
    • 资源保护
  • 三、任务切换实例
    • 生活中的类比
    • 实际代码示例
      • 共享资源场景
    • 为什么需要任务挂起?
    • 数据一致性问题
    • 使用任务挂起后
    • 运行效果
  • 总结


简介

在FreeRTOS中,任务挂起和恢复是重要的任务管理机制。通过使用vTaskSuspendAll()和xTaskResumeAll()这两个API函数,我们可以实现任务的挂起和恢复操作


一、 任务挂起与恢复的API函数

1.1 任务挂起函数

vTaskSuspendAll();

这个函数用于挂起任务调度器。

1.2 任务恢复函数

xTaskResumeAll();

这个函数用于恢复任务调度器的运行。

二、重要特性

与临界区的区别

与临界区保护不同,任务挂起机制具有以下特点:

  • 挂起调度器时不会关闭中断
  • 更加灵活的任务管理方式
  • 适用于需要临时暂停任务调度的场景

资源保护

  • 任务挂起机制主要用于防止任务间的资源争夺
  • 中断仍然可以正常响应,不影响系统的实时性
  • 提供了一种轻量级的任务同步方式

三、任务切换实例

生活中的类比

想象你正在一家餐厅工作,需要同时处理多个任务:

  • 任务1:接待顾客点餐
  • 任务2:制作饮品
  • 任务3:结算账单
    就像一个服务员需要在这些工作之间切换一样,FreeRTOS也需要在不同的任务之间进行切换

实际代码示例

共享资源场景

假设我们有一个简单的温度监控系统,包含两个任务:

  • 温度采集任务
  • 数据显示任务
// 定义共享资源
float currentTemperature = 0.0;

// 温度采集任务
void vTaskTemperatureSample(void *pvParameters)
{
    float tempValue;
    
    while(1)
    {
        // 读取温度传感器
        tempValue = ReadTemperatureSensor();  // 假设这是读取传感器的函数
        
        // 更新共享资源前挂起调度器
        vTaskSuspendAll();
        currentTemperature = tempValue;  // 更新全局温度变量
        xTaskResumeAll();  // 恢复调度器
        
        vTaskDelay(pdMS_TO_TICKS(1000));  // 每秒采样一次
    }
}

// 显示任务
void vTaskDisplay(void *pvParameters)
{
    float tempToDisplay;
    
    while(1)
    {
        // 读取共享资源前挂起调度器
        vTaskSuspendAll();
        tempToDisplay = currentTemperature;  // 读取全局温度变量
        xTaskResumeAll();  // 恢复调度器
        
        // 显示温度值
        printf("Current Temperature: %.2f°C\n", tempToDisplay);
        
        vTaskDelay(pdMS_TO_TICKS(500));  // 每500ms更新一次显示
    }
}

// 主函数
int main(void)
{
    // 创建任务
    xTaskCreate(vTaskTemperatureSample, "TempSample", 1000, NULL, 2, NULL);
    xTaskCreate(vTaskDisplay, "Display", 1000, NULL, 1, NULL);
    
    // 启动调度器
    vTaskStartScheduler();
    
    return 0;
}

为什么需要任务挂起?

数据一致性问题

如果不使用任务挂起机制,可能会出现以下问题:

假设正在执行这样的操作序列:

  1. 温度采集任务正在更新currentTemperature
  2. 还没更新完,任务切换发生
  3. 显示任务读取了一个"更新到一半"的温度值
  4. 导致显示错误的数据

使用任务挂起后

使用vTaskSuspendAll()和xTaskResumeAll()后:

  1. 温度采集任务在更新温度时挂起调度器
  2. 确保温度更新操作不会被打断
  3. 显示任务在读取温度时也挂起调度器
  4. 确保读取到的是完整的温度数据

运行效果

Current Temperature: 25.30°C
Current Temperature: 25.31°C
Current Temperature: 25.32°C

每次显示的温度值都是完整的、一致的数据。


总结

FreeRTOS的任务挂起与恢复机制提供了一种灵活的任务管理方式,相比临界区保护更加轻量级,同时保持了中断响应能力。在需要防止任务切换但又不想完全关闭中断的场景下,可以很好的保证这个任务做完为止。

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

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

相关文章

【C++】内存模型分析

在 C 语言中,程序运行时的内存通常被划分为以下几个区域: 代码区(Text Segment)常量区(Constant Segment)全局/静态区(Data Segment,包含静态数据段和 BSS 段)堆区&…

Vue2+OpenLayers携带请求头加载第三方瓦片数据

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 一、案例截图 在对接一些第三方GIS地图的时候,需要携带请求头来验证身份,从而获取相应的瓦片数据,这时候我们需要改造一下WMTS服务的调用方式,效果如图所示: 二、安装OpenLayers库 npm install ol 三、代码实现…

智能汽车图像及视频处理方案,支持视频实时拍摄特效能力

在智能汽车日新月异的今天,美摄科技作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案,一个集高效性、智…

数据结构--顺序表(实现增删改查)

三个文件(Mytest.c 、MySeqList.c 、 MySeqList.h) Mytest.c测试函数 MySeqList.c 函数定义 MySeqList.h函数声明 增删改查的步骤: 初始化 增加元素 • 尾插:先检查顺序表空间是否足够,若不足则进行扩容&#x…

【android】补充

3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线性布局Linea…

说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?

大家好,我是锋哥。今天分享关于【说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?】面试题。希望对大家有帮助; 说说MyBatis一、二级缓存和Spring一二级缓存有什么关系? 1000道 互联网大厂Java工程师 精选面试题-Java资源…

蓝桥杯题型分布2

蓝桥杯 蓝桥杯题型分类2素数孪生素数素数个数朴素筛法求素数线性筛法求素数 因数分解试除法分解质因数 等差素数列梅森素数组素数素数环找素数(分段筛)连续素数和小明的素数对疑似素数质数拆分纯质数超级质数质数日期质数游戏2魔法阵的能量阿坤老师切割年糕阶乘分解…

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…

Element UI实现表格全选、半选

制作如图所示的表格全选、半选&#xff1a; 父组件 <template><div id"app"><SelectHost :hostArray"hostArray" /></div> </template><script> import SelectHost from ./components/SelectHost.vue export default…

如何使用动作捕捉系统训练人形机器人

随着人形机器人变得越来越先进&#xff0c;使用动作捕捉系统教会它们如何像人类一样移动成为了人形机器人领域正在研究的全新方向。本文探讨了如何使用Xsens技术捕捉精确的人类运动数据&#xff0c;使机器人能够通过人工智能和机器学习安全高效地学习、适应和执行复杂任务。 近…

内网渗透技术 Docker逃逸技术(提权)研究 CSMSF

目录 如何通过上传的webshell判断当前环境是否是物理环境还是Docker环境 方法一&#xff1a;检查文件系统 方法二&#xff1a;查看进程 方法三&#xff1a;检查网络配置 方法四&#xff1a;检查环境变量 方法五&#xff1a;检查挂载点 总结 2. 如果是Docker环境&#x…

生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店

前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的&#xff0c;然而切换到cmd时&#xff0c;突然发现cmd中无法识别anaconda的python环境&#xff0c;竟然打开了应用商店让我安装Python&#xff0c;这当然是不对的。 解决 这是因为…

如何在linux中部署dns服务 主备dns (详细全过程)

环境centos 7.9 主DNS&#xff1a;192.168.60.131 备DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…

word写latex-Mathtype安装成功-方法

MathType安装报错 想在word写latexMathtype, 网上搜教程安装&#xff0c; 结果一直报错一直删重来&#xff0c; 一直报错一直删了重来 一直报错一直删了重来来来&#xff0c; 就这么反反复复一直不好 网上的教程都是教你不是删mathtype, 就是删office 时代变了啊&#x…

【踩坑日记】springboot 打包后实现类无法找到

试过了所有改什么目录 依赖 clean都以失败告终 最后将实现类的文件名从Impl改成impl宣布成功 记得使用idea自带的重构

deepseek(2)——deepseek 关键技术

1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键&#xff08;keys&#xff09;和值&#xff08;values&#xff09;在推理过程中的缓存&#xff0c;从而提高推理效率&#xff1a; c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKV​WDKVht​…

Linux (Centos7)安装Mongodb4.0.28

一、官网下载安装包上传到服务器系统 官网&#xff1a;https://www.mongodb.com/try/download/community 放在/opt/software目录下&#xff1a; 二、解压至/usr/local目录下&#xff0c;并重新命名为mongodb [rootlocalhost software]# tar -zxvf mongodb-linux-x86_64-rhel7…

数据库设计-笔记4

1.操作词汇简介 insert&#xff1a;用于向表中插入新记录。 delete&#xff1a;用于从表中删除记录。 update&#xff1a;用于修改表中已有的记录。 select&#xff1a;用于从表中检索数据。 2.代码基础(增删改&#xff09; -- 修改表中的信息 -- 修改表名 alter table s…

基于python的图书管理系统设计与实现

摘要 21世纪的今天&#xff0c;随着计算机技术和网络技术的的不断推广发展和应用&#xff0c;图书馆管理方式也应该随之而更新&#xff0c;借由人力进行繁杂重复的图书管理工作已经不再可取&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0…

RAG专栏:向量数据库

一、数据库分类 键值数据库&#xff08;Key-Value&#xff09;&#xff1a;通常用于简单的数据存储&#xff0c;通过键来快速访问数据。文档数据库&#xff08;Document&#xff09;&#xff1a;用于存储文档结构的数据&#xff0c;如 JSON 格式。图数据库&#xff08;Graph&a…