uCOS-Ⅲ学习笔记-时基列表
时基列表总结
1.简介
每个任务都有阻塞延时,以释放CPU使用权,使其他任务有机会运行,多任务系统中,时基切换频繁,所以使用时基列表统一管理很有必要
2.设置时基列表有关函数以及变量
添加全局变量
- OSCFG_TICK_WHEEL_SIZE(时基列表宽度)
- OSTickCtr(时基列表计数变量)
- OSCfg_TickWheel[ size] 时基列表
变量类型(OS_TICK_SPOKE)
- NbrEntriesMax
时基列表成员包含的单项链表最大节点数 - NbrEntries
时基列表成员当前链表节点数 - FirstPtr
时基列表成员当前链表第一个节点
(以上三个变量的类型皆为OS_TICK_SPOKE类型,OS_TICK_SPOKE是32位无符号整型重定义)
添加任务控制块成员
- TickNextPtr
链表的下一位 - TickPrevPtr
链表的上一位 - TickSpokePtr
链表的根部 - TickCtrMatch
等于OSTickCtr加上TickRemain的值 - TickRemain
还剩余的等待时间,每个TICK自减
(以上为时基列表主要成员)
链表实现函数
OS_TickListInit(),用循环来初始化时基列表所有成员有关的数据域=0
初始化的目标变量如下:
- NbrEntriesMax;
- NbrEntries;
- FirstPtr;
往时基列表插入一个任务TCB(OS_TickListInsert())
- 传入任务TCB,以及延时时间
- 判断该链表有没有节点
(1)无则直接插入到第一个节点
(2)有则和每个节点比较剩余延时时间,插到时间比他短后面一位
((1)和(2)主要配置的TCB参数是链表的上下位及链表根部,用来联系链表) - 在插入成功后刷新spoke里面Nbr的值
- 把插入的tcb根指针指向根节点
从时基列表删除一个指定的节点(OS_TickListRemove())
- 传入任务TCB
- 确定任务在链表里面
- 将要删除的任务时间清零
- 判断任务TCB的位置
(1)第一个节点
直接配置对应配置;
(2)不是第一个
保存前后节点;
断开TCB前后联系;
将前后重新连接; - 复位删除的任务TCB里面时基列表相关成员
- Nbr减少1
更新计数器Ctr,扫描时基判断任务是否到期(OS_TickListUpdate())
- 进入临界段
- 索引链表(每次调用只扫描一个)
- while()循环;扫描链表的第一个节点,判断时间是否到期,没到期则退出,到期则继续扫描后面的节点,让到期任务都就绪(链表的排序是按就绪准备时间来计算)
就绪函数-从时基列表删除、在插入就绪任务 - 退出临界段
3.调用流程
初始化
编写一个初始化函数创建变量,调用清除函数,清除对应数据表。
调用
在每一个延迟函数里面执行
- 插入时基列表
- 从就绪列表移除
时基更新
在每一个TICK中断任务里面加入更新时基列表