嵌入式开发学习日志47——任务创建与就绪列表

任务的栈、函数实体以及控制块需要联系在一起才能由系统进行统一的调度,而任务创建函数xTaskCreateStatic函数就是来实现这一功能的。

在该函数中,会涉及pxTaskCode(任务的函数名称)、pcName(任务名称)、ulStackDepth(任务栈大小)、pvParameters(任务形参)、uxPriority(任务优先级)等的定义,具体在创建时()内的参量要写什么还需要根据创建的形式来定。

任务创建总体来说有两种形式,一种是动态创建,一种是静态创建,

静态创建时,任务控制块和栈的内存需要自己进行定义,在任务删除时,这一部分内存是不会释放的。此时任务的函数、任务名称、堆栈大小、函数参数等上面提到的参数都需要定义。但是任务创建本身也是一个任务,为了防止被打断,可以进入临界区进行创建,这个后面会提到。

动态创建时,控制块和栈的内存都被系统事先分配好了,删除任务时这部分内存也会被释放。动态创建时的操作就比较简单了,只需要声明大小和指向控制块的指针即可,无需再定义控制块。

在创建完任务之后,我们需要将任务添加到就绪列表中,这样系统就知道任务已经就绪,可以进行调度了。其实就绪列表就是被定义为List_t类型的数组,而数组的大小由最大任务优先级的宏configMAX_PRIORITIES决定,具体代码如下:

List_t pxReadyTaskListsconfigMAX_PRIORITIES

当然,如果两个任务的优先级相同了怎么办?那么可以把这些任务插入到列表的同一条链表中。

那么如何将任务插入到列表中呢?

在任务的控制块中有一个xStateListItem的成员,将任务插入到就绪列表中,实际上就是将这个成员节点插入其中,就像两个齿轮,一个代表列表,一个代表任务的控制块,而xStateListItem就是齿轮上的卡槽,令两者顺利嵌合并且正常运作。

当然,想要让任务按照各自的顺序进行还需要系统调度器的参与,它的主要功能就是在就绪列表中选择一个最高优先级的任务并令其执行,实现任务间切换,不过这里就不多赘述。

相关推荐
通信小呆呆1 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick1 小时前
自动对焦学习-3
人工智能·学习·计算机视觉
✎ ﹏梦醒͜ღ҉繁华落℘2 小时前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
Daisy Lee2 小时前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn862 小时前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e3 小时前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨3 小时前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
u152109648493 小时前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd8451015003 小时前
RS485 总线详解
单片机·嵌入式硬件
cqbzcsq4 小时前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息