当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。 #define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
第1行,宏定义常量USE_FULL_ASSERT的值为1 第14行,是一个宏定义assert_param(expr),通过一个条件判断语句,如果表达式expr的值为真,则assert_param(expr)返回(void)0,如果表达式expr的值为假,则assert_param(expr)返回assert_failed((uint8_t *)__FILE__, __LINE__)。 第16行,函数声明void assert_failed...
进入assert_param();函数观察 #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 就会执行这个函数assert_failed((uint8_t *)__FILE__, __LINE__),我们解释一下这个函数是干什么的,这个函数是用户自己发挥的,想在这个函数里面干什么就干什么,它的...
expr 是要检查的表达式。 ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) 是一个三元运算符表达式。如果 expr 为真(非零),则执行 (void)0(即什么也不做)。如果 expr 为假(零),则调用 assert_failed 函数,并传递当前文件名(使用 __FILE__ 宏)和行号(使用 __LINE__ ...
判定expr是不是0(或者空),如果不为0或空,返回0,;如果为0或空,那么调用assert_failed函数(应该是终止程序,并打印文件名和行号)__FILE__, __LINE__这两个宏是表示当前所在的文件名和行号 谢谢采纳
出处 expr命令为Linux中的命令,一般用于整数值计算,但也可用于字符串操作。使用权限 所有使用者格式expr argument operator argument 参数说明 argument:为第一个参数 operator:为操作运算符 argument:为第二个参数
assert_param(expr)等效于((void)0),即如下代码: #define assert_param(expr) ((void)0) 最后再做个总结: 1、stm32f10x_conf.h这个文件包含了两大 keil报错锦集 。嗯? 那么会不会是在KEIL中定义的? 果然是在这里定义的,最后添加这个宏解决了 总结: 1. 添加stm32f10x_conf.h文件在你的工程中 放在...
#define assert_param(expr) ((void)0) #endif 这是一个预编译文件,若是定义了USE_FULL_ASSERT这个文件,则执行后面的文件,我们在程序中一般都没什么定义,即执行后面这个语句((void)0),这个语句不用多想,没有定义USE_FULL_ASSERT就是什么也不执行。说的明白点,对上面的那个语句IS_GPIO_ALL_PERIPH(GPIOx)不...
如果没定义USE_FULL_ASSERT,那么就会定义#define assert_param(expr) ((void)0),这是为什么呢,是因为用户在代码调试阶段很可能会输入错误的参数而出现错误,一般这种错误不会察觉到,所以当我们想检查这种错误的时候就定义USE_FULL_ASSERT,当我们完成工程项目开始投入生产以后,代码肯定是没有这方面的错误了,我们不需要...
如果没定义USE_FULL_ASSERT,那么就会定义#define assert_param(expr) ((void)0),这是为什么呢,是因为用户在代码调试阶段很可能会输入错误的参数而出现错误,一般这种错误不会察觉到,所以当我们想检查这种错误的时候就定义USE_FULL_ASSERT,当我们完成工程项目开始投入生产以后,代码肯定是没有这方面的错误了,我们不需要...