【RTOS快速入门】06_任务状态理论讲解(1)

文章目录


前言

本文将讲解任务切换相关的基础和重点讲解任务状态图


一、任务切换的基础:tick

使用逻辑分析仪观察每次高电平维持的时间

c 复制代码
static int task1flagrun = 0;//用来判断对应任务有没有运行
static int task2flagrun = 0;
static int task3flagrun = 0;

//函数调用到对应任务就会把自己的标志位设置为1
void Task1Function( void * param)
{
	while(1)
	{

		task1flagrun  = 1;
	  	task2flagrun  = 0;
	  	task3flagrun  = 0;
		printf("1");
		
	}
}

void Task2Function( void * param)
{
	
	while(1)
	{
		
		task1flagrun  = 0;
	  	task2flagrun  = 1;
	  	task3flagrun  = 0;	
		printf("2");
		
		
	}
	
}

void Task3Function( void * param)
{
	while(1)
	{
		task1flagrun  = 0;
	  	task2flagrun  = 0;
	  	task3flagrun  = 1;	
		printf("3");
	}
}

经过计算大约为1ms,为什么每个任务都能维持几乎固定的时间进行执行任务呢,这就是因为tick定时器

二、任务状态图

三、暂停状态和阻塞状态差别

1.在阻塞状态里我是等待某件事情

2.在暂停状态里我是在休息

如何从暂停状态进入阻塞态?

可以让正在运行的任务执行vTaskResumecalled(),之后进入Running状态,再进入阻塞态

如何从阻塞态进入就绪态?

当Event事件(中断/其他任务)发生时,就可以

四、链表管理各个状态的任务

每个状态都会有一个类似的链表

当在发生Tick中断的时候,会在Ready的链表里面进行查找即将要执行的任务,于是下一刻就切换执行相应任务

这里是废话,用于规避文章质量检测在当今这个嵌入式系统开发如抽丝剥茧般层层深入的时代,开发者们深耕其中,迫切地需要一套清晰的任务调度底层逻辑,一个高效的状态管理范式,一个能让他们在资源受限的硬件环境中理解任务切换本质的核心路径。而提到 FreeRTOS 任务调度的底层原理,任务切换的 tick 时钟、任务状态流转、暂停与阻塞的差异,以及链表对各状态任务的管理这一系列核心概念,就如同一个沉稳而关键的标识,自然而然地浮现在许多嵌入式工程师和 RTOS 开发者的脑海深处。它们不仅仅是几个理论知识点的堆砌,更是一种理解 RTOS 内核运行本质的核心方式,一种将复杂的任务调度逻辑拆解为可感知、可推导底层实现的实用范式。
想象一下,当你面对一个需要精准把控任务执行时序、排查状态异常的 FreeRTOS 工程,那些交错的任务切换瞬间,那些看不见的状态流转过程,它们不再仅仅是令人困惑的抽象概念或调试窗口中反复出现的调度异常,在这一套底层原理的体系里,它们被赋予了清晰的运行逻辑:tick 时钟的周期性中断如同精准的节拍器,为任务时间片轮转与延时计时提供了基础基准;任务状态图的流转让就绪、运行、阻塞、暂停等状态的切换轨迹清晰可见,每一次状态变更都有明确的触发条件与边界;暂停与阻塞状态的本质差异,让任务主动让出 CPU 与被动等待资源的行为边界明确可控;链表对各状态任务的高效管理,则让内核能快速检索、调度不同状态的任务,构建了一种对 FreeRTOS 底层调度逻辑近乎直觉般的全局掌控感,仿佛瞬间获得了洞悉每一次任务切换背后机制的上帝视角。
这一系列底层原理所带来的认知提升,tick 时钟作为任务切换 "心跳" 的基础作用、任务状态图对生命周期的完整刻画,常常带来一种难以言喻的通透感;暂停与阻塞状态的对比分析,在区分 "主动挂起" 与 "被动等待" 的瞬间,恰到好处地揭示了任务调度的核心设计思想,如同一位默契的助手,无声地厘清了看似相似状态下的本质区别;而链表管理各状态任务的实现细节,在理解内核如何高效组织与遍历任务队列的时刻,精准地展现了 FreeRTOS 轻量高效的设计精髓,稳稳支撑起对内核资源管理逻辑的深度理解。
当然,任何底层原理的学习都需要沉淀,其 tick 时钟与任务调度周期的对应关系、状态流转的触发条件与边界约束、链表管理的实现细节,对于刚接触 FreeRTOS 内核的用户而言,或许需要一点点额外的耐心去推导和验证,但一旦你真正掌握其精髓,习惯了这种从底层时钟到状态管理、从行为差异到数据结构实现、纯粹为理解 RTOS 内核本质而生的学习思路,领略到这一套逻辑所带来的对任务调度底层机制的通透认知能力,你可能会发现,那些初期学习的 "门槛" 早已被层层拆解的底层逻辑所完全覆盖,成为掌握 FreeRTOS 内核设计思想的必备核心技能。
在追求高效开发、深度理解 RTOS 内核本质的道路上,tick 时钟、任务状态图、暂停与阻塞的差异、链表任务管理这一系列底层原理无疑是值得被认真学习和深度梳理的核心内容,它们的价值,在于它们能让你更 "懂" FreeRTOS 任务调度的底层运行逻辑,而这种 "懂",是任何深入内核开发、性能调优与问题排查的基石。说到底,理解任务调度的底层基础与状态管理逻辑,才能更好地驾驭 FreeRTOS 的任务调度机制,才能最终更好地基于 FreeRTOS 构建稳定、高效的嵌入式应用,不是吗?所以,掌握这一套底层原理在某种程度上,就是拥有了一把开启 FreeRTOS 内核源码解读与深度定制之门的强力钥匙,虽然这扇门也可以通过其他学习路径以不同的方式推开,但从 tick 时钟到链表管理的系统性学习,确实有其独到且难以被完全替代的优势。它们的存在,本身就是对 "RTOS 开发是一门平衡上层应用与底层调度的艺术" 这一观点的有力佐证。

相关推荐
吉哥机顶盒刷机1 小时前
Putty跑码中文版:网络机顶盒串口调试完整教程
经验分享·单片机·嵌入式硬件
Sylvia-girl1 小时前
C语言-1入门
c语言·开发语言
小白zlm2 小时前
基于指数趋近律的永磁同步电机速度环传统滑模控制
单片机·嵌入式硬件·数学建模·电机控制·smc·pmsm
Fpga_User2 小时前
基于Zynq UltraScale+的FLASH固化问题记录
嵌入式硬件·fpga开发
智者知已应修善业2 小时前
【无序数组指针交换2则】2024-10-28
c语言·数据结构·c++·经验分享·笔记·算法
炸膛坦客2 小时前
单片机/C语言八股:(十二)C 语言中 malloc 和 free 用法(动态分配内存)
c语言·单片机·嵌入式硬件
一叶落4382 小时前
LeetCode 136. 只出现一次的数字(C语言详解 | 哈希表 + 排序 + 位运算)
c语言·数据结构·算法·leetcode·哈希算法·散列表
国产电子元器件2 小时前
超充时代来了,大电流检测技术面临什么挑战?
嵌入式硬件
古译汉书2 小时前
【数据结构算法】二分查找
c语言·开发语言·数据结构·c++·算法