【FreeRTOS】空闲任务

目录

  • 空闲任务及其钩子函数
    • 介绍
    • 使用钩子函数的前提
  • 实际操作
    • 任务如何退出?
    • IDLE函数

空闲任务及其钩子函数

介绍

空闲任务(Idle任务)的作用之一:释放被删除的任务的内存

除了上述目的之外,为什么必须要有空闲任务? 这是一个良好的程序,它的任务都是事件驱动的:平时大部分时间处于阻塞状态。有可能我们自己创建的所有任务都无法执行,但是调度器必须能找到一个可以运行的任务:所以,我们要提供空闲任务。在使用vTaskStartScheduler()函数来创建、启动调度器时,这个函数内部会创建空闲任务

  • 空闲任务优先级为0:它不能阻碍用户任务运行
  • 空闲任务要么处于就绪态,要么处于运行态,永远不会阻塞

空闲任务的优先级为0,这意味着一旦某个用户的任务变为就绪态,那么空闲任务马上被切换出去,让这个用户任务运行。在这种情况下,我们说用户任务"抢占"(pre-empt)了空闲任务,这是由调度器实现的。

要注意的是:如果使用vTaskDelete()来删除任务,那么你就要确保空闲任务有机会执行,否则就无法释放被删除任务的内存。

我们可以添加一个空闲任务的钩子函数(Idle Task Hook Functions),空闲任务的循环每执行一次,就会调用一次钩子函数。钩子函数的作用有这些:

  • 执行一些低优先级的、后台的、需要连续执行的函数
  • 测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。
  • 让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式了。
  • 空闲任务的钩子函数的限制:
  • 不能导致空闲任务进入阻塞状态、暂停状态
  • 如果你会使用vTaskDelete()来删除任务,那么钩子函数要非常高效地执行。如果空闲任务移植卡在钩子函数里的话,它就无法释放内存。

使用钩子函数的前提

在FreeRTOS\Source\tasks.c中,可以看到如下代码,所以前提就是:

  • 把这个宏定义为1:configUSE_IDLE_HOOK
  • 实现vApplicationIdleHook函数

实际操作

创建一个任务的时候,传递了一个函数,假设这个函数只执行10次,不是死循环
在这里插入图片描述

如果这里不是死循环,执行完成之后,直接返回,就进入了错误处理的函数

关闭所有中断,进入死循环, 其他所有的任务也不能再次执行

在这里插入图片描述

任务能够调度,都是依赖Tick中断,现在中断都关闭了,那么所有的任务都没有办法再次切换了

如果想退出这个任务,必须自杀

任务如何退出?

任务如何退出?

  1. 自杀 vTaskDelete(NULL)
  2. 他杀 vTaskDelete(handle) //传入任务的句柄

这里复制第九个程序,改成十个程序

修改这一段代码,先注释vTaskDelete(NULL);,然后再取消注释,对比前后的效果

/*********************************************************************** 函数名称: Led_Test* 功能描述: Led测试程序* 输入参数: 无* 输出参数: 无*            无* 返 回 值: 0 - 成功, 其他值 - 失败* 修改日期        版本号     修改人        修改内容* -----------------------------------------------* 2023/08/03        V1.0     韦东山       创建***********************************************************************/
void Led_Test(void)
{Led_Init();//while (1)for (unsigned char i = 0; i < 3; i++){Led_Control(LED_GREEN, 1);mdelay(500);Led_Control(LED_GREEN, 0);mdelay(500);}vTaskDelete(NULL);
}
  • 任务自杀之后,LED就不再闪烁了,全彩LED正常运行

如果是任务A杀死任务B,需要任务A给任务B收尸,如果B自杀,则由空闲任务收尸
收尸就是做一些清除工作,需要释放TCB结构体、释放栈~

如果有很多任务自杀的话,空闲任务根本没有机会执行,没有办法执行,没有办法做清除工作,可能会导致内存不够用

为了让空闲任务有机会运行,我们需要养成良好的编程习惯

  • a 事件驱动
  • b 调用延时函数delay的时候,要主动休眠,不要使用死循环

这样我们可以再次修改代码,使用vTaskDelay,优化代码

void Led_Test(void)
{Led_Init();//while (1)for (unsigned char i = 0; i < 3; i++){Led_Control(LED_GREEN, 1);// mdelay(500);vTaskDelay(500);Led_Control(LED_GREEN, 0);// mdelay(500);vTaskDelay(500);}vTaskDelete(NULL);
}

我们调用vTaskDelete,会把自己从ReadyList切换到DelayTaskList中,也就是从就绪态切换为阻塞态,不会再参与调度
使用vTaskDelete,进入了阻塞状态,让出了CPU资源,这样空闲任务才有机会运行,帮助自杀的任务回收资源

IDLE函数

看看空闲任务的函数,从main.c里找,启动调度器

osKernelStart();

进入函数,找到

vTaskStartScheduler();

创建了空闲任务,记录人空闲任务 prvIdleTask

xIdleTaskHandle = xTaskCreateStatic(	prvIdleTask,configIDLE_TASK_NAME,ulIdleTaskStackSize,( void * ) NULL, /*lint !e961.  The cast is not redundant for all compilers. */( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),pxIdleTaskStackBuffer,pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */

检查自杀的任务,做一些清理工作

prvCheckTasksWaitingTermination();

还会调用HOOK函数,钩子函数,每次都可以执行这个函数,我们可以从中添加一些打印信息,统计程序运行的状态。

vApplicationIdleHook();

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

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

相关文章

fastapi登录功能

fastapi登录功能 1、登录参数必须是OAuth2PasswordRequestForm类型 因为在swagger UI中的登录使用的表单传账号和密码这个类依赖python-multipart&#xff0c;使用前需安装 pip install python-multipart2、示例代码 login_router.post("", summary"登录&qu…

Linux基础 - DHCP 动态管理主机地址

目录 零. 简介 一. 部署 dhcpd 二. 提高安全性 零. 简介 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一种网络协议&#xff0c;用于动态地为主机分配 IP 地址、子网掩码、默认网关、DNS 服务器等网络配置信息。 其主要…

鸿蒙 HarmonyOs 动画效果 快速入门

一、理论 1.1 animation属性 名称参数类型必填描述durationnumber否设置动画时长&#xff0c;默认值&#xff1a;1000&#xff0c;单位&#xff1a;毫秒temponumber否动画播放速度。数值越大&#xff0c;速度越快&#xff0c;默认为1curvestring | Curve否 设置动画曲线。 默…

ubuntu 23 连接正点imx6ull的uboot

由于使用ubuntu23&#xff0c;无法连接正点的imx6ull的uboot&#xff0c;因为这个uboot里面的nfs是v2&#xff0c;ubuntu23内核是6.5不支持uboot v2。配置/etc/default/nfs-kernel-server sudo vim /etc/default/nfs-kernel-server 更改以下参数&#xff1a; RPCNFSDCOUNT"…

C语言--vs使用调试技巧

1.什么是bug? 1.产品说明书中规定要做的事情&#xff0c;而软件没有实现。 2.产品说明书中规定不要做的事情&#xff0c;而软件确实现了。 3.产品说明书中没有提到过的事情&#xff0c;而软件确实现了。 4.产品说明书中没有提到但是必须要做的事情&#xff0c;软件确没有实…

vue3中使用弹幕组件vue-danmaku

1、最开始使用的是vue3-marquee&#xff0c;后面发现一直有一个bug无法解决&#xff0c;就是鼠标hover到第一个弹幕上字体就会变粗&#xff0c;已经提了issue给作者&#xff0c;但是目前还未答复&#xff0c;所以就换了方案。 地址如下&#xff1a; https://github.com/megasa…

stable-diffusion-webui-colab搭建SadTalker由图生成视频人

在这里选择一个stable-diffusion-webui-colab ​​​​​​​​​GitHub - camenduru/stable-diffusion-webui-colab: stable diffusion webui colab 这里我选择是&#xff1a; https://colab.research.google.com/github/camenduru/stable-diffusion-webui-colab/blob/main…

【Python时序预测系列】基于LSTM实现多输入多输出单步预测(案例+源码)

这是我的第312篇原创文章。 一、引言 单站点多变量输入多变量输出单步预测问题----基于LSTM实现。 多输入就是输入多个特征变量 多输出就是同时预测出多个标签的结果 单步就是利用过去N天预测未来1天的结果 二、实现过程 2.1 读取数据集 dfpd.read_csv("data.csv&qu…

CSS-实例-div 水平居中 垂直靠上

1 需求 2 语法 3 示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格水平居中、垂直靠上示例…

AI 上车的一些随想

​最近一直在做AI大模型上车的战略企划工作&#xff0c;听了好多供应商的宣讲&#xff0c;自己也查阅了大量书籍、资料。信息输入呈现爆炸性增长&#xff0c;受限于专业知识水平&#xff0c;仅能在应用层面上有所思考。纯个人观点&#xff0c;仅供参考。 车自古以来都是移动工…

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

前端面试题(基础篇十四)

一、DOMContentLoaded 事件和 Load 事件的区别&#xff1f; 当初始的 HTML 文档被完全加载和解析完成之后&#xff0c;DOMContentLoaded 事件被触发&#xff0c;而无需等待样式表、图像和子框架的加载完成。 Load 事件是当所有资源加载完成后触发的。 二、简述一下你对 HTML 语…

机器学习 中数据是如何处理的?

数据处理是将数据从给定形式转换为更可用和更理想的形式的任务&#xff0c;即使其更有意义、信息更丰富。使用机器学习算法、数学建模和统计知识&#xff0c;整个过程可以自动化。这个完整过程的输出可以是任何所需的形式&#xff0c;如图形、视频、图表、表格、图像等等&#…

HarmonyOS开发实战:JSON组件使用方式-API

JSON类组件 模块介绍JSONValue提供eftool中的JSON相关对象的类型定义JSONObject提供类Java的JSON对象的系列方法以及相互转换JSONArray提供类Java的JSON数组的系列方法以及相互转换JSONArrayList提供类Java的JSON数组的系列方法以及相互转换JSONUtil提供JSON转换一系列判断方法…

理想汽车提出3DRealCar:首个大规模3D真实汽车数据集

理想提出3DRealCar&#xff0c;这是第一个大规模 3D 实车数据集&#xff0c;包含 2500 辆在真实场景中拍摄的汽车。我们希望 3DRealCar 可以成为促进汽车相关任务的宝贵资源。 理想汽车提出3DRealCar&#xff1a;首个大规模3D真实汽车数据集! 我们精心策划的高质量3DRealCar数…

全球点赞第一起名大师颜廷利:是金子总会“花光”的

在物质世界的繁华背后&#xff0c;隐藏着一个深刻的真理&#xff1a;有形之物的分享会逐渐减少&#xff0c;而无形之物的传递却能不断增值。金钱、货币、银两这些商业领域的实体&#xff0c;往往激发出人类对更多财富的渴望和对资源枯竭的恐惧。这种恐惧源于资源的有限性&#…

【数据结构】(C语言):二叉搜索树

二叉搜索树&#xff1a; 树不是线性的&#xff0c;是层级结构。基本单位是节点&#xff0c;每个节点最多2个子节点。有序。每个节点&#xff0c;其左子节点都比它小&#xff0c;其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。…

VRRP和IPVS

1.VRRP VRRP(Virtual Router Redundancy Protocol,简称VRRP,虚拟路由冗余协议)是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的VRRP路由器中的一台。控制虚拟路由器IP地址的VRRP路由器称为主路由器,它负责转发数据包到这些虚拟IP地址。 VRRP一旦主路由…

PointNet++论文导读

PointNet论文导读 主要改进网络结构&#xff1a;非均匀采样下的特征学习的鲁棒性利用点特征传播处理数据集分割 论文链接:https://arxiv.org/abs/1612.00593 主要改进 PointNet的基本思想是学习每个点的空间编码&#xff0c;然后将所有单个点的特征聚合成一个全局点云标签&am…