ucosii任务切换机制概览--Apple的学习笔记

快速看了ucosii的切换,为什么选ucosii而不是ucosiii,就是要找简单的小麻雀,这样入手学习才快。直接官网注册下载code后,没有运行,直接在keil5中编译通过后直接看任务调度切换。
看上去和之前的os机制差不过,另外ucosii不支持相同优先级,必须是不同的优先级。其实我觉得ucosii用的变量比较多。反而我还是喜欢打包到结构体中的FreeRTOS,这样看起来比较集中。任务优先级设计手法不同,是采用bitmask的方法。不过网上资料比较多,直接搜索下即可明白OSTCBY和OSTCBX的含义。这样的设计仅针对8*8=64个优先级。
通过优先级为优先级bit赋值。

#if OS_LOWEST_PRIO <= 63u                                         /* Pre-compute X, Y                  */
        ptcb->OSTCBY             = (INT8U)(prio >> 3u);
        ptcb->OSTCBX             = (INT8U)(prio & 0x07u);
                                                                  /* Pre-compute BitX and BitY         */
        ptcb->OSTCBBitY          = (OS_PRIO)(1uL << ptcb->OSTCBY);
        ptcb->OSTCBBitX          = (OS_PRIO)(1uL << ptcb->OSTCBX);

通过优先级找到对应的任务

                OS_SchedNew();
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
#if OS_TASK_PROFILE_EN > 0u
                    OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
#endif
                    OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */

切换为高优先级任务

void  OSStart (void)
{
    if (OSRunning == OS_FALSE) {
        OS_SchedNew();                               /* Find highest priority's task priority number   */
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();                            /* Execute target specific code to start task     */
    }
}

网上的教程
OSRdyGrp = 0x011; //0b00010001
OSRdyTbl[0] = 0x0a; //0b00001010
OSRdyTbl[4] = 0x01; //0b00000001
计算出存在的几个优先级为;08+1=1,08+3=3,4*8+0=32
这样比较好理解。我自己也会计算。但是OSUnMapTbl是什么,一开始自己看不明白,网上查到了解释。
原来是用了空间换时间,查表法来直接得出优先级

y=OSUnMapTal[OSRdyGrp];//获得优先级别的D5、D4、D3位
x=OSUnMapTal[OSRdyTbl[y]]; //获得优先级别的D2、D1 、D0位
prio=(y<<3)+x;

假设OSRdyGrp最低位为1的是X位,OSRdyTbl[X]最低为1的是Y位,
则优先级=X*8+Y
因此只要知道了上述的X,Y就可算出最高优先级
OSUnMapTbl就是将0x00-0xff每个数据中最低位为1的位数一一列举出来放入到INT8U const OSUnMapTbl[256]表中。至于为什么数组是256呢?因为数字是8个bit,范围就是0-255。

你可能感兴趣的:(ucosii任务切换机制概览--Apple的学习笔记)