老司机带你深入理解ST库中的(assert_param_语句)

还有其他人没有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,可以关闭。