還有沒上車的嗎
馬上要開車了
不等了,開始發車
老司機,再稍我一個
車已經發動了
你等下一班車吧
車子運行中,大伙兒坐穩啦!
Ⅰ
庫函數中的assert_param
在STM8、STM32標準外設庫,或者HAL庫的stm8_conf.h、stm32···_conf.h文件中會看見如下一段代碼:
/* #define USE_FULL_ASSERT 1 */
#ifdef USE_FULL_ASSERT
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
voidassert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
大概意思就是:如果定義了USE_FULL_ASSERT,則會宏定義:#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
相當于是一個條件語句。
此時,還需要我們實現assert_failed函數,如果不實現,則會報錯(后面來講具體如何實現)。
而在其他地方調用情況(如GPIO)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BSRR = GPIO_Pin;
}
調用assert_param的主要作用就是檢測參數正確與否,即我們所說的斷言。
Ⅱ
assert_param詳情
1.STM8S中的assert_param
細心的朋友會發現,STM8標準外設庫stm8s_conf.h中開啟了USE_FULL_ASSERT這個宏:
#define USE_FULL_ASSERT (1)
開啟USE_FULL_ASSERT這個宏,就意味著要實現assert_failed((uint8_t *)__FILE__, __LINE__))這個函數;
那么我就在main.c文件下,按照官方的例程實現了assert_failed函數:
#ifdef USE_FULL_ASSERT //斷言(參考官方)
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
}
#endif
2.STM32中的assert_param
在STM32標準外設庫,HAL庫中的USE_FULL_ASSERT這個宏是被屏蔽了的。故程序運行#define assert_param(expr) ((void)0)
也就是沒有做任何處理。
我之前提供的例程中,為了不動官方代碼,assert_param這個函數都是沒有使用的。
3.assert_failed((uint8_t *)__FILE__, __LINE__))
看到這個函數,就要說下__FILE__和__LINE__這兩個標準定義。
__LINE__:正在編譯文件的行號
__FILE__:正在編譯文件的文件名
還不懂的同學,建議參考之前的文章【ANSIC幾種特殊的標準定義(__FILE__、__LINE__、__STDC__···)】。
而上面只是申明,函數具體的實現還需要自己實現。理解了上面兩個參數,相信大家都會知道如何實現了。需要根據自己項目情況來實現。常規舉例:
voidassert_failed(uint8_t* file, uint32_t line)
{
printf("Error code in file:%s,line:%u ",file,line);
}
這條語句在調及產品出廠之前測試是很有必要的,方便分析問題所在。正式推出版本,不定義USE_FULL_ASSERT這個宏既可以關閉了。
-
ST
+關注
關注
32文章
1187瀏覽量
132444 -
STM32
+關注
關注
2308文章
11160瀏覽量
373043 -
STM8
+關注
關注
18文章
393瀏覽量
58701
發布評論請先 登錄
【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配
深入淺出GMSSL:掌握SM2、SM3、SM4國密算法的高效實踐
GCC開發工程的模版
線程超時函數中 assert 失敗是什么原因導致的?
K8s存儲類設計與Ceph集成實戰
SFUD驅動庫實戰手冊:串行SPI Flash開發全流程解析
基礎篇3:掌握Python中的條件語句與循環
深入理解C語言:函數—編程中的“積木塊”藝術
深入理解C語言:C語言循環控制
半導體器件中微量摻雜元素的EDS表征
LPCVD方法在多晶硅制備中的優勢與挑戰
HarmonyOS Next V2 @Local 和@Param
在外部中斷中將printf寫入,外部中斷LED可以翻轉,但串口不可顯示,為什么?
技術干貨驛站 ▏深入理解C語言:嵌套循環與循環控制的底層原理
老司機帶你深入理解ST庫中的 assert_param 語句
評論