分享

BLE peripheral协议栈之睡眠管理

 堆泄露栈溢出 2016-09-09
定义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起了非常重要的作用,具体这个变量是什么作用呢?


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多