还有没上车的吗
马上要开车了
不等了,开始发车
老司机,再稍我一个
车已经发动了
你等下一班车吧
车子运行中,大伙儿坐稳啦!
ⅰ
库函数中的assert_param
在stm8、stm32标准外设库,或者hal库的stm8_conf.h、stm32···_conf.h文件中会看见如下一段代码:
/* #define use_full_assert 1 */
#ifdef use_full_assert
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__file__, __line__))
voidassert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif
大概意思就是:如果定义了use_full_assert,则会宏定义:#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__file__, __line__))
相当于是一个条件语句。
此时,还需要我们实现assert_failed函数,如果不实现,则会报错(后面来讲具体如何实现)。
而在其他地方调用情况(如gpio)
void gpio_setbits(gpio_typedef* gpiox, uint16_t gpio_pin)
{
assert_param(is_gpio_all_periph(gpiox));
assert_param(is_gpio_pin(gpio_pin));
gpiox->bsrr = gpio_pin;
}
调用assert_param的主要作用就是检测参数正确与否,即我们所说的断言。
ⅱ
assert_param详情
1.stm8s中的assert_param
细心的朋友会发现,stm8标准外设库stm8s_conf.h中开启了use_full_assert这个宏:
#define use_full_assert (1)
开启use_full_assert这个宏,就意味着要实现assert_failed((uint8_t *)__file__, __line__))这个函数;
那么我就在main.c文件下,按照官方的例程实现了assert_failed函数:
#ifdef use_full_assert //断言(参考官方)
void assert_failed(u8* file, u32 line)
{
while (1)
{
}
}
#endif
2.stm32中的assert_param
在stm32标准外设库,hal库中的use_full_assert这个宏是被屏蔽了的。故程序运行#define assert_param(expr) ((void)0)
也就是没有做任何处理。
我之前提供的例程中,为了不动官方代码,assert_param这个函数都是没有使用的。
3.assert_failed((uint8_t *)__file__, __line__))
看到这个函数,就要说下__file__和__line__这两个标准定义。
__line__:正在编译文件的行号
__file__:正在编译文件的文件名
还不懂的同学,建议参考之前的文章【ansic几种特殊的标准定义(__file__、__line__、__stdc__···)】。
而上面只是申明,函数具体的实现还需要自己实现。理解了上面两个参数,相信大家都会知道如何实现了。需要根据自己项目情况来实现。常规举例:
voidassert_failed(uint8_t* file, uint32_t line)
{
printf(error code in file:%s,line:%u
,file,line);
}
这条语句在调及产品出厂之前测试是很有必要的,方便分析问题所在。正式推出版本,不定义use_full_assert这个宏既可以关闭了。
V2X将如何影响自动驾驶车辆的未来?
回顾TCL将进军半导体设备领域事件
晶圆厂商均已上调8英寸代工报价,2021年涨幅至少达20%
[组图]频率稳定的调频信号传输电路
在微软云机器学习平台Azure ML上利用OpenVINO快速实现AI推理
老司机带你深入理解ST库中的 assert_param 语句
汽车以太网互联技术详解
存在了二十多年的IE浏览器将告别 微软将停止Office对IE浏览器支持
【节能学院】安科瑞农田灌溉收费管理平台
OC48卡的布局以及OC48卡的数字布线
NFC:遥控现实世界
WiMAX 4G功率放大器AWM6433的性能特点及应用
Allegro ACS71x电流传感器集成电路外部磁场干扰控制方案
2016款奥迪A1上手体验评测
MAX6043高精度、高压基准,SOT23封装
苏奥传感2022年净利2.77亿同比增长181.66% 董事长滕飞薪酬又是多少呢?
5G什么时候会覆盖全广东
液体密度计可以测腐蚀性的溶液吗
直流电机更换电刷的方法及注意事项
PCB设计EMI的高速信号走线规则