STM_HAL: assert_param 與 assert_failed函數




assert_param:定義如下:

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

 作用:檢測傳遞給函數的參數是否爲有效的參數(有效的參數:指滿足規定範圍的參數,如某個參數的取值範圍只能小於3的整數,若給出的參數大於3,則這個assert_param()可在運行的程序調用這個函數時報錯,使程序員可及時發現錯誤,而不必等到程序運行結果的錯誤而大費周折。) 用於程序開發的時候,調試用的檢測語句。默認是不開啓的,你可以無視它的存在。但是,當你在調試程序的時候,可以打開這個檢測機制,調試完了再關閉。

怎麼使assert_param起作用?

查看assert_param的定義,位於stm32fxxx_hal_conf.h文件,它實際上是個宏定義,看它的條件編譯語句,當USE_FULL_ASSERT定義後,即可打開assert_param這個參數檢測機制。USE_FULL_ASSERT這個宏定義已經在文件中隱掉,我們把它的註釋符號去掉即可。

#define USE_FULL_ASSERT    1


如果定義了USE_FULL_ASSERT,就把assert_param定義爲一個三目運算的結構,否則,就把assert_param定義爲((void)0)。也就是說,你只有定義;餓USE_FULL_ASSERT,assert_param纔會起作用,這個作用就是通過一個三目運算結果來判斷。


當你應以了USE_FULL_ASSET之後,若立即編譯,編譯器會報錯,提示assert_failed函數沒有定義。我們把assert_failed這個函數放到main.c文件中,如下定義:

void assert_failed(uint8_t* file, uint32_t line)
{
printf("Wrong parameters value: file %s on line %d\r\n", file, line);
while(1);
}

上面函數的意思:如果參數出錯,輸出出錯的文件名和行號。結果是輸出到串口,用串口調試助手可以看到輸出結果。注意,編譯器Build Output 欄是不會報錯的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章