STM_HAL: assert_param 与 assert_failed函数

  • Post author:
  • Post category:其他











assert_param:

定义如下:


#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))


作用:

检测传递给函数的参数是否为

有效的参数


(有效的参数:指满足规定范围的参数,如某个参数的取值范围只能小于3的整数,若给出的参数大于3,则这个assert_param()可在运行的程序调用这个函数时报错,使程序员可及时发现错误,而不必等到程序运行结果的错误而大费周折。)



用于程序开发的时候,调试用的检测语句。默认是不开启的,你可以无视它的存在。但是,当你在调试程序的时候,可以打开这个检测机制,调试完了再关闭。


怎么使assert_param起作用?

查看assert_param的定义,位于stm32fxxx_hal_conf.h文件,它实际上是个宏定义,看它的条件编译语句,当USE_FULL_ASSERT定义后,即可打开assert_param这个参数检测机制。USE_FULL_ASSERT这个宏定义已经在文件中隐掉,我们把它的注释符号去掉即可。


#define USE_FULL_ASSERT    1




如果定义了USE_FULL_ASSERT,就把assert_param定义为一个三目运算的结构,否则,就把assert_param定义为((void)0)。也就是说,你只有定义;饿USE_FULL_ASSERT,assert_param才会起作用,这个作用就是通过一个三目运算结果来判断。



当你应以了USE_FULL_ASSET之后,若立即编译,编译器会报错,提示assert_failed函数没有定义。我们把assert_failed这个函数放到main.c文件中,如下定义:


void assert_failed(uint8_t* file, uint32_t line)

{


printf(“Wrong parameters value: file %s on line %d\r\n”, file, line);

while(1);

}

上面函数的意思:如果参数出错,输出出错的文件名和行号。结果是输出到串口,用串口调试助手可以看到输出结果。注意,编译器Build Output 栏是不会报错的。