参考书籍:
<嵌入式实时操作系统μC OS原理与实践 [卢有亮编著].pdf> page47
关于 定时器 tick 和 idle任务
任务第1次运行过程中,
先运行 Task1,然后切换到 Task2 ,然后切换到Task3.
这个时候3个任务都在 OSTimeDly中,这个时候,进入idle任务。
来了 tick中断之后,若干次tick中断之后,Task1首先从Dly休眠中唤醒。
IDLE TASK
void OS_TaskIdle (void *p_arg)
OSRunning 什么时候设置为1的 ?
首先执行:OSInit( )
然后执行:OSStart( )
在OSStart( ) 中 调用 OSStartHighRdy()
在如下代码的地方,设置OSRunning =1
OS_TaskIdle()任务是什么时候创建的 ?
OSInit()函数中,
任务结构体:
OSTCBTbl[ ] 解析
#define OS_MAX_TASKS 20 /* Max. number of tasks in your application, MUST be >= 2 */
OS_EXT OS_TCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS]; /* Table of TCBs */
OSTimeTick[ ] 解析
OSRdyGrp 和 OSRdyTbl[ ]
OSTCBList 链表中的任务是 当前系统中 存在的任务块,这个任务可能是休眠的,等待信号的,等状态。
OSRdyGrp 任务准备运行组
OSRdyTbl[ ] 任务准备运行表
#define OS_LOWEST_PRIO 63 /* Defines the lowest priority that can be assigned ... */
#if OS_LOWEST_PRIO <= 63
OS_EXT INT8U OSRdyGrp; /* Ready list group */
OS_EXT INT8U OSRdyTbl[OS_RDY_TBL_SIZE]; /* Table of tasks which are ready to run */
#endif
#if OS_LOWEST_PRIO <= 63
#define OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1) /* Size of event table */
#define OS_RDY_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1) /* Size of ready table */
#endif
在OS_TCBInit( )中:
优先级数字 0 到63 ,
按照8个一组排列。0 – 7 是第0组,8 – 15 是第1组,16 — 23 是第2组。
具体的编号是:
x表示组内的某个成员,取值为0–7 ----- 对应的是 OSRdyTbl[]某个成员的某个位
Y表示属于某个组,取值是 63/8 ---- 对应的是 OSRdyGrp 某个位
比如 优先级13,对应的 x = 5 y=1,表示他是第1组的,第5个成员。
就绪的任务,在OSRdyTbl[ ]某个成员的某个位,设置为1.
如何查找最高优先级的任务?
INT8U y;
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
oSUnMapTbl[256]这个数组的作用是确定。
从0到255,这256个数字,用二进制表示的时候,从bit0 到bit7,哪一位最先是1。
比如:
0 : 0000 0000 : bit 0
1:0000 0001 :bit 0
2:0000 0010 :bit 1
3: 0000 0011 : bit 0
4: 0000 0100 :bit 2
5: 0000 0101 : bit 0
6: 0000 0110 : bit 1
7: 0000 0111 : bit 0
8: 0000 1000 : bit 3
… …
252: 1111 1100 : bit 2
253: 1111 1101 : bit 0
254: 1111 1110 : bit 1
255: 1111 1111 : bit 0
优先级是 按照 位的顺序 递增的
数字越小 ,优先级越大。
(稍后补充)