還有沒上車的嗎
馬上要開車了
不等了,開始發車
老司機,再稍我一個
車已經發動了
你等下一班車吧
車子運行中,大伙兒坐穩啦!
Ⅰ
庫函數中的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文章
1129瀏覽量
128826 -
STM32
+關注
關注
2266文章
10871瀏覽量
354789 -
STM8
+關注
關注
18文章
392瀏覽量
56708
發布評論請先 登錄
相關推薦
評論