1. 程式人生 > 其它 >原始檔沒有對應的標頭檔案,其中函式是否可以被呼叫

原始檔沒有對應的標頭檔案,其中函式是否可以被呼叫

技術標籤:ThreadXHALstm32c語言

在移植ThreadX作業系統的時候,發現HAL庫時間基準檔案stm32h7xx_hal_timebase_tim.c並沒有對應的標頭檔案,其中定義的HAL_Delay函式如何在其他檔案中呼叫。通過Go To Reference發現,此stm32h7xx_hal_timebase_tim.c檔案裡面定義的函式,宣告在其他標頭檔案中,且另外一個原始檔有該函式的弱定義。例如:HAL_Delay函式在stm32h7xx_hal_timebase_tim.c檔案中有定義

/*
*********************************************************************************************************
*	函 數 名: HAL_Delay
*	功能說明: 重定向毫秒延遲函式。替換HAL中的函式。因為HAL中的預設函式依賴於Systick中斷,如果在USB、SD卡
*             中斷中有延遲函式,則會鎖死。也可以通過函式HAL_NVIC_SetPriority提升Systick中斷
*	形    參: 無
*	返 回 值: 無
*********************************************************************************************************
*/
void HAL_Delay(uint32_t Delay) { bsp_DelayMS(Delay); }

但是該函式宣告在stm32h7xx_hal.h中,且在stm32h7xx_hal.c檔案中也有弱定義。

/**
  * @brief This function provides minimum delay (in milliseconds) based
  *        on variable incremented.
  * @note In the default implementation , SysTick timer is the source of time base.
  *       It is used to generate interrupts at regular time intervals where uwTick
  *       is incremented.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @param Delay  specifies the delay time length, in milliseconds.
  * @retval None
  */
__weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); uint32_t wait = Delay; /* Add a freq to guarantee minimum wait */ if (wait < HAL_MAX_DELAY) { wait += (uint32_t)(uwTickFreq); } while ((HAL_GetTick() - tickstart) < wait) { } }

HAL庫中許多函式有弱定義。_weak

用來修飾函式或者變數。表示修飾的函式或變數的使用優先順序較低。即如果我們定義了一個函式或變數,它與關鍵字__weak修飾的函式或者變數名一致。則優先使用我們定義的,而忽略__weak修飾的。但如果我們沒有定義這樣的函式或者變數名,則使用__weak所修飾的。我們叫這種函式為弱函式

我們需要在使用者檔案中,自己再定義一個一模一樣的函式,只是我們自己定義的函式,不需要指明是弱函式。

理論上,一個工程中是不允許出現兩個相同名稱的函式的,這裡使用weak指明其中一個是弱函式,就可以了。

程式在編譯的時候,如果發現有兩個相同名稱的函式,而且其中一個是弱函式,就會忽略弱函式,使用正常的函式進行編譯;如果發現只有一個弱函式,那還是會使用弱函式參與編譯。