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

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

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

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

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

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

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

List_t pxReadyTaskListsconfigMAX_PRIORITIES

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

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

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

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

相关推荐
wangqiaowq13 小时前
Ontology 学习 二
学习
该学习了咕咕20 小时前
顶刊论文学习笔记
学习
Linux-lucky21 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
li星野21 小时前
【学习记录】k-Wave 时间步长、CFL 稳定性与参数实验全解析
学习
国科安芯1 天前
83 倍:ASC0108S 在推挽和开漏之间,差的不是速度,是回程
单片机·嵌入式硬件·架构·电平转换·抗辐射
心祭丫丫1 天前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
Nerd(BUG版)1 天前
Flutter学习day5--事件手势与命中测试
学习·flutter
国科安芯1 天前
从遥控到自治:ASP4644S2B支撑星载电源健康管理与容错配电
网络·单片机·嵌入式硬件·安全·dcdc·低轨卫星·商业航天
rhythm-ring1 天前
《汽车热管理系统:电子水泵单线PWM双向诊断机制》
单片机·嵌入式硬件·汽车
Nerd(BUG版)1 天前
KMP学习day4--Kotlin空安全与泛型
学习·安全·kotlin