rtos環境下,stm32如何取消hal庫的HAL_Delay()


在使用cubemx的情況下,通常會自動初始化HAL_Delay()延時函數的,裸機情況下,就是使用了systick,如果如適用freertos等rtos,那么他會強制使用其他定時器作為時間基准,但起始可以把HAL_Delay()這個函數取消了,因為在cm3內核有dwt作為時間的延時函數,多個中斷,總是浪費一點資源。

1、在裸機平台移植其他rtos,rtos都是使用systick作為時間基准的。那么cubemx生成的systick初始化函數直接注釋掉。

    //    /**Configure the Systick interrupt time
    //    */
    //  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    //    /**Configure the Systick
    //    */
    //  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

    //  /* SysTick_IRQn interrupt configuration */
    //  HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);

 2、同時把HAL_InitTick函數直接返回ok

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
#if 0
  /* Configure the SysTick to have interrupt in 1ms time basis*/
  if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
  {
    return HAL_ERROR;
  }

  /* Configure the SysTick IRQ priority */
  if (TickPriority < (1UL << __NVIC_PRIO_BITS))
  {
    HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
    uwTickPrio = TickPriority;
  }
  else
  {
    return HAL_ERROR;
  }
#endif
  /* Return function status */
  return HAL_OK;
}

  這樣可以去直接移植其他rtos或者自己寫的rtos了。

不過HAL_Delay函數最好不要用了。直接使用自己根據systick定義出的延時函數,HAL_GetTick 這歌函數里的計數器肯定是個常量了。

或者把HAL_Delay重新定義一個函數也可以,因為驅動函數庫中是__weak void HAL_Delay(uint32_t Delay)有弱定義的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM