乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       少占魚 2013-02-18

      POWER_SAVING有關的函數(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 )
        {
          // 所有的任務都支持低功耗
          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 );

            // 進入睡眠模式

            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 進入深度睡眠,否則進入淺睡眠

         halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; 

       

      //深度睡眠只有在zgPollRate == 0才會產(chǎ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();

         //關閉MAC和無線電全部電源
          if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)

      {
            while ( (HAL_SLEEP_MS_TO_320US(halAccumulatedSleepTime) < timeout) || (timeout == 0) )
            {
              //關閉外設,進入睡眠,此處函數(shù)為空
              HalKeyEnterSleep();

      #ifdef HAL_SLEEP_DEBUG_LED
              HAL_TURN_OFF_LED3();
      #else
              //關閉LED燈,進入睡眠
              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);  //設置睡眠定時器時間
                }

               
                HAL_SLEEP_TIMER_CLEAR_INT();//清除中斷標志
                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);  //設置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)消息事件,按鍵,睡眠定時器事件進行處理

      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)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多