小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

BLE peripheral協(xié)議棧之睡眠管理

 堆泄露棧溢出 2016-09-09
定義POWER_SAVING,CC2541會(huì)進(jìn)入睡眠模式——
文件: OSAL.c
函數(shù): 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

省電管理函數(shù):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 );
  }
  }
}

上述函數(shù)說(shuō)明CC2541要進(jìn)入睡眠,除了需要定義POWER_SAVING外,還要當(dāng) pwrmgr_attribute.pwrmgr_task_state清零時(shí)才可以,
那么 pwrmgr_attribute.pwrmgr_task_state是什么時(shí)候清零的呢?且看下文。

設(shè)置電源管理狀態(tài)的語(yǔ)句——
文件: hal_drivers.c
函數(shù): Hal_ProcessEvent( uint8 task_id, uint16 events )
語(yǔ)句:
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;
  }

在這里好像看到眉目了,但是是哪里發(fā)出的事件 HAL_PWRMGR_HOLD_EVENT/ HAL_PWRMGR_CONSERVE_EVENT呢?
經(jīng)過(guò)一番搜索,找到發(fā)出響應(yīng)事件的位置

發(fā)出電源保持/省電事件——
文件:_hal_uart_dma.c
函數(shù):static void HalUARTPollDMA(void)
語(yǔ)句:
  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并不是并列的??磥?lái) dmaRdyDly起了非常重要的作用,具體這個(gè)變量是什么作用呢?


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多