FreeRTOS 任务挂起和恢复API函数

FreeRTOS 任务挂起和恢复API函数使用

挂起的作用就是当我们需要暂停某任务时候,等过一段时间在运行,这个时候要是使用删除和重建的方法就会当时任务进行时候的变量保存的值。当需要将这个任务停止运行一段时间的将这个任务挂起,当重新进行运行这个任务就恢复运行。

vTaskSuspend()//挂起一个任务
vTaskResume()//恢复一个任务的运行
xTaskResumeFromISR()//中断服务函数中恢复一个任务的进行

一旦将某个任务设置为挂起态,进入挂起态的任务永远都不会进入运行态。除非对当前这个任务进行解挂,
1

void vTaskSuspend( TaskHandle_t xTaskToSuspend)

xTaskToSuspend: 要挂起的任务的任务句柄,创建任务的时候会为每个任务分配一个任务句柄。如果使用函数 xTaskCreate()创建任务的话那么函数的参数,pxCreatedTask 就是此任务的任务句柄,如果使用函数xTaskCreateStatic()创建任务的话那么函数的返回值就是此任务的任务句柄。也可以通过函数 xTaskGetHandle()来根据任务名字来获取某个任务的任务句柄。注意!如果参数为NULL 的话表示挂起任务自己。
2

vTaskResume()//恢复一个任务的运行,xTaskToResume: 要恢复的任务的任务句柄。

3

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume)

xTaskToResume: 要恢复的任务的任务句柄。返回值:pdTRUE:恢复运行的任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数以后必须进行一次上下文切换。pdFALSE:恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。
换句话就是当中断恢复挂起的优先级等于高于的时候,就会切换另一个任务,否则不会切换这个任务。想象一下,你在做一件非常重要的事情(比如做饭),这时候有人敲门(这就像是一个中断)。根据敲门的人是谁(中断的优先级),你会决定是否暂停做饭去开门(中断服务),还是让他们等一会儿。

pdTRUE 的情况:

如果敲门的人是你的好朋友,而且你已经约好了(这意味着“中断”很重要,优先级高或等同于你正在做的事情),你会选择停下手中的事情(做饭),去开门(处理中断)。在开完门后,你可能会决定先陪陪朋友,不立即回去做饭(这就是所谓的“上下文切换”,从一个任务切换到另一个)。

pdFALSE 的情况:

相反,如果敲门的是一个推销员(这意味着“中断”不太重要,优先级较低),你可能会决定让他等一下,继续做饭(即使你知道门外有人)。这个时候,你没有放下手中的事情去开门,也就没有发生“上下文切换”。

在实时操作系统(RTOS)中,任务(比如做饭)有不同的优先级,中断也是如此。系统需要决定在中断发生时是否暂停当前任务去处理中断,以及处理完中断后是否回到原来的任务或者转去做另一个更重要的任务。这个决定基于任务和中断的优先级:

  • 如果中断很重要(优先级高或相等),系统会处理中断,并可能转去做另一个任务(pdTRUE)。
  • 如果中断不那么重要(优先级低),系统会忽略它,继续当前的任务(pdFALSE)。
    接下来我们编写程序来使用挂起以及恢复函数:
    我们将创建三个任务:
void LED0_task(void *pvParameters)
{u16 task1num = 0;while(1){printf("task1num=%d\r\n",++task1num);LED0 = ~LED0;vTaskDelay(500);}
}
void LED1_task(void *pvParameters)
{u16 task2num = 0;while(1){printf("task2num=%d\r\n",++task2num);LED1 = ~LED1;vTaskDelay(500);}
}
void KEY_task(void *pvParameters)
{u8 key = 0;while(1){key = KEY_Scan(0);if(key == KEY0_PRES){printf("在任务中挂起任务1\r\n");vTaskSuspend(LED0Task_Handler);}if(key == KEY1_PRES){printf("在任务中恢复任务1\r\n");vTaskResume(LED0Task_Handler);}vTaskDelay(10);}

具体来说就是这三个,同时我们在按键任务设置了按键0按下在任务中挂起任务1也就是LED0任务,接下来我们使用中断恢复任务1,具体代码如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{BaseType_t xYieldRequired;  delay_ms(100);      //消抖switch(GPIO_Pin){case GPIO_PIN_0:if(WK_UP==1) {xYieldRequired = xTaskResumeFromISR(LED0Task_Handler);printf("在中断中恢复任务1\r\n");}if(xYieldRequired == pdTRUE){portYIELD_FROM_ISR(xYieldRequired);}break;}
}

portYIELD_FROM_ISR(xYieldRequired) 是在许多实时操作系统(RTOS)中用于从中断服务例程(ISR)触发任务上下文切换的函数。
在这里插入图片描述
但是我们在串口中会发现出现了错误,在port.c769行中,我们进入到这个函数,可以定位这个代码:
在这里插入图片描述
该报错意思是当前中断的优先级大于系统能够管理的优先级。打开FreeRTOSConfig.h,可以找到下面管理的优先级的最大值和最小值。

在这里插入图片描述
在FreeRTOS内有一个configMAX_SYSCALL_INTERRUPT_PRIORITY的宏,它是配置FreeRTOS能够管理中断的最大优先级,FreeRTOS内中断优先级分组只能全部配置成抢占优先级,没有子优先级,FreeRTOS也没有处理子优先级的代码。在FreeRTOS内只有大于configMAX_SYSCALL_INTERRUPT_PRIORITY才能调用FreeRTOS API(中断优先级很低),小于configMAX_SYSCALL_INTERRUPT_PRIORITY不能调用FreeRTOS的API(中断优先级很高),如果调用了就会出现上述问题。
在这里插入图片描述

在这里插入图片描述
所以这里设置分组四,也就是4位全部用抢占优先级,0位响应优先级。
在这里插入图片描述
并且这里也要更改。然后编译下载烧录进去。发现这个时候就能够正常运行。串口接受的信息没有报错。
在这里插入图片描述

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

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

相关文章

华为云亮相KubeCon EU 2024,以持续开源创新开启智能时代

3月21日,在巴黎举办的云原生顶级峰会KubeCon EU 2024上 ,华为云首席架构师顾炯炯在“Cloud Native x AI:以持续开源创新开启智能时代”的主题演讲中指出,云原生和AI技术的融合,是推动产业深刻变革的关键所在。华为云将…

进度管理与成本管理

1.裁剪考虑因素 2. 定义计划是把WBS分解的活动在分解成更小的活动。 3. 4.资源平衡会改变关键路径 5.资源平滑只能在自由和浮动时间延迟 6. 7. 8.成本管理,论文要写不足与解决过程 9.成本的类型 10. 11.规划XX管理的时候,输入一般有章程和项目…

C语言动态内存讲解+通讯录2.0

文章目录 前文malloc和freecallocrealloc枚举常量的简单说明及使用 通讯录2.0动态开辟通讯录,满了就扩容保存数据和载入数据 通讯录2.0演示推荐好用的软件 前文 本文主要介绍动态开辟的几个函数,以及改进之前的通讯录。 我们局部变量等是在栈区上开辟空间的,而我们动态开辟的空…

新model开发记录

模型使用 -- 用blender导出为 fbx ,修改渲染方式(点击模型->Materials->Extract Materials(将材质从fbx中 单独提取出来了)->Materials 选择 Shader -> SimpleURPToonLitExample 点开脸的材质,勾选第一条) 解决角色…

力扣-python-故障键盘

题解: from collections import dequeclass Solution:def finalString(self, s: str) -> str:# 创建一个双端队列用于存储字符q deque()# 定义一个标志位,用于标记当前字符应该添加到队列的哪一端head False# 遍历输入的字符串s的每一个字符for ch…

C++刷题篇——05静态扫描

一、题目 二、解题思路 注意:注意理解题目,缓存的前提是先扫描一次 1、使用两个map,两个map的key相同,map1:key为文件标识,value为文件出现的次数;map2:key为文件标识,va…

CTF wed安全(攻防世界)练习题

一、Training-WWW-Robots 进入网站如图: 翻译:在这个小小的挑战训练中,你将学习Robots exclusion standard。网络爬虫使用robots.txt文件来检查它们是否被允许抓取和索引您的网站或只是其中的一部分。 有时这些文件会暴露目录结构&#xff0c…

【数据结构】优先级队列——堆

🧧🧧🧧🧧🧧个人主页🎈🎈🎈🎈🎈 🧧🧧🧧🧧🧧数据结构专栏🎈🎈🎈&…

C++11:右值引用

C11:右值引用 右值与左值右值引用语法右值引用底层移动语义引用折叠完美转发 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对…

VR全景赋能智慧农业,打造沉浸式种植体验平台

随着人口的增长,传统农业也正在面临着不一样的挑战,加上很多人对农业的固有印象,很少有年轻人愿意下到农田里,那么该如何提高产量、降低成本以及引导年轻人深刻感受现代农业成为了急需解决的问题。 随着城市化脚步的推进&#xff…

数码管时钟--LABVIEW编程

一、程序的前面板 1.获取系统时钟,年月日,时分秒,用14个数码管显示。 2.闹钟设定小时和分钟。 二、程序的后面板 三、程序运行图 四、程序源码 源程序可以在百度网盘自行下载,地址链接见下方。 链接:https://pan.b…

LeetCode-54. 螺旋矩阵【数组 矩阵 模拟】

LeetCode-54. 螺旋矩阵【数组 矩阵 模拟】 题目描述:解题思路一:定义上下左右四个边界,进行模拟。解题思路二:5行 Python zip函数图一乐解题思路三:0 题目描述: 给你一个 m 行 n 列的矩阵 matrix &#xf…

SketchUp Pro中文---3D建模与设计领域的专业选手

SketchUp Pro是一款功能强大的3D建模软件,广泛应用于建筑、城市规划、室内设计等领域。它拥有用户友好的界面和丰富的建模工具,支持实时查看、高 级扩展以及智能提示等功能,使得建模过程更加直观、灵活和高效。SketchUp Pro还支持自定义插件&…

1033 To Fill or Not to Fill

是否有能到达的站点 无,输出当前距离(最后一个到达站点距离满油箱状态下行走距离)有 有价格更低的站点 如果油量不足以到达新站点,加刚好到达该站点的油量(只加可到达范围内最便宜的油)有价格更高的站点 在…

论文速览 | IEEE TCI, 2022 | 单光子级非视距成像:估计强度与优化重建

注1:本文系"计算成像最新论文速览"系列之一,致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‑Science & Applications, Optica 等)。 本次介绍的论文是:<2…

Dimitra:基于区块链、AI 等前沿技术重塑传统农业

根据 2023 年联合国粮食及农业组织&#xff08;FAO&#xff09;、国际农业发展基金&#xff08;IFAD&#xff09;等组织联合发布的《世界粮食安全和营养状况》报告显示&#xff0c;目前全球约有 7.35 亿饥饿人口&#xff0c;远高于 2019 年的 6.13 亿&#xff0c;这意味着农业仍…

为什么跟着高手还是亏损?fpmarkets10秒解答

各位投资者&#xff0c;不知道你们有没有遇见这样的情况&#xff1f;不管是别人能够持续盈利的技术指标&#xff0c;还是业内知名的行业专家&#xff0c;只要是我们这些普通的投资者一旦使用持续盈利的技术指标&#xff0c;或者跟随专家顾问的信号同时在同一个方向建仓&#xf…

python怎么处理txt

导入文件处理模块 import os 检测路径是否存在&#xff0c;存在则返回True&#xff0c;不存在则返回False os.path.exists("demo.txt") 如果你要创建一个文件并要写入内容 #如果demo.txt文件存在则会覆盖&#xff0c;并且demo.txt文件里面的内容被清空&#xff0c;如…

Machine Learning机器学习之文本分析的词法分析、句法分析、语义分析(详细讲解)

目录 前言 词法分析&#xff1a; 词义消歧&#xff1a; 句法分析&#xff1a; 语义分析&#xff1a; 文本分析应用 1、文本分类&#xff1a; 设计过程&#xff1a; 代码实现&#xff1a; 完整代码&#xff1a; 2、情感分析&#xff1a; 总结 博主介绍&#xff1a;✌专注于前后…

【Go】四、包名、访问范围控制、标识符、运算符

文章目录 1、_2、包名3、命名大小影响可访问范围4、运算符5、获取终端输入 1、_ 下划线"_"本身在Go中是一个特殊的标识符&#xff0c;称为空标识符用于忽略某个值 1&#xff09;忽略导入的没使用的包 2&#xff09;忽略某个返回值 2、包名 main包是程序的入口包&a…