ucOS-ii 与 iii的比较
【1】就绪表的最高优先级位置不同,
在UCOS-ii 就绪表中最高优先级的位置在右边,
ptcb->OSTCBY = (INT8U)(prio >> 3); /* Pre-compute X, Y, BitX and BitY */
ptcb->OSTCBX = (INT8U)(prio & 0x07);
ptcb->OSTCBBitY = (INT8U)(1 << ptcb->OSTCBY);
ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);
在UCOS-iii 就绪表中的最高优先级在左边。
{
CPU_DATA bit;
CPU_DATA bit_nbr;
OS_PRIO ix;
ix = prio / DEF_INT_CPU_NBR_BITS;
bit_nbr = (CPU_DATA)prio & (DEF_INT_CPU_NBR_BITS - 1u);
bit = 1u;
bit <<= (DEF_INT_CPU_NBR_BITS - 1u) - bit_nbr;
OSPrioTbl[ix] |= bit;
}
【2】任务调度时,查的表顺序不同
在UCOS-ii 中OSSched( )会先查OSRdyTbl[ ]确定那个就绪任务的优先级最高,并取得其优先级。然后利用得到的优先级查表OSTCBPrioTbl[ ]确定该优先级任务的TCB结构体的地址。得到TCB结构体后就得到了接下来将执行的代码。
在UCOS-iii 中OSSChed( )会先查看OSPrioTbl[ ]得到最高就绪任务的优先级。然后利用得到的优先级prio,找到OSRdyList[prio]对应的优先级下任务就绪任务链表,然后HeadPtr指向链表的第一个TCB结构体。