还有没上车的吗
马上要开车了
不等了,开始发车
老司机,再稍我一个
车已经发动了
你等下一班车吧
车子运行中,大伙儿坐稳啦!
Ⅰ
库函数中的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这个宏既可以关闭了。
-
ST
+关注
关注
32文章
1193浏览量
132832 -
STM32
+关注
关注
2313文章
11205浏览量
375107 -
STM8
+关注
关注
18文章
393浏览量
58900
发布评论请先 登录
深入解析 ST0500B1WY - RSLW - F LCD 模块:规格与设计要点
深入理解单片机的位数对性能的影响
深入剖析ST72321B系列8位MCU:特性、应用与开发指南
ST72104Gx、ST72215Gx、ST72216Gx、ST72254Gx 8位MCU深度解析
深入解析HUF75321D3ST N - 通道UltraFET功率MOSFET
怎么理解TCP三次握手和四次挥手
深入理解积分型ADC
如何理解直流无刷电机倒相的说法?
怎样理解和调试变频器的转矩提升功能
【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配
深入浅出GMSSL:掌握SM2、SM3、SM4国密算法的高效实践
GCC开发工程的模版
K8s存储类设计与Ceph集成实战
SFUD驱动库实战手册:串行SPI Flash开发全流程解析
老司机带你深入理解ST库中的 assert_param 语句
评论