Esempio n. 1
0
/*****************************************************************************
 Function   : VOS_SuspendAllTask
 Description: suspend all FID & selftask
 Input      : invaild
 Return     : void
 Other      : only for designer
 *****************************************************************************/
VOS_VOID VOS_SuspendAllTask( VOS_UINT32 Para0, VOS_UINT32 Para1,
                             VOS_UINT32 Para2, VOS_UINT32 Para3 )
{
    if ( VOS_OK != VOS_SuspendFidsTask() )
    {
        Print("# SUSPED FID error.\r\n");
    }

    if ( VOS_OK != VOS_SuspendTask( vos_TimerTaskId ) )
    {
        Print("# SUSPED VOS timer task error.\r\n");
    }

    if ( VOS_OK != VOS_SuspendTask( RTC_TimerTaskId ) )
    {
        Print("# SUSPED RTC timer task error.\r\n");
    }
}
VOS_UINT32 VOS_Startup( enum VOS_STARTUP_PHASE ph )
{
    VOS_UINT32      ulReturnValue;
    VOS_UINT32      ulStartUpFailStage = 0;

    switch(ph)
    {
    case VOS_STARTUP_INIT_DOPRA_SOFEWARE_RESOURCE :
        vos_StartUpStage = 0x00010000;

        if ( VOS_OK != VOS_MemInit() )
        {
            ulStartUpFailStage |= 0x0001;

            break;
        }

        VOS_SemCtrlBlkInit();

        VOS_QueueCtrlBlkInit();

        VOS_TaskCtrlBlkInit();

        VOS_TimerCtrlBlkInit();

        OM_RecordMemInit();

        if ( VOS_OK != RTC_TimerCtrlBlkInit() )
        {
            ulStartUpFailStage |= 0x0100;
        }

#if (OSA_CPU_CCPU == VOS_OSA_CPU)
        if ( VOS_OK != VOS_DrxTimerCtrlBlkInit())
        {
            ulStartUpFailStage |= 0x0200;
        }
#endif

        if ( VOS_OK != VOS_PidCtrlBlkInit() )
        {
            ulStartUpFailStage |= 0x0400;
        }

        if ( VOS_OK != VOS_FidCtrlBlkInit() )
        {
            ulStartUpFailStage |= 0x0800;
        }

        if ( VOS_OK != CreateFidsQueque() )
        {
            ulStartUpFailStage |= 0x1000;
        }
        break;

    case VOS_STARTUP_SET_TIME_INTERRUPT:
        vos_StartUpStage = 0x00020000;
        break;

    case VOS_STARTUP_CREATE_TICK_TASK:
        vos_StartUpStage = 0x00040000;
        /* create soft timer task */
        if ( VOS_OK != VOS_TimerTaskCreat() )
        {
            ulStartUpFailStage |= 0x0001;
        }

        if ( VOS_OK != RTC_TimerTaskCreat() )
        {
            ulStartUpFailStage |= 0x0002;
        }

#if (OSA_CPU_CCPU == VOS_OSA_CPU)
        if ( VOS_OK != VOS_DrxTimerTaskCreat() )
        {
            ulStartUpFailStage |= 0x0004;
        }
#endif

        break;

    case VOS_STARTUP_CREATE_ROOT_TASK:
        vos_StartUpStage = 0x00080000;

        if ( VOS_OK !=
                VOS_StartCallBackRelTimer(&g_VosProtectInitTimer,
                                          DOPRA_PID_TIMER, 20000, 0, 0,
                                          VOS_RELTIMER_NOLOOP, VOS_ProtectInit, VOS_TIMER_NO_PRECISION) )
        {
            ulStartUpFailStage |= 0x0001;
        }

        g_ulVosStartStep = 0x0000;

        ulReturnValue = VOS_OutsideInit();

        if(VOS_OK != ulReturnValue)
        {
            ulStartUpFailStage |= ulReturnValue;
        }

        g_ulVosStartStep = 0x0004;

        if ( VOS_OK != WD_TaskCreat() )
        {
            ulStartUpFailStage |= 0x0004;
        }

        g_ulVosStartStep = 0x0008;

        if ( VOS_OK != VOS_FidsInit() )
        {
            ulStartUpFailStage |= 0x0008;
        }

        g_ulVosStartStep = 0x0010;

#if 0
        /* 创建VOS各FID任务之前,锁任务 */
        if ( VOS_OK != VOS_TaskLock() )
        {
            ulStartUpFailStage |= 0x0010;
        }
#endif
        g_ulVosStartStep = 0x0020;

        /* create FID task & selftask task */
        if ( VOS_OK != CreateFidsTask() )
        {
            ulStartUpFailStage |= 0x0020;
        }

#if (VOS_WIN32 != VOS_OS_VER)
        g_ulVosStartStep = 0x0040;

        /* suspend FID task & selftask task */
        if ( VOS_OK != VOS_SuspendFidsTask() )
        {
            ulStartUpFailStage |= 0x0040;
        }
#endif

        g_ulVosStartStep = 0x0080;
#if 0
        /* 创建VOS各FID任务完成后解锁 */
        if ( VOS_OK != VOS_TaskUnlock() )
        {
            ulStartUpFailStage |= 0x0080;
        }
#endif
        g_ulVosStartStep = 0x0100;

        if ( VOS_OK != VOS_PidsInit() )
        {
            ulStartUpFailStage |= 0x0100;
        }
        break;

    case VOS_STARTUP_SUSPEND_MAIN_TASK:
        vos_StartUpStage = 0x00100000;

        g_ulVosStartStep = 0x0001;

        /* Resume任务之前,锁任务 */
        if ( VOS_OK != VOS_TaskLock() )
        {
            ulStartUpFailStage |= 0x0001;
        }

#if (VOS_WIN32 != VOS_OS_VER)

        g_ulVosStartStep = 0x0002;

        /* Resume FID task & selftask task */
        if ( VOS_OK != VOS_ResumeFidsTask() )
        {
            ulStartUpFailStage |= 0x0002;
        }
#endif

        g_ulVosStartStep = 0x0004;

        /* Resume任务之后解锁 */
        if ( VOS_OK != VOS_TaskUnlock() )
        {
            ulStartUpFailStage |= 0x0004;
        }

        g_ulVosStartStep = 0x0008;

        /* stop protect timer */
        VOS_StopRelTimer(&g_VosProtectInitTimer);

#if (OSA_CPU_CCPU == VOS_OSA_CPU)
        /* OSA初始化完成,需要调用DRV函数通知DRV OSA启动完成 */
        if ( VOS_OK != DRV_CCPU_RESET_OVER() )
        {
            ulStartUpFailStage |= 0x0008;
        }
#endif

#if (VOS_LINUX == VOS_OS_VER)
        VOS_RunTask();
#endif


        break;

    default:
        break;
    }

    /* calculate return value */
    if( 0 != ulStartUpFailStage )
    {
        ulReturnValue = vos_StartUpStage;
        ulReturnValue |= ulStartUpFailStage;
        Print1("startup retuen value is %x.\r\n",ulReturnValue);

        /* reboot */
        VOS_ProtectionReboot(OSA_INIT_ERROR, (VOS_INT)ulReturnValue,
                             (VOS_INT)g_ulOmPidInit, (VOS_CHAR *)&g_ulOmFidInit, sizeof(VOS_UINT32));

        return(ulReturnValue);
    }
    else
    {
        return(VOS_OK);
    }
}