1.列表
我们在之前的任务分类中介绍过任务的分类,挂起,运行,阻塞,就绪这四个任务状态。而RTOS中用什么保存这四个列表中的任务呢?采用的就是列表,说是说列表,其实采用的就是数据结构中带头双向循环链表,不过这个哨兵节点变成尾节点。四个状态的任务分别用四个链表保存,链表中的节点是双向循环。链表信息的的数据结构如下
第一行与第五行是用于检验宏定义。第二行表示列表中的元素个数。第三行是指向列表,类似于链表的头指针,丢失了头指针就丢失了访问链表的能力。第四行是一个哨兵节点,这个节点不保存任何信息,用于标识链表的结束。(注:哨兵节点不计入节点个数)
2.列表项
列表项就很好理解了,这就是链表中的每一个节点。他的数据结构如下
同上,第一行与最后一行都是安全检测的宏定义,第二行是这个是这个节点的值,这个值一般存放什么呢?比如说我们阻塞列表中的列表项,之前说过阻塞列表中存放的是正在Delay的函数,而Delay了多少毫秒呢?这个数据就可以作为阻塞列表排序的依据。列表项的值就是列表排列的依据。而三四行就显而易见了。双向链表的两个指针。第五行的值就是链表的内容了,在这里是任务,所以说存放的就是任务控制块,笔者在这里认为他应该和任务句柄类似。
任务句柄:这个在我理解看来,
每个任务都有自己的信息和特点,而任务句柄数据结构本质其实是一个指针,它指向这个任务包含任务特点的首地址,在我们使用创建任务时,传入创建任务函数的其实是任务句柄的地址,说明要改变任务句柄的指向,即给这个指针赋值。在其他函数中,挂起删除解挂等函数操作其实都是操作这个任务句柄,其中删除就是把这个任务句柄赋值为NULL。
反正简单来说就是把链表中的信息换成了任务信息。而第六行则是这个列表项应该处于的列表,即辨识它应该所处的列表。
3.列表操作函数介绍
这个函数是对列表本身信息数据结构的初始化函数
这个是对每个列表元素(列表项)的初始化
这个是将列表项用尾插法插入列表中。