從 μC/OS 升級(jí)到 μC/OS-II
OSTaskStkInit()中。
程序清單L10.9μC/OS 中的 OSTaskCreate()
UBYTEOSTaskCreate(void(*task)(void*pd),void*pdata,void*pstk,UBYTE
p)
{
UWORDOS_FAR*stk;
UBYTEerr;
OS_ENTER_CRITICAL();
if(OSTCBPrioTbl[p]==(OS_TCB*)0){
OSTCBPrioTbl[p]=(OS_TCB*)1;
OS_EXIT_CRITICAL();(1)
stk=(UWORDOS_FAR*)pstk;
*--stk=(UWORD)FP_OFF(pdata);
*--stk=(UWORD)FP_SEG(task);
*--stk=(UWORD)FP_OFF(task);
*--stk=(UWORD)0x0202;
*--stk=(UWORD)FP_SEG(task);
*--stk=(UWORD)FP_OFF(task);
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=(UWORD)0x0000;
*--stk=_DS;
err=OSTCBInit(p,(voidfar*)stk);(2)
if(err==OS_NO_ERR){
if(OSRunning){
OSSched();
}
}else{
OSTCBPrioTbl[p]=(OS_TCB*)0;
}
return(err);
}else{
OS_EXIT_CRITICAL();
return(OS_PRIO_EXIST);
}
}
程序清單 L10.10 μC/OS-II中的OSTaskStkInit()
void*OSTaskStkInit(void(*task)(void*pd),void*pdata,void*ptos,
INT16Uopt)
{
INT16U*stk;
opt=opt;
stk=(INT16U*)ptos;
*stk--=(INT16U)FP_SEG(pdata);
*stk--=(INT16U)FP_OFF(pdata);
*stk--=(INT16U)FP_SEG(task);
*stk--=(INT16U)FP_OFF(task);
*stk--=(INT16U)0x0202;
*stk--=(INT16U)FP_SEG(task);
*stk--=(INT16U)FP_OFF(task);
*stk--=(INT16U)0xAAAA;
*stk--=(INT16U)0xCCCC;
*stk--=(INT16U)0xDDDD;
*stk--=(INT16U)0xBBBB;
*stk--=(INT16U)0x0000;
*stk--=(INT16U)0x1111;
*stk--=(INT16U)0x2222;
*stk--=(INT16U)0x3333;
*stk--=(INT16U)0x4444;
*stk=_DS;
return((void*)stk);
}
10.4.2OSTaskCreateHook()
OSTaskCreateHook()在μC/OS中沒有,如程序清單L10.11所示,在由.μC/OS 向μC/OS-II升級(jí)時(shí),定義一個(gè)空函數(shù)就可以了。注意其中的賦值語(yǔ)句,如果不把Ptcb賦給Ptcb,有些編譯器會(huì)產(chǎn)生一個(gè)警告錯(cuò)誤,說定義的Ptcb變量沒有用到。
程序清單10.11 μC/OS-II 中的OSTaskCreateHook()
#ifOS_CPU_HOOKS_EN
OSTaskCreateHook(OS_TCB*ptcb)
{
ptcb=ptcb;
}
#endif
OS_CFG.H
OS_CPU_HOOKS _EN設(shè)為1時(shí),OSTaskCreateHook()的代碼才會(huì)生成。這樣做的好處是允許
用戶移植時(shí)可在不同文件中定義鉤子函數(shù)。
10.4.3OSTaskDelHook()
OSTaskDelHook() 這個(gè)函數(shù)在μC/OS中沒有,如程序清單10.12所示,從μC/OS 到μC/OS-II,只要簡(jiǎn)單地定義一個(gè)空函數(shù)就可以了。注意,如果不用賦值語(yǔ)句將ptcb賦值為ptcb,有些編譯程序可能會(huì)產(chǎn)生一些警告信息,指出定義的ptcb變量沒有用到。
程序清單L10.12 μC/OS-II中的OSTaskDelHook().
#ifOS_CPU_HOOKS_EN
OSTaskDelHook(OS_TCB*ptcb)
{
ptcb=ptcb;
}
#endif
也還是要用條件編譯管理指令來(lái)處理這個(gè)函數(shù)。只有把OS_CFG.H. 文件中的
OS_CPU_HOOKS_EN 設(shè)為1,OSTaskDelHook()的代碼才能生成。這樣做的好處是允許用戶移植時(shí)在不同的文件中定義鉤子函數(shù)。
10.4.4OSTaskSwHook()
OSTaskSwHook() 在μC/OS 中也不存在。從μC/OS向μC/OS-II升級(jí)時(shí),只要簡(jiǎn)單地定義一個(gè)空
函數(shù)就可以了,如程序清單L10.13所示。
程序清單L10.13 μC/OS-II中的OSTaskSwHook()函數(shù)
#ifOS_CPU_HOOKS_EN
OSTaskSwHook(void)
{
}
#endif
也還是要用編譯管理指令來(lái)處理這個(gè)函數(shù)。 只有把OS_CFG.H 文件中的OS_CPU_HOOKS_EN設(shè)為1,OSTaskSwHook() 的代碼才能生成。.
10.4.5OSTaskStatHook()
OSTaskStatHook()在μC/OS中不存在,從μC/OS向μC/OS-II升級(jí)時(shí),只要簡(jiǎn)單地定義一個(gè)空函數(shù)就可以了,如程序清單L10.14所示。
也還是要用編譯管理指令來(lái)處理這個(gè)函數(shù)。 只有把OS_CFG.H 文件中的OS_CPU_HOOKS_EN設(shè)為1,OSTaskSwHook() 的代碼才能生成。
程序清單L10.14 μC/OS-II中的OSTaskStatHook()函數(shù)
#ifOS_CPU_HOOKS_EN
OSTaskStatHook(void)
{
}
#endif
10.4.6OSTimeTickHook()
OSTimeTickHook()在μC/OS中不存在,從μC/OS向μC/OS-II升級(jí)時(shí),只要簡(jiǎn)單地定義一個(gè)空函數(shù)就可以了,如程序清單L10.15所示。
也還是要用編譯管理指令來(lái)處理這個(gè)函數(shù)。 只有把OS_CFG.H 文件中的OS_CPU_HOOKS_EN設(shè)為1,OSTimeTickHook()的代碼才能生成。
.
程序清單L10.15 μC/OS-II中的OSTimeTickHook()
#ifOS_CPU_HOOKS_EN
OSTimeTickHook(void)
{
}
#endif
10.5總結(jié)
表T10.3總結(jié)了從μC/OS向μC/OS-II.升級(jí)需要改變得地方。其中processor_name.?是μC/OS中
移植范例程序的文件名。
表 T10.3 升級(jí) μC/OS到 μC/OS-I要修改的地方
評(píng)論