POWER_SAVING有關(guān)的函數(shù)
1、 osal.c 中 osal_start_system()----> osal_pwrmgr_powerconserve();
void osal_pwrmgr_powerconserve( void ) { uint16 next; halIntState_t intState;
// Should we even look into power conservation if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) { // 所有的任務(wù)都支持低功耗 if ( pwrmgr_attribute.pwrmgr_task_state == 0 ) { // Hold off interrupts. HAL_ENTER_CRITICAL_SECTION( intState );
// 得到下一次的睡眠時間
next = osal_next_timeout();
// Re-enable interrupts. HAL_EXIT_CRITICAL_SECTION( intState );
// 進(jìn)入睡眠模式
OSAL_SET_CPU_INTO_SLEEP( next ); //halsleep(next); } } }
void halSleep( uint16 osal_timeout ) { uint32 timeout; uint32 macTimeout = 0;
halAccumulatedSleepTime = 0;
timeout = HAL_SLEEP_MS_TO_320US(osal_timeout); if (timeout == 0) { timeout = MAC_PwrNextTimeout(); } else { macTimeout = MAC_PwrNextTimeout();
if ((macTimeout != 0) && (macTimeout < timeout)) { timeout = macTimeout; } }
//如果timeout =0 進(jìn)入深度睡眠,否則進(jìn)入淺睡眠
halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
//深度睡眠只有在zgPollRate == 0才會產(chǎn)生,這樣是為了盡可能的減少進(jìn)入深度睡眠的次數(shù)
#if !defined (RTR_NWK) && defined (NWK_AUTO_POLL) if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) || (timeout == 0 && zgPollRate == 0)) #else if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) || (timeout == 0)) #endif { halIntState_t ien0, ien1, ien2;
HAL_ASSERT(HAL_INTERRUPTS_ARE_ENABLED()); HAL_DISABLE_INTERRUPTS();
//關(guān)閉MAC和無線電全部電源 if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)
{ while ( (HAL_SLEEP_MS_TO_320US(halAccumulatedSleepTime) < timeout) || (timeout == 0) ) { //關(guān)閉外設(shè),進(jìn)入睡眠,此處函數(shù)為空 HalKeyEnterSleep();
#ifdef HAL_SLEEP_DEBUG_LED HAL_TURN_OFF_LED3(); #else //關(guān)閉LED燈,進(jìn)入睡眠 HalLedEnterSleep(); #endif
//啟動睡眠定時器中斷 if (timeout != 0) { if (timeout > HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME )) { timeout -= HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ); halSleepSetTimer(HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME )); } else { halSleepSetTimer(timeout); //設(shè)置睡眠定時器時間 }
HAL_SLEEP_TIMER_CLEAR_INT();//清除中斷標(biāo)志 HAL_SLEEP_TIMER_ENABLE_INT();//啟動定時器 }
#ifdef HAL_SLEEP_DEBUG_LED if (halPwrMgtMode == CC2530_PM1) { HAL_TURN_ON_LED1(); } else { HAL_TURN_OFF_LED1(); } #endif
HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2); HAL_ENABLE_INTERRUPTS();
HAL_SLEEP_SET_POWER_MODE(halPwrMgtMode); //設(shè)置SLEEP.MODE=halPwrMgtMode,PCON.IDLE=1 HAL_DISABLE_INTERRUPTS();
HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2);
HAL_SLEEP_TIMER_DISABLE_INT();
halAccumulatedSleepTime += (HalTimerElapsed() / TICK_COUNT);
if ( osal_timeout > halAccumulatedSleepTime) { osal_timeout -= halAccumulatedSleepTime; }
#ifdef HAL_SLEEP_DEBUG_LED HAL_TURN_ON_LED3(); #else HalLedExitSleep(); #endif
//如果有按鍵按下,跳出睡眠模式,使能所有中斷
if ( HalKeyExitSleep() ) { break; }
if ( timeout == 0 ) break; }//end while
MAC_PwrOnReq();//打開MAC和無線電電源
}//end if
HAL_ENABLE_INTERRUPTS(); } }
2、osal_pwrmg.c 中 osal_pwrmgr_powerconserve()
3、osal_timer.c 中 osal_adjust_timers(),osal_next_timeout
4、hal_mcu.h 中
#ifdef POWER_SAVING
#define CLEAR_SLEEP_MODE() st(SLEEPCMD &= ~PMODE;) #else #define CLEAR_SLEEP_MODE() #endif
5、hal_driver.c中
Hal_ProcessEvent()函數(shù)中 只對系統(tǒng)消息事件,按鍵,睡眠定時器事件進(jìn)行處理
uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) { uint8 *msgPtr; (void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG ) //系統(tǒng)消息事件
{ msgPtr = osal_msg_receive(Hal_TaskID);
while (msgPtr) {
osal_msg_deallocate( msgPtr ); msgPtr = osal_msg_receive( Hal_TaskID ); } return events ^ SYS_EVENT_MSG; }
if ( events & HAL_LED_BLINK_EVENT ) //燈事件 { #if (defined (BLINK_LEDS)) && (HAL_LED == TRUE) HalLedUpdate(); #endif return events ^ HAL_LED_BLINK_EVENT; }
if (events & HAL_KEY_EVENT) //處理按鍵事件 {
#if (defined HAL_KEY) && (HAL_KEY == TRUE) HalKeyPoll();
if (!Hal_KeyIntEnable) { osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100); } #endif // HAL_KEY
return events ^ HAL_KEY_EVENT; }
#ifdef POWER_SAVING if ( events & HAL_SLEEP_TIMER_EVENT ) //該部分處理睡眠定時器事件 { halRestoreSleepLevel();//為空函數(shù)
return events ^ HAL_SLEEP_TIMER_EVENT; } #endif
return 0;
}
6、ZDApp.c 中
ZDApp_DeviceAuthEvt()函數(shù)
#if defined ( POWER_SAVING ) osal_pwrmgr_device( PWRMGR_BATTERY ); #endif
ZDApp_ProcessNetworkJoin()函數(shù)中
#if defined ( POWER_SAVING ) osal_pwrmgr_device( PWRMGR_BATTERY ); #endif
void osal_pwrmgr_device( uint8 pwrmgr_device ) { //PWRMGR_BATTERY 低功耗,PWRMGR_ALWAYS_ON正常工作模式
pwrmgr_attribute.pwrmgr_device = pwrmgr_device;
}
|