新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > uC/OS-II源碼分析

        uC/OS-II源碼分析

        作者: 時間:2016-09-12 來源:網絡 收藏

        INT8UOSTCBBitX;/*Bitmasktoaccessbitpositioninreadytable

        INT8UOSTCBBitY;/*Bitmasktoaccessbitpositioninreadygroup

        #ifOS_TASK_DEL_EN>0

        BOOLEANOSTCBDelReq;/*表面任務是否需要刪除自己*/

        #endif

        }OS_TCB;

        uC/OS-II在通過OS_MAX_TASKS定義了最大的任務數目,這也決定了分配給用戶程序的任務控制塊OS_TCB的數目,但此外uC/OS-II還分配給系統任務OS_N_SYS_TASKS若干個額外的任務控制塊,供其內部使用。uC/OS-II初始化時,所以任務控制塊都被鏈接成單向空任務鏈表,任務一旦建立,空任務控制塊指針OSTCBFreeList指向的任務控制塊就賦給該任務,然后OSTCBFreeList調整為指向鏈表中下一個空任務控制塊。一旦任務被刪除,任務控制塊被還給空任務鏈表。

        任務建立時,OS_TCBInit()初始化任務控制塊,函數OSTaskCreate()或OSTaskCreateExt()調用任務控制塊初始化函數TCBInit。

        INT8UOS_TCBInit(INT8Uprio,OS_STK*ptos,OS_STK*pbos,INT16Uid,INT32Ustk_size,void*pext,INT16Uopt)

        {

        #ifOS_CRITICAL_METHOD==3/*為CPU狀態寄存器分配內存*/

        OS_CPU_SRcpu_sr;

        #endif

        OS_TCB*ptcb;

        OS_ENTER_CRITICAL();

        ptcb=OSTCBFreeList;/*從空閑TCB鏈表中取一個空TCB*/

        if(ptcb!=(OS_TCB*)0)

        {//取到了空TCB

        OSTCBFreeList=ptcb->OSTCBNext;/*更新空閑TCB鏈表頭指針*/

        OS_EXIT_CRITICAL();

        ptcb->OSTCBStkPtr=ptos;/*保存棧頂指針到TCB*/

        ptcb->OSTCBPrio=(INT8U)prio;/*保存任務優先級到TCB*/

        ptcb->OSTCBStat=OS_STAT_RDY;/*任務狀態設置為就緒*/

        ptcb->OSTCBDly=0;/*任務不延時等待*/

        #ifOS_TASK_CREATE_EXT_EN>0//使用擴展

        ptcb->OSTCBExtPtr=pext;/*保存TCB擴展指針*/

        ptcb->OSTCBStkSize=stk_size;/*保存棧大小*/

        ptcb->OSTCBStkBottom=pbos;/*保存棧底*/

        ptcb->OSTCBOpt=opt;/*保存任務選擇項*/

        ptcb->OSTCBId=id;/*保存任務ID*/

        #else//不使用擴展

        pext=pext;

        stk_size=stk_size;

        pbos=pbos;

        opt=opt;

        id=id;

        #endif

        #ifOS_TASK_DEL_EN>0

        ptcb->OSTCBDelReq=OS_NO_ERR;//初始化刪除標志

        #endif

        ptcb->OSTCBY=prio>>3;/*預先計算X,Y,BitXandBitY*/

        ptcb->OSTCBBitY=OSMapTbl[ptcb->OSTCBY];

        ptcb->OSTCBX=prio0x07;

        ptcb->OSTCBBitX=OSMapTbl[ptcb->OSTCBX];

        #ifOS_EVENT_EN>0

        ptcb->OSTCBEventPtr=(OS_EVENT*)0;/*任務不等待任何事件發生*/

        #endif

        #if(OS_VERSION>=251)(OS_FLAG_EN>0)(OS_MAX_FLAGS>0)(OS_TASK_DEL_EN>0)

        ptcb->OSTCBFlagNode=(OS_FLAG_NODE*)0;/*任務不等待事件標志*/

        #endif

        #if(OS_MBOX_EN>0)||((OS_Q_EN>0)(OS_MAX_QS>0))

        ptcb->OSTCBMsg=(void*)0;/*沒有接收任何消息*/

        #endif

        #ifOS_VERSION>=204

        OSTCBInitHook(ptcb);

        #endif

        OSTaskCreateHook(ptcb);/*調用用戶定義的鉤子函數*/

        OS_ENTER_CRITICAL();

        OSTCBPrioTbl[prio]=ptcb;

        ptcb->OSTCBNext=OSTCBList;/*將TCB插入已經建立任務的雙向鏈表中*/

        ptcb->OSTCBPrev=(OS_TCB*)0;

        if(OSTCBList!=(OS_TCB*)0){

        OSTCBList->OSTCBPrev=ptcb;

        }

        OSTCBList=ptcb;

        OSRdyGrp|=ptcb->OSTCBBitY;/*讓用戶進入就緒態*/

        OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;

        OS_EXIT_CRITICAL();

        return(OS_NO_ERR);

        }

        OS_EXIT_CRITICAL();

        return(OS_NO_MORE_TCB);

        }


        上一頁 1 2 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 洪湖市| 乡城县| 平谷区| 柯坪县| 永泰县| 霍山县| 郓城县| 凤阳县| 沽源县| 浠水县| 甘孜县| 疏勒县| 阿鲁科尔沁旗| 涪陵区| 琼海市| 金堂县| 望城县| 惠安县| 福安市| 克拉玛依市| 唐河县| 北京市| 宜宾市| 霍山县| 雷山县| 咸宁市| 买车| 全椒县| 延寿县| 潮安县| 抚顺县| 崇信县| 新沂市| 邵阳县| 大关县| 岚皋县| 高雄县| 五寨县| 凤台县| 北宁市| 安达市|