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

news2025/7/17 16:10:59

文章目录

  • 前言
  • 一、空闲任务源码分析
  • 二、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.coloradmin.cn/o/1156359.html

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

相关文章

k8s pod获取ip地址过程

在学习 Kubernetes 网络模型的过程中&#xff0c;了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的&#xff0c;以及如何帮助每个 Pod 都能获取 IP 地址。 Kubernetes 网络模型的核心要求之一是每个 Pod 都拥有自己的 …

oracle 重启步骤及踩坑经验

oracle 重启步骤及踩坑经验 标准重启步骤 切换到oracle用户 su - oracle关闭监听 lsnrctl stop杀掉oracle有关进程 ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {print $2}|xargs kill -9#查询pid ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {p…

Linux--jdk、tomcat、环境配置,mysql安装、后端项目搭建

前言 上期我们讲到了安装linux虚拟机&#xff0c;这期我们来讲一下如何使用xshell和xftp在linux系统上搭建我们的单体项目 一、软件的传输 1.1 xftp Xftp是一款功能强大的文件传输软件&#xff0c;用于在本地主机和远程服务器之间进行快速、安全的文件传输。它是由南京帆软科…

【MongoDB】Windows 安装MongoDB 6.0

一、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 二、解压并安装 1、解压 这里我将压缩包解压到了D盘&#xff0c;并重命名成了mongodb&#xff0c;解压后的目录如下&#xff1a; 2、创建配置文件 在D:\mongodb下新建conf目录…

数据库面试题整理

目录 MySQL事务隔离级别有哪几种&#xff1f;MySQL的常用的存储引擎有哪些&#xff1f;特点是什么&#xff0c;分别适合什么场景下使用MySQL有数据缓存吗&#xff1f;原理是怎么样的&#xff1f;InnoDB的缓冲池默认是开启的吗&#xff1f;基本原理是什么&#xff1f;会有脏数据…

Flutter 01 目录结构入门

一、Flutter目录结构&#xff1a; 二、Flutter入口文件、入口方法&#xff1a; 三、Flutter Demo&#xff1a; demo1&#xff1a; import package:flutter/material.dart;//MaterialApp 和 Scaffold两个组件装饰App void main() {runApp(MaterialApp(home: Scaffold(appBar: A…

当函数参数为一级指针,二级指针

当函数参数为一级指针&#xff0c;二级指针 在讲述内容之前&#xff0c;先讲四点重要知识 1.当传入参数时&#xff0c;函数形参会立即申请形参的内存空间&#xff0c;函数执行完毕后&#xff0c;形参的内存空间立即释放掉。 1.指针是存放其他变量地址的变量。指针有自己的内…

腾讯云轻量应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像介绍

腾讯云轻量应用服务器镜像类型分为应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像&#xff0c;腾讯云百科txybk.com来详细说下不同镜像类型说明和详细介绍&#xff1a; 轻量应用服务器镜像类型说明 腾讯云轻量应用服务器 应用镜像&#xff1a;独有的应用镜像除了包…

[threejs]让导入的gltf模型显示边框

边框1效果图如下&#xff1a; 代码如下&#xff1a; const gltfLoader1 new GLTFLoader();gltfLoader1.load( "/assets/box/1/scene.gltf" ,function(gltf){let model gltf.scene;model.scale.set(3,3,3)// scene1.add(model);// renderer1.render(scene1, camera…

SaaS 出海,如何搭建国际化服务体系?(一)

防噎指南&#xff1a;这可能是你看到的干货含量最高的 SaaS 出海经验分享&#xff0c;请准备好水杯&#xff0c;放肆食用&#xff08;XD。 当越来越多中国 SaaS 企业选择开启「国际化」副本&#xff0c;出海便俨然成为国内 SaaS 的新角斗场。 LigaAI 观察到&#xff0c;出海浪…

CSS3表格和表单样式

在传统网页中&#xff0c;表格主要用于网页布局&#xff0c;因此也成为网页编辑的主要工具&#xff1b;在标准化网页设计中&#xff0c;表格的主要功能是显示数据&#xff0c;也可适当辅助结构设计。本章主要介绍如何使用CSS控制表格和表单的显示效果&#xff0c;如表格和表单的…

在ffmpeg中,如何把h264转换为rgb格式

在ffmpeg中&#xff0c;网络视频流h264为什么默认的转为YUV而不是其他格式 文章中介绍了&#xff0c;h264解码的时候是直接解码为yuv的&#xff0c;如果在使用的过程中 需要用到rgb的格式&#xff0c;我们该如何来转换这种格式呢&#xff1f; 在上面的文章中&#xff0c;我们已…

基于YOLOv8模型暗夜下人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型暗夜下人脸目标检测系统可用于日常生活中检测与定位黑夜下人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法…

塞尔帕替尼的靶点以及疗效【医游记】

&#xff08;图片来源于网络&#xff09; 塞尔帕替尼&#xff08;Selpercatinib&#xff09;是一种高选择性和抑制活性的小分子RET&#xff08;受体酪氨酸激酶&#xff09;抑制剂。它是全球首个获批的高选择性RET抑制剂&#xff0c;用于治疗RET融合阳性的转移性非小细胞肺癌的…

GNSS卫星姿态解算

GNSS卫星姿态影响太阳光压辐射力的建模与卫星天线改正&#xff0c;正确解算卫星姿态是GNSS数据解算中的关键步骤。 卫星的姿态指卫星的星体坐标轴XYZ在惯性系下的指向&#xff0c;其中Z轴始终指向地球地心&#xff0c;Y轴为卫星太阳能帆板的旋转轴&#xff0c;它始终与太阳-卫星…

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网&#xff1a; CVPR2024投稿链接&#xff1a; CVPR2024 重要时间节点&#xff1a; CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics&#xff1a; CVPR2024官网&#xff1a; https://cvpr.thecvf.com/Conferences/2024CV…

YouTrack 在创建问题的时候如何切换项目

最近在准备从 JIRA 中转换到 YouTrack 上。 在创建问题的时候&#xff0c;JIRA 是通过选择项目&#xff0c;然后单击创建&#xff0c;这个创建就会直接在项目中进行创建了。 但是 YouTrack 不是这样的&#xff0c;感觉就是 YouTrack 的创建问题就是一个入口。 其实我并不知道…

C/C++药房管理 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C药房管理 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C药房管理 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 随着信息技术的蓬勃发展&#xff0c;医疗信息化已经成为…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.11 小案例-无边框窗口

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.11 小案例-无边框窗口 本章要实现的整体效果如下&#xff1a; 本节课&#xff0c;来实现一个非常精简的无边框窗口&#xff0c;支持拖动4个边和4个角来缩放窗口 整体效果如下&#xff1a; 整体效…

电脑实用增效工具

1、腾讯电脑管家 强力卸载特别有用。本来挺排斥这类软件&#xff0c;但真正用一段时间后发现&#xff0c;已经能做到无骚扰&#xff0c;只需在关键时刻排上用场 2、Snipaste 桌面贴图软件&#xff0c;高效好用 3、DeskPins 置顶工具&#xff0c;可自定义快捷键 4、向日葵远程…