FreeRTOS内核:详解Task各状态(GPT4帮写)
- 1. 背景
- 2. Task顶层状态区分
- 3. 运行状态(Running)
- 4. 非运行状态
- 4.1 阻塞态(Blocked):
- 4.2 挂起态(Suspended)
- 4.3 就绪态(Ready)
- 总结:
- 博主热门文章推荐:
- 附:GPT4 output:
(注:本文部分文案由ChatGPT辅助生成,但内容均经过Howie审核和优化,放心使用。)
1. 背景
在嵌入式系统中,任务(Task)是指系统中的最小执行单元,它可以是一个简单的函数或者是一个包含多个子任务的复杂任务。
而FreeRTOS是一个基于优先级调度的实时操作系统,因此任务状态的变化对系统的稳定性和性能有着至关重要的影响。
因此,了解FreeRTOS各个任务状态的含义和变化规律对于开发人员来说是非常重要的。
2. Task顶层状态区分
从顶层状态区分,FreeRTOS只分为运行和非运行状态,并且会在这两种状态不断切换,以实现操作系统功能:
3. 运行状态(Running)
- Running:表示任务正在执行。
当FreeRTOS某个任务处于运行态时,处理器就正在执行它的代码。
4. 非运行状态
当一个任务处于非运行态时,它的所有状态Context都被保存,以便在下一次调度器决定让它进入运行态时可以恢复执行。
非运行态又细分为Ready、Blocked、Suspended、Deleted和Invalid几种状态,
下图为整体关系图:
task各状态间切换实现如下:
- 任务从Running状态转换为Blocked状态,是由任务自己主动调用FreeRTOS提供的阻塞函数来实现的,比如等待一个信号量或者一个消息队列。
- 任务从Ready状态转换为Running状态,是由调度器自动完成的,调度器会根据任务的优先级来决定下一个要执行的任务。
- 任务从Running状态转换为Blocked状态,是由任务自己主动调用FreeRTOS提供的阻塞函数来实现的,比如等待一个信号量或者一个消息队列。
- 任务从Blocked状态转换为Ready状态,是由任务自己主动解除阻塞来实现的,比如接收到了一个信号量或者一个消息队列。
- 任务从Running状态转换为Suspended状态,是由任务自己主动调用vTaskSuspend()函数来实现的。
- 任务从Suspended状态转换为Ready状态,是由任务自己主动调用vTaskResume()函数来实现的。
- 任务从任何状态转换为Deleted状态,都是由任务自己主动调用vTaskDelete()函数来实现的。
几个关键的task状态详细介绍如下:
4.1 阻塞态(Blocked):
- Blocked:如果一个任务等待某个事件的发生,则该task处于阻塞Blocked,比如等待一个信号量或者一个消息队列。
Blocked是非运行态的一种,也是FreeRTOS正常工作情况频繁的一种状态,表示task由于某些原因无法执行。
Task可以进入阻塞态以等待以下两种不同的Event:
- 时间相关Event,如定时、延时,比如某个task可进入阻塞态延时1s。
例如调用vTaskDelay(Tickes)的task将进入阻塞态,经延迟指定时间Ticks后,再转移到就绪态。
- 同步相关Event,等待其他task或中断产生的事件:如某task进入阻塞态等待队列有数据到来,数据可能是其他task或中断产生。
FreeRTOS实现同步方法:队列、二值信号量、计数信号量、互斥信号量和互斥量等。
Task可以在进入blocked等待同步Event时制定一个超时时间。比如,某task等待队列中数据到来,但最多只等1s,如果超过1s还没有数据也会退出阻塞态进入运行态。
4.2 挂起态(Suspended)
- Suspended:表示任务被暂停,此时任务不会被调度执行。
Suspended也是非运行态的一种。Suspended的task对于scheduler是不可见的
- 调用vTaskSuspend()挂起task,
- 再调用vTaskResume()来唤醒Task
大多数应用程序中都不会用到挂起状态。
4.3 就绪态(Ready)
- Ready:表示任务已经准备好执行,但还没有得到CPU资源去运行Running。
Ready既Task等待执行的状态。
如果task处于非运行状态,但既没有blocked也没有suspended,则此时为Ready to running,但尚未运行。
总结:
FreeRTOS提供了多种任务状态,可以满足不同的应用场景。开发人员可以根据实际需求选择合适的状态,并根据变化规律编写相应的代码来实现任务的状态转换。
FreeRTOS各个任务状态的含义和变化规律是嵌入式系统开发中非常重要的一部分。掌握这些知识可以帮助开发人员更好地理解任务的工作原理,并且可以编写出更加高效、稳定的嵌入式系统
博主热门文章推荐:
一篇读懂系列:
- 一篇读懂无线充电技术(附方案选型及原理分析)
- 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
- 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
LoRa Mesh系列:
- LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
- LoRa学习:信道占用检测原理(CAD)
- LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)
网络安全系列:
- ATECC508A芯片开发笔记(一):初识加密芯片
- SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
- 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
- AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例
嵌入式开发系列:
- 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
- IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
- Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
- Android底层调用C代码(JNI实现)
- 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
- Android/Linux设备有线&无线 双网共存(同时上内、外网)
AI / 机器学习系列:
- AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
- AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
- AI: 什么是机器学习的数据清洗(Data Cleaning)
- AI: 机器学习的模型是如何训练的?(在试错中学习)
- 数据可视化:TensorboardX安装及使用(安装测试+实例演示)
附:GPT4 output: