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

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

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

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

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

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

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

List_t pxReadyTaskLists[configMAX_PRIORITIES]

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

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

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

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

相关推荐
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
nashane6 小时前
HarmonyOS 6学习:CapsLock键失效诊断与长截图完整实现指南
学习·华为·harmonyos
于小猿Sup7 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
xian_wwq8 小时前
【学习笔记】AGC协调控制系统概述
笔记·学习
chao1898449 小时前
STM32 HAL库驱动AT24C02 EEPROM例程
stm32·单片机·嵌入式硬件
憧憬成为java架构高手的小白9 小时前
docker学习笔记(基于b站多个视频学习)【未完结】
笔记·学习
辰海Coding9 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
不会武功的火柴10 小时前
SystemVerilog语法(8)-有限状态机(FSM)
嵌入式硬件·fpga开发·自动化·ic验证·rtl·uvm方法学
闫记康10 小时前
Linux学习day5
linux·chrome·学习
一楼的猫10 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作