再学FreeRTOS---(任务的挂起与恢复)

目录

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

二.任务挂起和恢复的基本操作

 1.任务挂起:

2.任务恢复:

三.任务挂起与恢复的实现步骤

任务挂起的实现

任务恢复的实现


在实时操作系统FreeRTOS中,任务的挂起与恢复是一项重要的控制功能。任务挂起相当于暂停任务的执行,直到条件满足才恢复继续运行。这种机制在任务的调度和系统资源管理上起到了关键作用。本篇文章将通过FreeRTOS提供的任务挂起和恢复API函数及相关实验来深入理解这一机制。

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

在FreeRTOS中,以下几个API函数用于实现任务的挂起和恢复:

vTaskSuspend(TaskHandle_txTaskToSuspend):挂起指定任务。
vTaskResume(TaskHandle_txTaskToResume):恢复指定任务。
xTaskResumeFromISR(TaskHandle_txTaskToResume):在中断服务例程(ISR)中恢复任务。

特别注意:如果API函数名称中包含"FromISR"后缀,它只能用于中断服务中调用。例如,xTaskResumeFromISR用于在中断中恢复被挂起的任务。挂起任务时需要将宏INCLUDE_vTaskSuspend配置为1,表示启用该功能。

二.任务挂起和恢复的基本操作

 1.任务挂起:


使用vTaskSuspend()函数来挂起任务。无论任务的优先级高低,被挂起后便停止执行,直到通过恢复函数vTaskResume()使其继续执行。
当传入的任务句柄参数为NULL时,表示挂起当前运行的任务自身。

void task3( void * pvParameters )
{uint8_t key = 0;while(1){key = key_scan(0);if(key == KEY0_PRES){printf("挂起task1\r\n");vTaskSuspend(task1_handler);}	else if(key == KEY_UP){printf("挂起task3\r\n");vTaskSuspend(task1_handler);}vTaskDelay(10);}
}

2.任务恢复:


调用vTaskResume()函数恢复被挂起的任务。值得注意的是,无论任务被vTaskSuspend()挂起多少次,vTaskResume()只需调用一次便可恢复该任务继续运行。
xTaskResumeFromISR()用于在中断服务中恢复被挂起的任务。在任务恢复时,需要检查任务的优先级以判断是否需要进行任务切换。

void task3( void * pvParameters )
{uint8_t key = 0;while(1){key = key_scan(0);if(key == KEY1_PRES){printf("在任务中恢复task1\r\n");vTaskResume(task1_handler);}vTaskDelay(10);}
}

三.任务挂起与恢复的实现步骤

任务挂起的实现

1.确保INCLUDE_vTaskSuspend宏定义为1

-功能选择性启用:如果INCLUDE_vTaskSuspend未定义或定义为0,则编译时FreeRTOS不会包含与任务挂起和恢复相关的代码逻辑。这种选择性的编译配置可以减少代码体积,节省内存资源。这对于嵌入式系统尤其重要,因为这些系统的存储和内存通常有限。

-API功能可用性:如果未定义为1,那么vTaskSuspend()和vTaskResume()函数将不会被包含,任何试图调用这些函数的代码都会在编译时报错。定义宏为1才能确保这些API函数能够被正常调用。

-系统效率优化:通过使用宏开关,FreeRTOS可以根据不同项目需求来裁剪无关的功能模块,从而优化系统运行效率。这样可以减轻调度器的负担,使任务切换和资源管理更加高效。

2.通过任务句柄获取任务控制块(TCB)

任务控制块(TCB)是FreeRTOS中存储任务状态的核心数据结构。通过任务句柄可以直接访问到任务的TCB,从而执行挂起操作。具体步骤如下:

-获取TCB:任务句柄在创建任务时生成,指向该任务的TCB结构。调用vTaskSuspend()时,如果传入的句柄为某个任务的句柄,则会对该任务执行挂起操作。

-挂起当前任务:如果传入的句柄为NULL,则表示挂起当前运行的任务。此时FreeRTOS会自动找到当前任务的TCB,并执行后续的挂起操作。

3.将待挂起的任务从状态列表和事件列表中移除,并插入挂起任务列表

挂起任务涉及将任务从调度器的管理列表中移出并转入挂起列表,以防其继续参与系统的任务调度。具体操作如下:

-移出状态列表:在FreeRTOS中,所有任务根据状态(就绪、阻塞、延时等)被组织在不同的状态列表中。当任务被挂起时,需要将它从这些状态列表中移除,以避免调度器将其视为可调度任务。

-移出事件列表:任务可能因等待事件(如信号量、消息队列等)而被阻塞。挂起操作需要将任务从任何事件等待列表中移出,以确保它不再响应这些事件。

-插入挂起列表:将任务添加到挂起列表中,以便在任务恢复时能够方便地从该列表中移回到就绪列表。

4.若挂起的是当前任务且调度器正在运行,则需要一次任务切换

挂起当前任务时,如果调度器处于运行状态,则需要立即进行任务切换,以确保系统有其他任务可以运行:

-判断调度器状态:首先,FreeRTOS会检查调度器是否正在运行。如果调度器暂停,则挂起当前任务不会触发任务切换;若调度器正在运行,则系统必须在挂起当前任务后立即切换到优先级最高的可运行任务。

-任务切换:一旦确认需要切换任务,FreeRTOS会查找下一个优先级最高的就绪任务,并将其切换到执行状态。这确保了系统不会因为挂起当前任务而停滞,保证实时性。

这一任务切换机制在FreeRTOS中称为“上下文切换”,它确保调度器始终运行优先级最高的任务。
 

任务恢复的实现

1.确保宏INCLUDE_vTaskSuspend定义为1,恢复的任务不能是当前运行任务

在执行任务恢复时,首先需要确认以下两点:

-启用挂起和恢复功能:INCLUDE_vTaskSuspend宏必须定义为1。它决定了FreeRTOS是否包含和启用任务挂起和恢复功能。如果该宏未定义,编译时将不包含与恢复功能相关的代码,导致恢复API不可用。

-不能恢复当前运行任务:如果试图恢复当前运行的任务,会导致任务行为异常,因为当前任务本身已经处于就绪状态且正在执行。恢复操作应仅作用于挂起状态的任务,因此调用恢复函数时需确保目标任务并非当前任务。

2.检查恢复的任务是否在挂起列表中,若是,则将其移除并添加到就绪列表

任务恢复时,首先需要验证该任务是否确实处于挂起状态:

-挂起列表检查:FreeRTOS将所有挂起任务保存在挂起列表中。当调用恢复函数时,系统会先查找目标任务是否在该列表中,以确保仅对实际被挂起的任务执行恢复操作。

-从挂起列表移除:如果目标任务确实在挂起列表中,则将其移出挂起列表,表示该任务将重新进入调度器的管理,能够再次参与任务调度。

-添加到就绪列表:被移出挂起列表后,目标任务会被添加到就绪列表。就绪列表中包含所有可以立即调度的任务。此时,恢复的任务可以根据其优先级重新参与任务调度。

3.比较恢复任务的优先级与当前任务的优先级,若高于当前任务则触发任务切换

任务恢复后,需要判断是否立即切换到该任务:

-优先级比较:FreeRTOS在恢复任务后会将其优先级与当前任务进行比较。如果恢复的任务优先级高于当前运行的任务,则系统会触发任务切换,以立即执行优先级更高的任务。

-任务切换:如果优先级比较结果需要切换,则系统会触发上下文切换,将CPU控制权交给恢复的高优先级任务。这种任务切换确保了系统始终执行优先级最高的任务,以满足实时性的要求。

通过这些步骤,FreeRTOS实现了对任务恢复的完整操作,确保任务能有效地从挂起状态回到正常调度,且不会影响当前任务的执行逻辑。
 

通过上述的API解析和实验步骤,相信大家对FreeRTOS任务的挂起与恢复有了更深入的理解。这些操作在嵌入式系统中灵活地管理任务的执行,为实时调度提供了强有力的支持。
 

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

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

相关文章

免费送源码:Java+Springboot+MySQL Springboot酒店客房管理系统的设计与实现 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对酒店客房管理等问题,对酒店客房…

力扣每日一题 超级饮料的最大强化能量 动态规划(dp)

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。 你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到…

Linux高阶——1027—守护进程

1、守护进程的基本流程 1、父进程创建子进程,父进程退出 守护进程是孤儿进程,但是是工程师人为创建的孤儿进程,低开销模式运行,对系统没有压力 2、子进程(守护进程)脱离控制终端,创建新会话 …

抗疫物资管理:SpringBoot技术应用案例

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…

pandas——数据结构

一、series (一)创建series import pandas as pd#1.使用列表或数组创建Series # 使用列表创建Series,索引默认从0开始 s1 pd.Series([1, 2, 3]) print(s1) # 使用列表和自定义索引创建Series s2 pd.Series([1, 2, 3], index[a, b, c]) pr…

MySQL的SQL语句之触发器的创建和应用

触发器 Trigger 一.触发器 作用:当检测到某种数据表发生数据变化时,自动执行操作,保证数据的完整性,保证数据的一致性。 1.创建一个触发器 如上图所示,查看这个create的帮助信息的时候,这个create trig…

服务器数据恢复—DELL EqualLogic PS6100系列存储简介及如何收集故障信息?

DELL EqualLogic PS6100系列存储采用虚拟ISCSI SAN阵列,支持VMware、Solaris、Linux、Mac、HP-UX、AIX操作系统,提供全套企业级数据保护和管理功能,具有可扩展性和容错功能。DELL EqualLogic PS6100系列存储介绍: 1、上层应用基础…

什么是无限钱包系统?有什么优势?

在数字货币风起云涌的今天,一个名为“无限钱包系统”的创新平台正悄然引领着行业的变革。它不仅重新定义了数字资产的管理方式,更以卓越的安全性、便捷的操作体验以及前瞻性的技术理念,成为了广大数字货币爱好者心中的理想之选。 一、数字货币…

API网关 - JWT认证 ; 原理概述与具体实践样例

API网关主要提供的能力,就是协议转换,安全,限流等能力。 本文主要是分享 如何基于API网关实现 JWT 认证 。 包含了JWT认证的流程,原理,与具体的配置样例 API网关认证的重要性 在现代Web应用和微服务架构中&#x…

前端加密解密

一、 AES 加密与解密 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。是一种对称加密算法也就是加密和解密用相同的密钥; 1.1 使用 crypto-js 实现 AES 加密 1.1.1 参数说明 data 要加密的明文key 秘钥iv …

基于知识引导提示的因果概念提取(论文复现)

基于知识引导提示的因果概念提取(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 基于知识引导提示的因果概念提取(论文复现)论文概述论文方法提示构造器获取典型概念集聚类典型概念构建训练数据训练主题分类器概念提取器输入构造指针网络置信度评分训练损失…

【element ui系列】分享几种实现el-table表格单选的方法

在实际的开发中,经常会用到从表格中选择一条记录的情况,虽然官方给出的例子,但是给人感觉看起来不明显,于是,在此基础上做了改进。接下来,介绍两种常见的实现方法: 1、采用复选框(checkbox)实现…

63 mysql 的 行锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 意向共享锁, 意向排他锁, 主要是 为了表粒度的锁获取的同步判断, 提升效率 意向共享锁, 意向排他锁 这边主要的逻辑意义是数据表中是否有任…

江协科技STM32学习- P26 UART串口外设

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

使用 ADB 在某个特定时间点点击 Android 设备上的某个按钮

前提条件 安装 ADB:确保你已经在计算机上安装了 Android SDK(或单独的 ADB)。并将其添加到系统环境变量中,以便你可以在命令行中运行 adb。 USB调试:确保 Android 设备已启用 USB 调试模式。这可以在设备的“设置” -…

mint-ui Picker 显示异常

mint-ui Picker 显示异常 现象 最近一个老项目页面显示异常&#xff0c;使用mint-ui Picker显示异常,直接显示成了 数据对象&#xff0c;而不是具体travelName 字段 组件 mint-ui Picker 使用方式(vue方式) // template <mt-picker :slots"slots" value-key…

FastAPI性能对比:同步vs异步

大家好&#xff0c;FastAPI已成为构建Python API的最流行框架之一&#xff0c;因其速度和易用性而广受欢迎。但在构建高性能应用程序时&#xff0c;使用同步&#xff08;sync&#xff09;还是异步&#xff08;async&#xff09;代码执行是很重要的问题。本文将通过现实世界的性…

wx.setNavigationBarColor动态设置导航栏颜色无效(亲测有效)

wx.setNavigationBarColor动态设置导航栏颜色无效&#xff08;亲测有效&#xff09; 问题描述问题分析问题解决注意 问题描述 wx.setNavigationBarColor({frontColor: #E6E6E6,backgroundColor: #E6E6E6 })上面的代码设置后导航栏颜色没有变化&#xff0c;查看了app.json 以及…

Blender进阶:贴图与UV

9 UV 9.1 贴图与UV UV&#xff0c;指定每个面顶点在贴图上的坐标 演示&#xff1a; 1、添加物体 2、添加贴图&#xff0c;即图片纹理节点 3、进入UV Edit工作区 4、右边&#xff0c;选择一个面 5、左边&#xff0c;选择一个面&#xff0c;移动这个面 9.2 电子表格 电子…

利用LangChain与LLM打造个性化私有文档搜索系统

我们知道LLM&#xff08;大语言模型&#xff09;的底模是基于已经过期的公开数据训练出来的&#xff0c;对于新的知识或者私有化的数据LLM一般无法作答&#xff0c;此时LLM会出现“幻觉”。针对“幻觉”问题&#xff0c;一般的解决方案是采用RAG做检索增强。 但是我们不可能把…