void halSleep( uint32 osal_timeout )
{
…
halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
printf("sp %d %lu\n", halPwrMgtMode, timeout);
…
}
打印如下,怎么进入了PM3还会一直唤醒?
[14:08:20.852] sp 3 0
sp 3 0
sp 3 0
[14:08:20.864] sp 3 0
sp 3 0
[14:08:20.875] sp 3 0
sp 3 0
[14:08:20.895] sp 3 0
[14:08:20.901] sp 3 0
sp 3 0
[14:08:20.909] sp 3 0
[14:08:20.925] sp 3 0
[14:08:20.937] sp 3 0
sp 3 0
sp 3 0
….省略几千行打印
YiKai Chen:
z-stack不會進PM3,只會進PM2,如果有事件就會被喚醒,比如說polling
one Man:
回复 YiKai Chen:
-DPOLL_RATE=0 ,我的PollRate为0
one Man:
回复 YiKai Chen:
唤醒得很频繁,几毫秒就醒来一次
YiKai Chen:
回复 one Man:
只要有timer event就會被喚醒不是只有polling
one Man:
回复 YiKai Chen:
我在void osal_run_system( void )加了红色部分代码,并没有任何事件产生。
#if defined( POWER_SAVING ) && !defined(USE_ICALL) else // Complete pass through all task events with no activity? { for(uint8 i=0; i<tasksCnt ; i++) { for(uint8 j=0; j<16 ; j++) { if(osal_get_timeoutEx( i, BV(j))) { printf("%d %04x, %lu\n", i, BV(j), osal_get_timeoutEx( i, BV(j))); break; } } } osal_pwrmgr_powerconserve(); // Put the processor/system into sleep }#endif
YiKai Chen:
回复 one Man:
改成下面的程序碼試試
#if defined( POWER_SAVING ) && !defined(USE_ICALL) else // Complete pass through all task events with no activity? { printf("%d %04x, %lu\n", i, BV(j), osal_get_timeoutEx( i, BV(j))); osal_pwrmgr_powerconserve(); // Put the processor/system into sleep }#endif
one Man:
回复 YiKai Chen:
这样 i,j 并没有用。
发现其实是
if (halSleepPconValue != 0 && MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)
这句代码问题,返回的好像并不是Success。
改为如下却可以,不知道为什么。
halIntState_t ien0, ien1, ien2;
uint8 mac=1;
HAL_ASSERT(HAL_INTERRUPTS_ARE_ENABLED());
HAL_DISABLE_INTERRUPTS();
mac = MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP);
printf("v %d, %d\n", halSleepPconValue, mac);
/* always use "deep sleep" to turn off radio VREG on CC2530 */
if (halSleepPconValue != 0 && mac == MAC_SUCCESS)
{
…
}
YiKai Chen:
回复 one Man:
請問你想要達成的目的是什麼?
one Man:
回复 YiKai Chen:
就是未入网的时候进入deep sleep
YiKai Chen:
回复 one Man:
如果你使能POWER_SAVING,未入网的时候就會进入PM2