原始檔沒有對應的標頭檔案,其中函式是否可以被呼叫
阿新 • • 發佈:2021-02-20
在移植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指明其中一個是弱函式,就可以了。
程式在編譯的時候,如果發現有兩個相同名稱的函式,而且其中一個是弱函式,就會忽略弱函式,使用正常的函式進行編譯;如果發現只有一個弱函式,那還是會使用弱函式參與編譯。