前段时间做基于μC/OS系统的开发,遇到一个问题,在运行任务的时候需要使CPU进入睡眠状态几秒钟,但直接调用__WFI();时没有效果,后来查找资料发现需要在空闲任务中调用。
下面是我让cpu进入睡眠状态的例子:
void App_TaskIdleHook (void)
{//检查标志确定是否需要睡眠
if(Flag_Power_Off != 0)
{//关闭systick避免systick中断唤醒CPU
SYSTICK_Cmd(DISABLE);
Flag_Power_Off = 0;
printf("sleep\r\n");
CLKPWR_Sleep();
printf("wake\r\n");
//恢复所有挂起的任务
OSTaskResume(10);
OSTaskResume(11);
OSTaskResume(12);
OSTaskResume(13);//使能systick恢复任务调度
SYSTICK_Cmd(ENABLE);
}
}
打开μC/OS的OS_APP_HOOKS_EN,在需要睡眠的地方加上下面的代码就可以进入睡眠状态了:
//设置定时器,定时进入中断唤醒CPU
//之前需要关闭除定时器以外的全部中断
//设置标志,需要进入睡眠状态
Flag_Power_Off = 0x01;
//挂起所有任务(保证CPU立即运行到空闲任务中)
OSTaskSuspend(10);
OSTaskSuspend(11);
OSTaskSuspend(12);
OSTaskSuspend(13);
注:在进入睡眠状态之前要用定时器设定唤醒时间并关闭除此定时器外的所有中断,我在进入空闲任务之前关掉了除systick外的中断,否则不能调度任务进入空闲任务,然后在空闲任务中关闭systick,睡眠完成之后再打开systick中断。