void Power_Idle_Task(void* pdata)
{
UART_Init();
Uart_SendChar(0xEF);
Power_Init();
Timer_Init();//定时器初始化
//System_Debug_Init();
Services_Init();//服务组件
Application_Init();//应用程序
while(1)
{
//喂狗
API_User_WDOG_Refresh();
switch (Power.Power_Status)
{
//1.设置进入Stop时间为1S
//2.设置当前进入模式为wait模式
case Power_Status_Init:
{
Power_RTC_SET_Time_User(1000,false);
API_User_SOC_Enter_Wait_Mode();
Power.Power_Status=Power_Status_Runing;
}break;
//1.设置当前在wait模式下运行时间为20MS
//2.设置当前进入模式为wait模式
//3.开启任务调度系统
case Power_Status_Enter_Wait:
{
Power_RTC_SET_Time_User(20,false);
API_User_SOC_Enter_Wait_Mode();
API_User_OS_Resume();
Power.Power_Status=Power_Status_Runing;
}// @suppress("No break at end of case")
//进入低功耗模式
case Power_Status_Runing:
{
asm("wfi");
}break;
//1.关闭任务调度系统
//2.设置当前进入低功耗模式
//3.设置唤醒stop模式时间为1S
case Power_Status_Enter_Stop:
{
API_User_OS_Suspend();
API_User_SOC_Enter_Stop_Mode();
Power_RTC_SET_Time_User(1000,false);
Power.Power_Status=Power_Status_Stoping;
}// @suppress("No break at end of case")
//进入低功耗模式
case Power_Status_Stoping:
{
asm("wfi");
}// @suppress("No break at end of case")
//1.检查当前唤醒信号是否有效
//2.如果唤醒信号有效则进入wait模式
case Power_Status_Check_WakeUp_Signal:
{
Function_Groups_Run(&Power.FGN,Null,Power_Check_WakUp);
}break;
default:
{
}break;
}
}
}
static void Services_Sleep_Task(void *pdata)
{
Services_Input_Link_Event_Flag_Group();
while(1)
{
switch (Services_Sleep.Status)
{
case Services_Sleep_Status_Init:
{
Function_Groups_Init(&Services_Sleep.Operation_Function);
Services_Sleep.Status=Services_Sleep_Status_Enter_WakeUp;
API_User_Wait_Enter_Stop_Times(1000,true);
API_User_Sleep(50);
}break;
case Services_Sleep_Status_Runing:
{
Event_Return_Type ER=Services_Input_Wait_Status(SI_IGN_IN,IO_OFF,100);
if(ER==Event_Return_OK)
{
API_User_Wait_Enter_Stop_Times(1000,true);
API_User_Sleep(500);
if(Services_Input_GET_Status(SI_IGN_IN)==IO_OFF)
{
Services_Sleep.Status=Services_Sleep_Status_Enter_Sleep;
API_User_Wait_Enter_Stop_Times(1000,true);
}
else
{
;
}
}
else if(ER==Event_Return_Time_Out)
{
API_User_Wait_Enter_Stop_Times(1000,true);
}
else
{
API_User_Sleep(100);
}
}break;
case Services_Sleep_Status_DeepSleep:
{
if(Services_Input_Wait_Status(SI_IGN_IN,IO_ON,-1)==Event_Return_OK)
{
Services_Sleep.Status=Services_Sleep_Status_Enter_WakeUp;
}
}break;
case Services_Sleep_Status_Enter_WakeUp:
{
API_User_Wait_Enter_Stop_Times(1000,true);
Function_Groups_Run(&Services_Sleep.Operation_Function,(void *)Services_Sleep_Operation_Enter_WakeUp,Null);
//API_User_Timer_WakeUp();
Services_Sleep.Status=Services_Sleep_Status_Runing;
}break;
case Services_Sleep_Status_Enter_Sleep:
{
Function_Groups_Run(&Services_Sleep.Operation_Function,(void *)Services_Sleep_Operation_Enter_Sleep,Null);
//API_User_Timer_Sleep();
Services_Sleep.Status=Services_Sleep_Status_DeepSleep;
}break;
default:
{
API_User_Sleep(100);
}break;
}
}
}
既然没有朋友有实质性结果 我就把思路贴出来吧 上面两个任务 第一个是系统空闲任务 优先级最低 属于内核任务 第二个是服务类任务 因为我的内核设计是微内核架构 第二个服务是检查IGN主动睡眠 第一个是 OS自动根据任务需求睡眠 唤醒 运行等需求 整体在睡眠下功耗做到了0.5MA 低于客户要求的1MA 有需要的小伙伴们可以了解一下 |