定义POWER_SAVING,CC2541会进入睡眠模式—— 文件:
OSAL.c 函数:
osal_run_system( void )
#if defined( POWER_SAVING )
else // Complete pass through all task events with no activity?
{
osal_pwrmgr_powerconserve(); // Put the processor/system into sleep
}
#endif
省电管理函数:osal_pwrmgr_powerconserve()—— 文件:OSAL_PwrMgr.c 定义: void osal_pwrmgr_powerconserve( void )
{
uint32 next;
halIntState_t intState;
// Should we even look into power conservation
if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )
{
// Are all tasks in agreement to conserve
if ( pwrmgr_attribute.pwrmgr_task_state == 0 )
{
// Hold off interrupts.
HAL_ENTER_CRITICAL_SECTION( intState );
// Get next time-out
next = osal_next_timeout();
// Re-enable interrupts.
HAL_EXIT_CRITICAL_SECTION( intState );
// Put the processor into sleep mode
OSAL_SET_CPU_INTO_SLEEP( next );
}
}
}
上述函数说明CC2541要进入睡眠,除了需要定义POWER_SAVING外,还要当
pwrmgr_attribute.pwrmgr_task_state清零时才可以, 那么
pwrmgr_attribute.pwrmgr_task_state是什么时候清零的呢?且看下文。 设置电源管理状态的语句—— 文件:
hal_drivers.c 函数:
Hal_ProcessEvent( uint8 task_id, uint16 events ) 语句: if ( events & HAL_PWRMGR_HOLD_EVENT )
{
(void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_HOLD);
(void)osal_stop_timerEx(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT);
(void)osal_clear_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT);
return (events & ~(HAL_PWRMGR_HOLD_EVENT | HAL_PWRMGR_CONSERVE_EVENT));
} if ( events & HAL_PWRMGR_CONSERVE_EVENT )
{
(void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_CONSERVE);
return events ^ HAL_PWRMGR_CONSERVE_EVENT;
} 在这里好像看到眉目了,但是是哪里发出的事件
HAL_PWRMGR_HOLD_EVENT/
HAL_PWRMGR_CONSERVE_EVENT呢? 经过一番搜索,找到发出响应事件的位置 发出电源保持/省电事件—— 文件:_hal_uart_dma.c 函数:static void HalUARTPollDMA(void) 语句: if (dmaRdyDly == 0)
{
(void)osal_set_event(Hal_TaskID, HAL_PWRMGR_HOLD_EVENT);
}
else if ((dmaRdyDly != 0) && (!DMA_PM_DLY || ((uint8)(ST0 - dmaRdyDly) > DMA_PM_DLY)))
{
dmaRdyDly = 0;
(void)osal_set_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT);
}
注意,上述if else if并不是并列的。看来
dmaRdyDly起了非常重要的作用,具体这个变量是什么作用呢? |
|