還有沒上車的嗎
馬上要開車了
不等了,開始發(fā)車
老司機(jī),再稍我一個(gè)
車已經(jīng)發(fā)動(dòng)了
你等下一班車吧
車子運(yùn)行中,大伙兒坐穩(wěn)啦!
Ⅰ
庫函數(shù)中的assert_param
在STM8、STM32標(biāo)準(zhǔn)外設(shè)庫,或者HAL庫的stm8_conf.h、stm32···_conf.h文件中會(huì)看見如下一段代碼:
/* #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,則會(huì)宏定義:#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
相當(dāng)于是一個(gè)條件語句。
此時(shí),還需要我們實(shí)現(xiàn)assert_failed函數(shù),如果不實(shí)現(xiàn),則會(huì)報(bào)錯(cuò)(后面來講具體如何實(shí)現(xiàn))。
而在其他地方調(diào)用情況(如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;
}
調(diào)用assert_param的主要作用就是檢測參數(shù)正確與否,即我們所說的斷言。
Ⅱ
assert_param詳情
1.STM8S中的assert_param
細(xì)心的朋友會(huì)發(fā)現(xiàn),STM8標(biāo)準(zhǔn)外設(shè)庫stm8s_conf.h中開啟了USE_FULL_ASSERT這個(gè)宏:
#define USE_FULL_ASSERT (1)
開啟USE_FULL_ASSERT這個(gè)宏,就意味著要實(shí)現(xiàn)assert_failed((uint8_t *)__FILE__, __LINE__))這個(gè)函數(shù);
那么我就在main.c文件下,按照官方的例程實(shí)現(xiàn)了assert_failed函數(shù):
#ifdef USE_FULL_ASSERT //斷言(參考官方)
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
}
#endif
2.STM32中的assert_param
在STM32標(biāo)準(zhǔn)外設(shè)庫,HAL庫中的USE_FULL_ASSERT這個(gè)宏是被屏蔽了的。故程序運(yùn)行#define assert_param(expr) ((void)0)
也就是沒有做任何處理。
我之前提供的例程中,為了不動(dòng)官方代碼,assert_param這個(gè)函數(shù)都是沒有使用的。
3.assert_failed((uint8_t *)__FILE__, __LINE__))
看到這個(gè)函數(shù),就要說下__FILE__和__LINE__這兩個(gè)標(biāo)準(zhǔn)定義。
__LINE__:正在編譯文件的行號(hào)
__FILE__:正在編譯文件的文件名
還不懂的同學(xué),建議參考之前的文章【ANSIC幾種特殊的標(biāo)準(zhǔn)定義(__FILE__、__LINE__、__STDC__···)】。
而上面只是申明,函數(shù)具體的實(shí)現(xiàn)還需要自己實(shí)現(xiàn)。理解了上面兩個(gè)參數(shù),相信大家都會(huì)知道如何實(shí)現(xiàn)了。需要根據(jù)自己項(xiàng)目情況來實(shí)現(xiàn)。常規(guī)舉例:
voidassert_failed(uint8_t* file, uint32_t line)
{
printf("Error code in file:%s,line:%u ",file,line);
}
這條語句在調(diào)及產(chǎn)品出廠之前測試是很有必要的,方便分析問題所在。正式推出版本,不定義USE_FULL_ASSERT這個(gè)宏既可以關(guān)閉了。
-
ST
+關(guān)注
關(guān)注
32文章
1186瀏覽量
132043 -
STM32
+關(guān)注
關(guān)注
2305文章
11118瀏覽量
370929 -
STM8
+關(guān)注
關(guān)注
18文章
393瀏覽量
58511
發(fā)布評(píng)論請先 登錄
GCC開發(fā)工程的模版
深入理解PTP:高精度時(shí)間同步的核心原理
K8s存儲(chǔ)類設(shè)計(jì)與Ceph集成實(shí)戰(zhàn)
SFUD驅(qū)動(dòng)庫實(shí)戰(zhàn)手冊:串行SPI Flash開發(fā)全流程解析
基礎(chǔ)篇3:掌握Python中的條件語句與循環(huán)
深入理解C語言:函數(shù)—編程中的“積木塊”藝術(shù)
深入理解C語言:C語言循環(huán)控制
半導(dǎo)體器件中微量摻雜元素的EDS表征
可靠性測試結(jié)構(gòu)設(shè)計(jì)概述
LPCVD方法在多晶硅制備中的優(yōu)勢與挑戰(zhàn)
HarmonyOS Next V2 @Local 和@Param
在外部中斷中將printf寫入,外部中斷LED可以翻轉(zhuǎn),但串口不可顯示,為什么?
技術(shù)干貨驛站 ▏深入理解C語言:嵌套循環(huán)與循環(huán)控制的底層原理
深入探討Linux系統(tǒng)中的動(dòng)態(tài)鏈接庫機(jī)制
深入理解C語言:循環(huán)語句的應(yīng)用與優(yōu)化技巧

老司機(jī)帶你深入理解ST庫中的 assert_param 語句
評(píng)論