日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

ZIGBEE電源管理POWER_SAVING有關(guān)的函數(shù)

 少占魚 2013-02-18

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; 

 }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多