Angelo
我在使用SDK1.6.12的freertos的例子做开发,现在需要在进入Deep Sleep模式之前处理一些事情,如果有其他的IO中断唤醒以后再处理一些事情,根据SDK的代码来看,感觉应该是task.c这个文件里面的下面这段代码在处理:
extern void vPortEnterDeepSleep( TickType_t xExpectedIdleTime ); /* It is not desirable to suspend then resume the scheduler on * each iteration of the idle task. Therefore, a preliminary * test of the expected idle time is performed without the * scheduler suspended. The result here is not necessarily * valid. */
volatile TickType_t xExpectedIdleTime = prvGetExpectedIdleTime();
if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
{ vTaskSuspendAll();
xExpectedIdleTime = prvGetExpectedIdleTime();
vPortEnterDeepSleep(xExpectedIdleTime);
xTaskResumeAll();
}
但是我打印出来的结果好像是这段代码是不停在休眠唤醒中。请问能否让程序真正的进入休眠,并且等待下一个IO中断唤醒?似乎SDK内部本身有一个中断在不停的唤醒(协议栈在不停唤醒吗?),我的理解对吗?是否可以做到休眠停止?谢谢!
Barton
你好,
是否有开启定时任务或BLE业务?
在IDLE任务中,会调用vPortEnterDeepSleep以触发相应的睡眠管理机制,此机制中会根据睡眠模式的选择以及外设的IDLE状态来决定是否要进入到深度睡眠状态,可参考port_pm_low_power.c文件来更进一步的了解相关机制。
如果没有周期性唤醒事件,是可以做到长久的深度睡眠,直到唤醒事件的到来。如使用AON_IO唤醒,可参考如下示例工程
SDK_FOLDER\projects\peripheral_app\gpio\gpio_io_wakeup,其中OK键可实现系统唤醒。
打开微信,使用“扫一扫”即可关注