这是一个app的task的代码,其RTOS 是NUCLEUS.
void App_Task(void)
{
UNSIGNED rcv_msg[5],size;
/* disable key event */
KEY_EventEnable( FALSE);
/* Create rx data Q */
App_CreateQ();
m_bEvHandlerEnable = 1;
ApiLink_Init(0);
BasicApi_Init(0);
Trace_Init();
Debug_Init();
Peanut_Init(0);
EvHandler_FlushEvent(0);
SysDev_SetSysInitLevel(SYSINIT_LEVEL_1);
EvHandler_Process();
/* enable key event */
KEY_EventEnable( TRUE );
if(App_RunEx(0, 100, TRUE) == 0)
return;
EvHandler_Process();
while (TRUE)
{
if( NU_Receive_From_Queue(&App_RxDataQ, rcv_msg, 5 , &size, NU_SUSPEND)== NU_SUCCESS )
{
switch (rcv_msg[0])
{
case SYNC_App_TASK:
if( (rcv_msg[1] == 1) && \
(rcv_msg[2]>= NETNOTI_PDP_OPEN) && (rcv_msg[2] < NET_NOTI_NUM) )
{
Network_PostNotiEvent(rcv_msg[2], rcv_msg[3], rcv_msg[4]);
break;
}
EvHandler_PostEvent( (T_HANDLE)rcv_msg[1], (T_EVENT)rcv_msg[2], (T_PARAM)rcv_msg[3], (T_PARAM)rcv_msg[4]);
if( rcv_msg[2] == DEV_FLIP_CHANGE_E)
{
if( rcv_msg[3] == DEV_FLIP_OPEN)
{
SYS_ProcMsmDeepSleep();
}
}
else if( rcv_msg[2] == DEV_KEY_KEYDOWN_E)
{
SYS_ProcMsmDeepSleep();
}
EvHandler_Process();
break;
case SYNC_APPTIMER_TASK:
__is_timer_pend = 0;
TimerCore_Process();
break;
case SYNC_SNDMIDI:
if(rcv_msg[3])
{
SysHeap_Free((char*)rcv_msg[3]);
}
break;
default:
break;
}
PalDisp_RefreshAll();
}//End if
}//END while(TRUE)
}
---------------------------------------------------------
问题是,在这个TASK的代码中,RTOS每次执行的入点是哪里?是从函数头重新开始执行吗?
void App_Task(void)
{
UNSIGNED rcv_msg[5],size;
还是从对NU_Receive_From_Queue 的判断开始执行.
因为有10几个TASK,RTOS在进行scheduler . 要中断这个TASK必须从while(TRUE)的入点,即:NU_Receive_From_Queue的判断处. 但是当这个TASK重新获得资源时,是从哪里开始执行呢?
谢谢.期待你的指教.