久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4502|回復: 0
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76127 發(fā)表于 2015-4-18 00:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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 )
      {
              if ( pwrmgr_attribute.pwrmgr_task_state == 0 )     // 所有的任務都支持低功耗
               {
                    HAL_ENTER_CRITICAL_SECTION( intState );      // Hold off interrupts.
                    next = osal_next_timeout();     // 得到下一次的睡眠時間   
                    HAL_EXIT_CRITICAL_SECTION( intState );     // Re-enable interrupts.
                      // 進入睡眠模式
                     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();
   //關(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ù)為空
        HalKeyEnterSleep();
#ifdef HAL_SLEEP_DEBUG_LED
        HAL_TURN_OFF_LED3();
#else
        //關(guān)閉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();
                        //設置SLEEP.MODE=halPwrMgtMode,PCON.IDLE=1
                        HAL_SLEEP_SET_POWER_MODE(halPwrMgtMode);  

                        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   //while ( (HAL_SLEEP_MS_TO_320US(halAccumulatedSleepTime) < timeout) || (timeout == 0) )
     
              MAC_PwrOnReq();//打開MAC和無線電電源
        }//end if         if (MAC_PwrOffReq(MAC_PWR_SLEEP_DEEP) == MAC_SUCCESS)
        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;
}









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品免费国产一区二区三区四区介绍 | 久久综合一区二区三区 | 国产精品视频偷伦精品视频 | 午夜精品福利视频 | 国产一区视频在线 | 免费成人毛片 | 日韩亚洲视频在线 | 午夜精品一区二区三区在线视频 | 欧美成人在线免费 | 日本一本在线 | 亚洲视频免费在线播放 | 日本特黄a级高清免费大片 国产精品久久性 | 欧美亚洲国产日韩 | 国内久久| 一区二区免费 | 超碰最新在线 | www.青青草| eeuss国产一区二区三区四区 | 成人福利网站 | 黄色一级免费 | 欧美日韩一区二区三区在线观看 | 日韩在线免费视频 | 久久精品成人一区 | 99精品免费在线观看 | 成人免费精品视频 | 91.xxx.高清在线 | 国产精品亚洲欧美日韩一区在线 | 国产欧美一区二区久久性色99 | 欧美久久久久久久久中文字幕 | 久久综合入口 | 丝袜 亚洲 另类 欧美 综合 | 国产日韩中文字幕 | av网站免费 | 午夜日韩视频 | 欧美一级在线观看 | 中文字幕综合 | 美日韩免费视频 | 欧美天堂一区 | 成人三级视频在线观看 | 色婷婷综合网 | 欧美成人a |