现在的位置: 首页 > 综合 > 正文

uCOSV2.52在mini2440上的移植解析2:OS_CPU_C.c

2013年08月20日 ⁄ 综合 ⁄ 共 3582字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.