CN / EN
CN / EN

提问

设计支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

关于FreeRTOS的DeepSleep模式 GR551x

Angelo

2022-04-05 17:42

我在使用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内部本身有一个中断在不停的唤醒(协议栈在不停唤醒吗?),我的理解对吗?是否可以做到休眠停止?谢谢!

0收藏

0赞成

Barton

2022-04-06 16:10

你好,

是否有开启定时任务或BLE业务?

在IDLE任务中,会调用vPortEnterDeepSleep以触发相应的睡眠管理机制,此机制中会根据睡眠模式的选择以及外设的IDLE状态来决定是否要进入到深度睡眠状态,可参考port_pm_low_power.c文件来更进一步的了解相关机制。

如果没有周期性唤醒事件,是可以做到长久的深度睡眠,直到唤醒事件的到来。如使用AON_IO唤醒,可参考如下示例工程

SDK_FOLDER\projects\peripheral_app\gpio\gpio_io_wakeup,其中OK键可实现系统唤醒。

2条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注