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.rhkb.cn/news/294056.html

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

相关文章

安装mysql8,启动mysql服务日志 libstdc++.so.6: wrong ELF class: ELFCLASS32

背景:linux centos7.9安装mysql5.7版本,服务启动成功后被告知要求安装mysql8版本,故卸载之后安装mysql8,后启动mysql服务报错提示:libstdc.so.6: wrong ELF class: ELFCLASS32 解决办法: 1、下载安装包li…

第十八章 算法

一、介绍 1.1 什么是算法 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获…

【力扣一刷】代码随想录day27(39. 组合总和、40.组合总和II、131.分割回文串)

目录 【39. 组合总和】中等题 【40.组合总和II】中等题 【131. 分割回文串】中等题 【39. 组合总和】中等题 思路: 确定终止条件:sum target时记录路径并返回。剪枝:当前节点的路径之和已经大于sum就不可能再等于sum了,结束该分支…

[中级]软考_软件设计_计算机组成与体系结构_03_CPU的组成(运算器与控制器)

CPU的组成 计算机的结构CPU的结构运算器控制器往年真题 计算机的结构 CPU的结构 运算器 算术逻辑单元(ALU):数据的算术运算和逻辑运算累计寄存器(AC):通用寄存器,为ALU提供一个工作区,用在暂存数据数据缓冲寄存器(DR)&#xff1…

期权的常见结构

期权收益图 期权的**收益(payoff)**是指期权到期日时的价值,**期权的损益(profit)**不但包含期权的收益,还包括期权交易开始时发生的期权费。 买入看涨期权 看涨期权买入方,当到期时标的资产…

Python爬虫:爬虫常用伪装手段

目录 前言 一、设置User-Agent 二、设置Referer 三、使用代理IP 四、限制请求频率 总结 前言 随着互联网的快速发展,爬虫技术在网络数据采集方面发挥着重要的作用。然而,由于爬虫的使用可能会对被爬取的网站造成一定的压力,因此&#…

[C++11]可变参数模板

导览&#xff1a; 本章将从可变参数模板的概念开始讲起&#xff0c;到其究竟是如何做到实例化的再从实例出发&#xff0c;探究该如何编写可变参数模板最后涉及可变参数模板的运用 什么是可变参数模板 让我们先见一下可变参数模板 template<typename ...Args> void te…

iOS开发进阶(十一):ViewController 控制器详解

文章目录 一、前言二、UIViewController三、UINavigationController四、UITabBarController五、UIPageViewController六、拓展阅读 一、前言 iOS 界面开发最重要的首属ViewController和View&#xff0c;ViewController是View的控制器&#xff0c;也就是一般的页面&#xff0c;…

《Invariant Feature Learning for Generalized Long-Tailed Classification》阅读笔记

论文标题 《Invariant Feature Learning for Generalized Long-Tailed Classification》 广义长尾分类的不变特征学习 作者 Kaihua Tang、Mingyuan Tao、Jiaxin Qi、Zhenguang Liu 和 Hanwang Zhang 来自南洋理工大学、阿里达摩院和浙江大学 初读 摘要 属性不平衡&#…

行车记录打不开?别慌,数据恢复有高招!

行车记录打不开&#xff0c;这恐怕是许多车主都曾经遭遇过的烦恼。在驾驶途中&#xff0c;行车记录仪本应是记录美好瞬间、保障行车安全的重要工具&#xff0c;但一旦它出现打不开的情况&#xff0c;所有的期待与信赖便瞬间化为乌有。面对这种情况&#xff0c;我们该如何应对&a…

Oracle Solaris 11.3开工失败问题处理记录

1、故障现像 起初是我这有套RAC有点问题&#xff0c;我想重启1个节点&#xff0c;结果发现重启后该节点的IP能PING通&#xff0c;但SSH连不上去&#xff0c;对应的RAC服务也没有自动启动。 操作系统是solaris 11.3。由于该IP对应的主机是LDOM&#xff0c;于是我去主域上telnet…

【linux】基础IO(一)

文件只有站在系统层面才能彻底理解 简单回顾一下文件&#xff1a; 首先我们要明确一点&#xff0c;我们说的打开文件不是写下fopen就打开文件&#xff0c;而是当我们的进程运行起来&#xff0c;进程打开的文件。 我们在C语言一般都会使用过如下的代码进行向文件中写入 但是除…

LLM应用:Prompt flow vs LangChain

背景 Prompt flow和LangChain都是LLM时代&#xff0c;为高效地构建LLM应用而生。 Prompt flow是Microsoft开源的&#xff0c;其诞生时&#xff0c;LangChain已经很有名气了。 所以作为后生的Prompt flow会为我们带来哪些新的东西呢&#xff1f; ​​​​​​​ Prompt flo…

互联网、因特网、万维网的区别

互联网 internet&#xff1a;凡是能彼此通信的设备组成的网络就叫互联网&#xff0c;即使只有两台计算机&#xff0c;无论以何种技术使其彼此通信&#xff0c;都叫互联网。所以&#xff0c;根据互联网的覆盖规模可以分为&#xff1a; 局域网&#xff08;Local Area Network&am…

如何使用potplayer在公网环境访问内网群晖NAS中储存在webdav中的影视资源

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-D7WJh3JaNVrLcj2b {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

黑马鸿蒙笔记 3

目录 11.ArkUI组件-Column和Row 12.ArkUI组件-循环控制 13.ArkUI组件-List 14.ArkUI组件-自定义组件 15.ArkUI组件-状态管理State装饰器 16.ArkUI组件-状态管理-任务统计案例 17.ArkUI组件-状态管理-PropLinkProvideConsume 11.ArkUI组件-Column和Row Colum和Row的交叉…

第三天开始写了

现在的情况 写俩个接口信息 1. 一个修改 2. 一个 删除 发现了一个问题 只有这些参数无法完成修改的 因为这些关联到一个商品表和一个用户表&#xff0c;我们应该查询他们id信息&#xff0c;修改其中的内容&#xff0c;单独根据字符串查看效果可能不好 这里我们提交应该是用…

2024年抖音小店的保证金是多少?真的可以做0元保证金的店铺吗?

大家好&#xff0c;我是电商糖果 2024年想要入驻抖音小店的商家依旧很多&#xff0c;关于小店的保证金问题也有不少人前来咨询。 大家问的最多的是可以开通0元保证金的店铺吗&#xff1f;以及2024年抖音小店保证金是多少&#xff1f; 这里糖果给大家一个个解答。 可以开通0…

基于YOLOv8的绝缘子检测系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的绝缘子小目标检测&#xff0c;阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&a…

k8s入门到实战(七)—— 回顾:使用yaml文件配置pv、pvc、configmap部署mysql服务

实战&#xff1a;部署 mysql 服务 回顾加深 pv、pvc、configmap 删除所有 deployment、pv、pvc、configmap、StorageClass创建一个 nsf 挂载目录给 mysql mkdir -p /nfs/data/mysql创建 yaml 文件mysql-server.yaml # 创建pv apiVersion: v1 kind: PersistentVolume metadat…