断言assert_param作用

发布于 2014-08-29  1.65k 次阅读


从官方那里下载下来的例程中,使用固件库的每个main.c文件中都有关于这个函数的定义。从这个函数中可以看来,当我们使用函数时,参数不正确时,就会显示出错误所在的文件与行数,而后进入一个死循环中。

关于assert_param的定义可以从stm32f0xx_conf.h文件中查询到。

在STM32的固件库中,很多地方都使用了assert_param()。在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。所谓有效的参数是指满足范围的参数。如果当前的参数不在这个范围内时,assert_param()可以在运行的程序调用这个函数时报告错误,使程序员及时发现错误,而不必等到程序运行结果的错误而大费周折。

这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。

它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。

当你的项目开发成功,使用release模式编译之后,或在stm32f0xx_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。

下面举取STM32中的一个使用断言的例子:

assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));

从断言assert_param()的定义中可以看出,只有当宏定义表达式的值为真时,程序才能正常运行,否则就会报错,所以还要对assert_param()在的参数进行宏定义,

#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))

判断STATE这个参数是否是所有可选择参数中的一个,也就是判断是否在正常参数的范围内。

 


公交车司机终于在众人的指责中将座位让给了老太太