
还有其他人没有don’不要上车。
它就要开车了。
等等,启动火车。
老司机,再帮我一把。
汽车已经启动了。
等待下一辆公共汽车。
车在跑,大家坐稳了!
库中的Assert_param
在STM8、STM32标准外设库中,或者HAL库的文件stm8_conf.h和stm32 _conf.h中,会看到如下代码:
#ifdef USE_FULL_ASSERT
# define assert _ param(expr)((expr)?(void)0:assert _ failed((uint 8 _ t *)_ _ FILE _ _,__LINE__))
voidassert_failed(uint8_t*文件,uint32_t行);
#否则
# define assert _ param(expr)((void)0)
#endif
大概意思是:如果定义了USE_FULL_ASSERT,那就是宏定义:# define ASSERT _ param(expr)((expr)?(void)0:assert _ failed((uint 8 _ t *)_ _ FILE _ _,__LINE__))
它相当于一个条件语句。
此时,我们仍然需要实现assert_failed函数。如果没有,我们会报错(后面怎么实现)。
而该情况在别处被调用(例如GPIO)
void GPIO _ set bits(GPIO _ TypeDef * GPIOx,uint16_t GPIO_Pin)
{
assert _ param(IS _ GPIO _ ALL _ peri ph(GPIOx));
assert _ param(IS _ GPIO _ PIN(GPIO _ PIN));
GPIOx-BSRR=GPIO _ Pin;
}
调用assert_param的主要作用是检查参数是否正确,也就是我们所说的断言。
Assert_param详细信息
1.1中的assert_param。STM8S
细心的朋友会发现,STM8标准外设库stm8s_conf.h中打开了宏USE_FULL_ASSERT:
#define USE_FULL_ASSERT (1)
打开宏USE_FULL_ASSERT意味着要实现函数ASSERT _ failed((uint 8 _ t *)_ _ file _ _,_ _ line _ _));
然后我按照官方的套路在main.c文件下实现了assert_failed函数:
#ifdef USE_FULL_ASSERT //assert(参考官方)
void assert_failed(u8*文件,u32行)
{
while (1)
{
}
}
#endif
2.assert_param in 2。STM32
STM32标准外设库中,HAL库中的USE_FULL_ASSERT宏被阻塞。因此,程序运行# define assert _ param(expr)((void)0)
也就是说,什么都没做。
在我之前提供的例程中,为了不动官方代码,没有使用assert_param函数。
3 . assert _ failed((uint 8 _ t *)_ _ FILE _ _,__LINE__))
看到这个函数,就不得不说说两个标准定义__FILE__和__LINE__。
__LINE__:正在编译的文件的行号。
__FILE__:正在编译的文件的文件名。
你们当中那些还不看不懂,建议你参考上一篇文章【ANSIC的几种特殊标准定义(__FILE__,__LINE__,_ _ stdc _ _)】。
以上只是陈述了功能的具体实现需要自己实现。知道了以上两个参数,相信大家就知道怎么实现了。根据自己的项目情况。一般示例:
voidassert_failed(uint8_t*文件,uint32_t行)
{
printf(文件中的错误代码:%s,行:% u ,文件,行);
}
这种说法是产品出厂前测试所必需的,便于分析问题。正式版,没有定义USE_FULL_ASSERT,可以关闭。









