uCOS-II的移植范例要求用户编写10个简单的C函数:
OSTaskStkInit() //必须要实现的函数,OSTaskCreat()和OSTaskCreatExt()通过调用此函数来初始化任务的栈结构.
OSTaskCreatHook() //当用OSTaskCreate() 或 OSTaskCreateExt() 建立任务的时候就会调用OSTaskCreateHook()。该函数允许用户或使用用户的移植实例的用户扩展 µC/OS-Ⅱ的功能。
OSTaskSwHook() //做任务切换时,会调用此函数。不管任务切换是通过 OSCtxSw()还是OSIntCtxSw()来执行的都会调用该函数。 OSTaskSwHook()可以直接访问 OSTCBCur 和OSTCBHighRdy,因为它们是全局变量。 OSTCBCur 指向被切换出去的任务的 OS_TCB,而OSTCBHighRdy指向新任务的OS_TCB
OSTaskStatHook() //OSTaskStatHook()每秒钟都会被OSTaskStat()调用一次。用户可以用OSTaskStatHook()来扩展统计功能
OSTimeTickHook() //在每个时钟节拍都会被OSTimeTick()调用。
OSTCBInitHook() //可以做一些与初始化控制块OS_TCB有关的处理。
OSTaskIdleHook() //OSTaskIdle()函数可调用OSTaskIdleHook()函数实现CPU低功耗模式。
OSInitHookBegin //进入OSInit函数后,会此函数立即调用。
OSInitHookEnd() //功能与OSInitHooBegin相同
#include "ucos_ii.h"
/*当OSTaskCreat()调用OSTaskStkInit()时,将pot设置为0x000*/
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt)
{
OS_STK *stk; //由于设置了堆栈增长的方向OS_STK_GROWTH=1,所以向下递减
opt = opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer */
*(stk) = (OS_STK)task; /* Entry Point */
*(--stk) = (INT32U)0; /* LR */
*(--stk) = (INT32U)0; /* R12 */
*(--stk) = (INT32U)0; /* R11 */
*(--stk) = (INT32U)0; /* R10 */
*(--stk) = (INT32U)0; /* R9 */
*(--stk) = (INT32U)0; /* R8 */
*(--stk) = (INT32U)0; /* R7 */
*(--stk) = (INT32U)0; /* R6 */
*(--stk) = (INT32U)0; /* R5 */
*(--stk) = (INT32U)0; /* R4 */
*(--stk) = (INT32U)0; /* R3 */
*(--stk) = (INT32U)0; /* R2 */
*(--stk) = (INT32U)0; /* R1 */
*(--stk) = (INT32U)p_arg; /* R0 : argument */
*(--stk) = (INT32U)0x00000013L; /* CPSR (SVC mode, Enable both IRQ and FIQ interrupts) */
return (stk);
}
#if OS_CPU_HOOKS_EN //此常量设定是否在文件OS_CPU_C.C中声明对外接口函数(hook function钩子函数),设为1为声明
#if OS_VERSION > 203
void OSInitHookBegin (void)
{
}
#endif
#if OS_VERSION > 203
void OSInitHookEnd (void)
{
}
#endif
void OSTaskCreateHook (OS_TCB *ptcb) //每当添加任务时,OS_TCBInit()函数都会调用OSTaskCreateHook()函数
{
ptcb = ptcb; /* Prevent compiler warning */
}
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent compiler warning */
}
//做任务切换时就会调用OSTaskSwHook()函数
void OSTaskSwHook (void)
{
}
//该函数会每秒都会被通缉任务OSTaskStat()调用一次
void OSTaskStatHook (void)
{
}
#if OS_VERSION > 203
//每当添加任务时,OS_TCBInit()函数都会调用OSTaskCreateHook()函数之前,会先调用OSTCBInitHook函数
void OSTCBInitHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent Compiler warning */
}
#endif
void OSTimeTickHook (void)
{
}
#if OS_VERSION >= 251
//置CPU于低功耗运行
void OSTaskIdleHook (void){
}
#endif
#endif