STM32⼀种参数检查⽤法介绍
STM32 ⼀种参数检查⽤法介绍
assert_param() 是⼀个在代码中很常见的写法,这个函数的功能⼀般是对函数参数的合法性进⾏检查,这⾥以⼀个例⼦进⾏分析:assert_param(IS_GPIO_ALL_PERIPH(GPIOx))
函数的参数是 IS_GPIO_ALL_PERIPH(GPIOx) ,原型为:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB) || \
((PERIPH) == GPIOC) || \
((PERIPH) == GPIOD) || \
((PERIPH) == GPIOE) || \
((PERIPH) == GPIOF) || \
json检查((PERIPH) == GPIOG) || \
((PERIPH) == GPIOH) || \
((PERIPH) == GPIOI) || \
((PERIPH) == GPIOJ) || \
((PERIPH) == GPIOK))
这个宏定义的作⽤就是检查参数PERIPH,判断参数PERIPH是否为GPIOX(A...G)基址中的⼀个,只要有⼀个为真则其值为真,否则为假。由于这个是宏定义,因此并不是在编译的时候进⾏判断上的简化,⽽是将多⾏代码⽤宏定义代替了。
下⾯再看看 assert_param :
assert_param
函数原型如下:
#ifdef  USE_FULL_ASSERT
/**
* @brief  The assert_param macro is used for function's parameters check.
* @param  expr: If expr is false, it calls assert_failed function
*  which reports the name of the source file and the source
*  line number of the call that failed.
*  If expr is true, it returns no value.
* @retval None
*/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT */
这⾥有⼀个判断,如果是FULL ASSERT,则宏定义被展开为: ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) ,否则则被展开为 ((void)0) 。
先看第⼆种:
如果被展开为 ((void)0) ,则相当于什么也没做,那么看第⼀种,如果 expr 为真,则跟第⼆种的处理⼀样,什么也不做,如果 expr 为假,则执⾏断⾔失败 assert_failed((uint8_t *)__FILE__, __LINE__))
既然如果选择了FULL ASSERT,那么就有断⾔失败的可能,因此,这⾥把断⾔失败的函数声明写上,即可避免编译错误。
再看断⾔失败的处理:
void assert_failed(u8* file, u32 line)
官⽅给出的代码如下:
void assert_failed(u8* file, u32line)
{
/* User can add his ownimplementation to report the file name and line number,
ex: printf("Wrong parametersvalue: file %s on line %drn", file, line) */
/* Infinite loop */
while (1) { }
}
这⾥可以使⽤串⼝打印出来,并将程序halt在这⾥。STM32的这种⽤法,可以推⼴⾄⼀般的嵌⼊式APP开发中,在不⽀持⾼级语⾔的场景下,使⽤C语⾔对输⼊参数进⾏检查也是⼀种很好⽤的⼿段。
我们可以在应⽤开发时,建⽴⼀个参数检查的宏定义表,并在编写函数时使⽤上⾯的检查⽅式进⾏检查。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。