FreeRTOS深入教程(空闲任务和Tick中断深入分析)

文章目录

  • 前言
  • 一、空闲任务源码分析
  • 二、Tick中断深入分析
  • 总结


前言

本篇文章主要带大家深入分析空闲任务和Tick中断的作用。

一、空闲任务源码分析

在启动调度器时会创建出空闲任务:

/* 启动调度器 */
vTaskStartScheduler();

在这里插入图片描述
在空闲任务中会调用到prvCheckTasksWaitingTermination();函数。

该函数会检查正在等待终止的任务列表,这是一组任务,它们已经执行完毕,但它们的资源(如堆栈空间和其他数据结构)还没有被完全释放。这个函数负责清理这些已经终止的任务的资源,以便可以重新使用这些资源。

当配置了configUSE_PREEMPTION可抢占时和configIDLE_SHOULD_YIELD时,空闲任务会调用taskYIELD()函数主动释放CPU资源,让其他任务运行。

在这里插入图片描述
当配置了configUSE_IDLE_HOOK为1时,可以使用空闲任务的钩子函数:vApplicationIdleHook()。

在这里插入图片描述

二、Tick中断深入分析

systick中断分析:
在这里插入图片描述

xPortSysTickHandler函数是SysTick定时器中断处理程序的一部分,它主要负责处理RTOS的时基计数、任务切换请求以及中断优先级的管理,以确保系统的稳定运行和任务切换的执行。这是实现实时任务调度的关键组成部分。

xTaskIncrementTick函数分析

在这里插入图片描述
用于检查调度器是否被挂起。如果调度器没有被挂起,才执行后续的操作。

if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE )

这里增加系统的时基计数器 xTickCount,并将结果保存在 xConstTickCount 中,表示增加了一个时基节拍。

将 xConstTickCount 的值更新到系统的时基计数器 xTickCount 中。

        const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;/* Increment the RTOS tick, switching the delayed and overflowed* delayed lists if it wraps to 0. */xTickCount = xConstTickCount;

这是一个条件语句,检查是否发生了时基计数器的溢出。如果 xConstTickCount 的值变为 0,表示发生了溢出。

如果发生了溢出,调用 taskSWITCH_DELAYED_LISTS 函数,用于处理延时任务列表的切换。

        if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */{taskSWITCH_DELAYED_LISTS();}

检查一个时钟计数变量 xConstTickCount 是否大于等于 xNextTaskUnblockTime。如果条件成立,意味着现在是可以解除任务阻塞的时刻。

if( xConstTickCount >= xNextTaskUnblockTime )

判断阻塞链表是否为空,如果为空那么就没有需要解除阻塞的任务,这时会将xNextTaskUnblockTime 设置为一个无限大的值,这样的话就不需要再次进行判断是否需要接触阻塞了。

                if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ){/* The delayed list is empty.  Set xNextTaskUnblockTime* to the maximum possible value so it is extremely* unlikely that the* if( xTickCount >= xNextTaskUnblockTime ) test will pass* next time through. */xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */break;}

如果需要接触阻塞的话,需要先获取延时任务列表中头部任务的控制块指针 pxTCB。
然后获取这个任务当中的xStateListItem 链表项的值,该值表示任务应该在何时解除阻塞。

                    pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too.  Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );

如果当前值小于阻塞链表中第一个任务的值,那么更新xNextTaskUnblockTime,并且退出,此时不需要解除阻塞状态。

                    if( xConstTickCount < xItemValue ){/* It is not time to unblock this item yet, but the* item value is the time at which the task at the head* of the blocked list must be removed from the Blocked* state -  so record the item value in* xNextTaskUnblockTime. */xNextTaskUnblockTime = xItemValue;break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */}

xTaskIncrementTick 函数的主要功能是增加系统的时基计数,处理时基计数的溢出,以及检查是否有任务的阻塞时间已到期,如果有,则标记需要进行任务切换。这是实现 FreeRTOS 的任务调度和超时管理的关键部分。

总结

本篇文章主要为大家讲解了空闲任务和Tick中断深入分析,大家可以尝试自己分析一遍FreeRTOS相关的源码。

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

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

相关文章

Unity地面交互效果——2、动态法线贴图实现轨迹效果

Unity引擎动态法线贴图制作球滚动轨迹 大家好&#xff0c;我是阿赵。   之前说了一个使用局部UV采样来实现轨迹的方法。这一篇在之前的基础上&#xff0c;使用法线贴图进行凹凸轨迹的绘制。 一、实现的目标 先来回顾一下&#xff0c;上一篇最终我们已经绘制了一个轨迹的贴图…

ASCB1系列智能微型断路器在科技馆中的应用-安科瑞黄安南

【摘要】&#xff1a;安科瑞电气厂家直供黄安南1876-15//06-237&#xff0c;ASCB1系列智能微型断路器是安科瑞电气股份有限公司全新推出的智慧用电产品&#xff0c;产品由智能微型断路器与智能网关两部分组成&#xff0c;可用于对用电线路的关键电气因素&#xff0c;如电压、电…

数据交易是什么?国内的数据交易有哪些?

目录 数据交易是什么&#xff1f;国内的数据交易有哪些&#xff1f; 数据交易的概念 国内数据交易发展历程 数据交易主体 国内数据交易市场面临的问题 如何解决&#xff1a; 明确交易标准&#xff0c;推动交易市场&#xff0c;制定规则&#xff0c;完善数据监管机制&…

coturn服务器的搭建

Window下搭建coturn服务器&#xff1a; 准备材料&#xff1a; 1、安装Cygwin&#xff0c;地址&#xff1a;https://cygwin.com/install.html 由于Window无法直接部署coturn&#xff0c;因此需要下载安装Cygwin在Window上部署Linux虚拟环境。 在安装的时候需要安装几下packe…

第18期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

框架安全-CVE 漏洞复现DjangoFlaskNode.jsJQuery框架漏洞复现

目录 服务攻防-框架安全&CVE复现&Django&Flask&Node.JS&JQuery漏洞复现中间件列表介绍常见语言开发框架Python开发框架安全-Django&Flask漏洞复现Django开发框架漏洞复现CVE-2019-14234&#xff08;Django JSONField/HStoreField SQL注入漏洞&#xff…

实用篇-Linux

一、Linux介绍 linux特点 免费开源多用户多任务 Linux系统版本分为内核版和发行版 发行版是基于内核版进行扩展&#xff0c;由各个Linux厂商开发和维护&#xff0c;因为我们真正使用linux最终安装的其实是linux的发行版 下面以CentOS为例来学习Linux 二、Linux安装 安装方式…

编写Groovy Hello World 程序

使用 IntelliJ IDEA 打开 IntelliJ IDEA&#xff0c;并创建一个新的 Groovy 项目。 在项目中创建一个新的 Groovy 类文件&#xff0c;命名为 HelloWorld.groovy。 在 HelloWorld.groovy 文件中&#xff0c;编写以下代码&#xff1a; class HelloWorld {static void main(Stri…

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务&#xff0c;有很多开源的项目和工具可以借鉴&#xff0c;比如spacy的基础模…

万字解析设计模式之工厂方法模式与简单工厂模式

一、概述 1.1简介 在java中&#xff0c;万物皆对象&#xff0c;这些对象都需要创建&#xff0c;如果创建的时候直接new该对象&#xff0c;就会对该对象耦合严重&#xff0c;假如我们要更换对象&#xff0c;所有new对象的地方都需要修改一遍&#xff0c;这显然违背了软件设计的…

同步盘简介及功能解析:了解同步盘是什么及其实用性

数字化时代&#xff0c;办公中用户对于文件协同的需求越来越高。同步盘无疑是近几年最热门的文件协同工具。什么是同步盘&#xff1f;同步盘有什么用&#xff1f; 什么是同步盘&#xff1f; 同步盘是一种可以将文件存储至云端&#xff0c;然后同步至用户的各个设备的文件存储协…

MySQL创建数据库和创建数据表

二、创建数据库 1. 连接 MySQL 输入 mysql -u root -p 命令&#xff0c;回车&#xff0c;然后输入 MySQL 的密码(不要忘记了密码)&#xff0c;再回车&#xff0c;就连接上 MySQL 了。 mysql -u root -p 最初&#xff0c;都是使用 root 用户登录&#xff0c;工作中如果一直用…

【spring boot】

作用 极大地简化了spring的搭建和开发 开发方法 idea开发springboot 必须联网 结构 parent&#xff1a;装多次使用的依赖&#xff0c;还能管理版本 starter&#xff1a;SpringBoot中常见项目名称&#xff0c;定义了当前项目使用的所有依赖坐标&#xff0c;以达到减少依赖…

Azure - 机器学习:使用 Apache Spark 进行交互式数据整理

目录 本文内容先决条件使用 Apache Spark 进行交互式数据整理Azure 机器学习笔记本中的无服务器 Spark 计算从 Azure Data Lake Storage (ADLS) Gen 2 导入和整理数据从 Azure Blob 存储导入和处理数据从 Azure 机器学习数据存储导入和整理数据 关注TechLead&#xff0c;分享AI…

数据结构与算法-(7)---栈的应用拓展-前缀表达式转换+求值

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

带IV的分组加密下密文分散存储且存在混淆密文片段的多项式时间解密方案

在使用带IV的分组加密模式下&#xff0c;考虑这样一个场景&#xff1a;分组加密后&#xff0c;每组密文都被分散保存&#xff0c;且在恢复的时候&#xff0c;每组密文会和n个混淆的密文一起提供&#xff0c;此时&#xff0c;若想完整的恢复明文&#xff0c;需要一个多项式时间的…

UDP 协议

UDP协议特点&#xff1a; 无连接&#xff1a;只需要知道对方的IP和端口就可以向对方发送数据。 不可靠&#xff1a;没有确认应答机制&#xff0c;没有重传机制。 面向数据报&#xff1a;每调用一次sendto() &#xff0c;就直接将这些数据交给网络层了&#xff0c;不能控制数据读…

双十一限时优惠!沃通SSL证书、代码签名证书年度好价

2023年11月01日至11月11日&#xff0c;沃通2023“双十一限时特惠”活动&#xff0c;精选9款SSL证书、国密SSL证书、代码签名证书产品推出年度好价&#xff0c;部分SSL证书产品低至5折&#xff0c;更有EV代码签名证书爆款特惠&#xff01;多种数字证书一站式采购&#xff0c;解决…