標題: ZIGBEE電源管理POWER_SAVING有關的函數 [打印本頁]
作者: das 時間: 2015-4-18 00:32
標題: ZIGBEE電源管理POWER_SAVING有關的函數
POWER_SAVING有關的函數
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才會產生,這樣是為了盡可能的減少進入深度睡眠的次數
#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) )
{
//關閉外設,進入睡眠,此處函數為空
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();
//設置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()函數中 只對系統消息事件,按鍵,睡眠定時器事件進行處理
uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )
{
uint8 *msgPtr;
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG ) //系統消息事件
{
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();//為空函數
return events ^ HAL_SLEEP_TIMER_EVENT;
}
#endif
return 0;
}
6、ZDApp.c 中
ZDApp_DeviceAuthEvt()函數
#if defined ( POWER_SAVING )
osal_pwrmgr_device( PWRMGR_BATTERY );
#endif
ZDApp_ProcessNetworkJoin()函數中
#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;
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
久久九精品
|
视频一区二区三区中文字幕
|
69xxx免费|
久久久久久久91
|
日本三级电影在线观看视频
|
精品成人一区二区
|
亚洲国产69
|
成人国产精品免费观看
|
人人精品
|
国产精品无码久久久久
|
91久久|
国产日韩久久久久69影院
|
毛片免费观看
|
国产精品区二区三区日本
|
一区二区三区视频在线观看
|
久久精品久久精品
|
亚洲精品在线观
|
国产日韩视频
|
国产精品96久久久久久
|
久久r免费视频
|
久久久久久久久久久久91
|
色欧美综合
|
伊人网99
|
久久久久国产
|
亚州综合在线
|
亚洲天堂免费在线
|
国产精品成人久久久久
|
国产精品久久久久久久白浊
|
日韩欧美国产一区二区三区
|
一区二区精品
|
综合色婷婷
|
欧美电影在线观看网站
|
日本精品一区
|
久久久久网站
|
欧美精品一区二区三
|
精品在线观看一区二区
|
91久久北条麻妃一区二区三区
|
婷婷久久综合
|
一区二区久久精品
|
成年人网站在线观看视频
|
日韩欧美一级片
|