0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

老司机带你深入理解ST库中的 assert_param 语句

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-14 14:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

还有没上车的吗

马上要开车了

不等了,开始发车

老司机,再稍我一个

车已经发动了

你等下一班车吧

车子运行中,大伙儿坐稳啦!

库函数中的assert_param

STM8STM32标准外设库,或者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
    ST
    +关注

    关注

    32

    文章

    1193

    浏览量

    132832
  • STM32
    +关注

    关注

    2313

    文章

    11205

    浏览量

    375107
  • STM8
    +关注

    关注

    18

    文章

    393

    浏览量

    58900
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析 ST0500B1WY - RSLW - F LCD 模块:规格与设计要点

    深入解析 ST0500B1WY - RSLW - F LCD 模块:规格与设计要点 在电子设备的设计,LCD 模块是关键的显示部件,其性能和规格直接影响到产品的显示效果和用户体验。今天,我们就来
    的头像 发表于 05-09 14:40 107次阅读

    深入理解单片机的位数对性能的影响

    设备也能在低功耗模式下有效运行。 64位单片机:虽然提供最高的性能,但也是能耗最大的。它们通常用于桌面计算机和服务器等不太在意功耗的应用。 五、 成本 8位单片机:由于结构简单,制造成
    发表于 04-27 15:05

    深入剖析ST72321B系列8位MCU:特性、应用与开发指南

    深入剖析ST72321B系列8位MCU:特性、应用与开发指南 在电子工程师的日常工作,选择合适的微控制器(MCU)是项目成功的关键。今天,我们将聚焦于ST72321BRx、
    的头像 发表于 04-16 12:55 255次阅读

    ST72104Gx、ST72215Gx、ST72216Gx、ST72254Gx 8位MCU深度解析

    72215Gx、ST72216Gx和ST72254Gx这一系列8位MCU,凭借其丰富的功能和出色的性能,在众多应用场景得到了广泛应用。今天,我们就来深入剖析这几款MCU的特性、功能及
    的头像 发表于 04-16 12:40 535次阅读

    深入解析HUF75321D3ST N - 通道UltraFET功率MOSFET

    深入解析HUF75321D3ST N - 通道UltraFET功率MOSFET 一、引言 在电子设计领域,功率MOSFET是至关重要的元件,广泛应用于各种电源管理和功率转换电路。今天我们要
    的头像 发表于 04-14 15:40 166次阅读

    怎么理解TCP三次握手和四次挥手

    作为运维工程师,无论是排查网络故障、分析日志,还是配置负载均衡器,都需要对 TCP 协议有深入理解。很多"疑难杂症"的根源,往往在于对 TCP 状态转换和连接管理理解不够透彻。
    的头像 发表于 04-10 16:42 880次阅读

    深入理解积分型ADC

    深入理解积分型ADC 一、引言 作为电子工程师,我们在设计中常常需要将模拟信号转换为数字信号,而积分型模数转换器(ADCs)就是实现这一功能的重要手段之一。积分型ADC能够提供高分辨率的模数转换,并
    的头像 发表于 04-02 09:15 865次阅读

    如何理解直流无刷电机倒相的说法?

    直流无刷电机(BLDC)的“倒相”是电机控制领域的关键概念,其本质是通过电子换相替代传统有刷电机的机械换相,实现高效、精准的转矩控制。要深入理解这一说法,需从工作原理、控制逻辑及技术实现三个维度展开分析。
    的头像 发表于 03-16 17:31 752次阅读

    怎样理解和调试变频器的转矩提升功能

    变频器作为现代工业控制不可或缺的核心设备,其转矩提升功能直接关系到电机启动性能、负载适应能力以及系统能效优化。这一功能的合理设置,既是工程师调试经验的体现,也是实现设备高效运行的关键技术环节。要深入理解转矩提升的本质,需从原理出发,结合应用场景,掌握其调试方法论。
    的头像 发表于 02-28 16:57 722次阅读
    怎样<b class='flag-5'>理解</b>和调试变频器的转矩提升功能

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配

    每个内存地址是虚拟的,不是直接指向RAM的任何地址。当用户访问内存的存储单元时,都会进行地址转换以匹配相应的物理内存。书籍的第10章讨论了五个主题,对Linux内核内存分配进行详细讲解。 接着
    发表于 01-16 20:05

    深入浅出GMSSL:掌握SM2、SM3、SM4国密算法的高效实践

    带你从零开始,深入理解这三大核心算法在GMSSL的高效使用方式,帮助你在实际项目中快速落地国密安全方案。 本文将以通信定位二合一系列Air780EGH核心板为例,带你快速上手GMS
    的头像 发表于 12-12 18:20 1120次阅读
    <b class='flag-5'>深入</b>浅出GMSSL:掌握SM2、SM3、SM4国密算法的高效实践

    GCC开发工程的模版

    line number * where the assert_param error has occurred. * @param file: pointer to the source file
    发表于 11-28 08:15

    K8s存储类设计与Ceph集成实战

    在云原生时代,存储是制约应用性能的关键瓶颈。本文将带你深入理解K8s存储类的设计原理,并手把手实现与Ceph的完美集成,让你的集群存储性能提升300%!
    的头像 发表于 08-22 11:50 1198次阅读

    SFUD驱动实战手册:串行SPI Flash开发全流程解析

    针对嵌入式系统SPI Flash的多样化需求,SFUD提供了灵活且通用的解决方案。本文将从环境配置、初始化、基本操作到高级特性,完整展示SFUD的应用流程,并通过具体示例帮助开
    的头像 发表于 07-29 13:19 903次阅读
    SFUD驱动<b class='flag-5'>库</b>实战手册:串行SPI Flash开发全流程解析

    基础篇3:掌握Python的条件语句与循环

    在Python编程语言中,条件语句和循环是构成复杂逻辑和数据处理的基石。本篇基础教程将帮助您深入了解Python的条件语句和循环结构,让您能够更好地控制程序流程。 条件
    发表于 07-03 16:13