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 栏是不会报错的。