大家好,在开发sig mesh sdk时,使用软件定时器即blt_soft_timer_add(&soft_timer_test0, 2*1000*1000),在不休眠时,可以定时进去timer_test0,但使用了app_cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_TIMER|PM_WAKEUP_PAD, 32*1000*60*30);这个函数进去休眠后,软件定时器并没有按照2s钟醒来,这是为何呢,文档说可以提前唤醒的,大家若知道,麻烦指导一下,谢谢了
No related topics |
感谢hk.wang的回答,我使用了cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_TIMER,clock_time()+30*1000*CLOCK_16M_SYS_TIMER_CLK_1MS);这个函数,无法休眠,注意我上面描述的是函数是app_cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_TIMER|PM_WAKEUP_PAD, 32*1000*60*30);它们的参数单位不一样,希望再次得到您的回复,谢谢
你用的是哪个 sdk,我并没有看到过 app_cpu_sleep_wakeup 这个函数?
另外,soft timer设置的提前唤醒是针对协议栈管理的低功耗部分,协议栈根据内部任务和定时器任务择优选择唤醒时间;手动调用的 cpu_sleep_wakeup 是跳过协议栈直接调用底层休眠函数,无法关联到 soft timer了。
@haiou
感谢hk.wang的回答,我使用了cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_TIMER,clock_time()+30*1000*CLOCK_16M_SYS_TIMER_CLK_1MS);这个函数,无法休眠,注意我上面描述的是函数是app_cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_TIMER|PM_WAKEUP_PAD, 32*1000*60*30);它们的参数单位不一样,希望再次得到您的回复,谢谢
你用的是哪个 sdk,我并没有看到过 app_cpu_sleep_wakeup 这个函数?
另外,soft timer设置的提前唤醒是针对协议栈管理的低功耗部分,协议栈根据内部任务和定时器任务择优选择唤醒时间;手动调用的 cpu_sleep_wakeup 是跳过协议栈直接调用底层休眠函数,无法关联到 soft timer了。
@haiou
再次感谢hk.wang的回答,针对第一个问题:我用的是sig mesh sdk ,这个函数没有找到的化也可以用cpu_long_sleep_wakeup();这个函数,它们都是一样的,
针对第二个问题:
如果不调用底层休眠函数,那我想要休眠后定时唤醒(休眠后,2s唤醒,1小时唤醒等),该如何做到,再次期待您的回复,谢谢
1. 这两个函数的时间都是相对时间,需要加上当前时间,区别是cpu_sleep_wakeup采用16M时钟,最大260s左右的休眠,cpu_long_sleep_wakeup采用31k时钟,休眠时间延长;
2. cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_TIMER,clock_time()+2*1000*CLOCK_16M_SYS_TIMER_CLK_1MS);就是2s后唤醒;
一般协议栈内部会处理低功耗任务,如果需要配合soft timer使用的话;应用层调用该函数一般用于没有stack任务了,需要进入长休眠。
@haiou
再次感谢hk.wang, 1.我已经明白了,
2.对于第二点还是有点疑惑,意思是用sofetimer添加的定时任务是不能进去休眠对吧,如果我强制使用底层休眠函数进休眠的,softtimer就会失效了对吧,这样理解对么?
对,使用 softtimer 就不要直接调用底层休眠函数。
当确定应用层没有任务了(包括定时器任务),可以进入长休眠。
@haiou