- 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 有需要的小伙伴们可以了解一下
|