UCOS_III学习笔记(一)

优先级

用户指定元素的位数(如32bit)

那么OSPrioTbl[]结构即为任务就绪表,其中每一个元素是一个用户制定位数的元素

OS_PrioGetHighest()函数遍历这个数组并找到第一个不为零的元素(找到那一行)

计算这个元素的前导零个数之后即可得到最高的优先级任务

前导零为一个二进制数第一个1前出现的0

当优先级数较少时,这个过程是十分快速的。CPU中提供计算前导零的指令CLZ时なおさら。


就绪任务列表

任务就绪列表由两个部分组成–优先级位映射表OSPrioTbl[] (上文已经说过)
———————————— –OSRdyList[]记录每个优先级下所有就绪的任务

OSRdyList[]中每个OS_RDY_LIST元素的定义
struct os_rdy_list {
OS_TCB *HeadPtr; /* Pointer to task that will run at selected priority */
OS_TCB *TailPtr; /* Pointer to last task at selected priority */
OS_OBJ_QTY NbrEntries; /* Number of entries at selected priority */
};

NbrEntries记录了对应优先级下就绪任务的数量
两个指针是当前优先级的就绪任务的TCB的双向链表的头、尾指针

OSTaskCreate()会创建一个任务加入就绪任务列表—放到对应优先级所指向的双向链表的尾部,这是因为考虑到之前的任务可能是新任务的创建者,而这时两个任务优先级相同,没有理由先运行新的任务而使创建者被打断。然而,当新建任务与当前任务优先级不同时,新建任务会被插入双向链表的头部。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值