历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2019年01月14日 | Stm32库函数里的断言机制解析

2019-01-14 来源:eefocus

assert_param 在STM32的HAL库函数中的函数中随处可见。那么它的作用是什么呢?

  

首先看一个它使用的地方:


  

这里的作用很明显,是对函数输入的参数进行检查。那么它检查的机制是如何实现的呢?

 

看下assert_param 定义的地方,在定义了宏 USE_FULL_ASSERT 的时候,assert_param 才起作用,否则 assert_param 就背替换成 ((void)0U) ,会被编译器优化掉的,不会产生实际运行的代码。所以我们可以在编写和测试代码时,设置 USE_FULL_ASSERT 这个宏,打开断言的功能,方便我们尽快的调试和定位错误。在 Release 版的时候可以关闭这个宏,关闭断言功能,以节省系统资源。



在定义了 USE_FULL_ASSERT 宏的时候,如果宏参数 expr 不为真,那么则调用 assert_failed 函数,否则就是 ((void)0U)  。


那么看下 assert_failed 函数的原型。这个函数是一个死循环,在循环之前用户可以添加相应的函数来输出提示信息(例如:打印触发断言的文件名和代码行号),这样就可以根据精确的定位触发断言的代码位置,从而精确的调试BUG。


在调试的时候,一般在 assert_failed 的循环里面打断点,一旦程序运行到这里的断点则说明有断言被触发,然后就可以根据获取的文件名和行号精确地定位断言触发的位置。


看到这里再回到第一个问题,这几行代码如何做到对输入的参数进行检查。

    


以第一个参数 GPIOx 为例,

    assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));

 

由上面的分析我们知道,如果assert_param()括号中的参数不为真,那么就会触发断言。那么 IS_GPIO_ALL_INSTANCE 就肯定是对 GPIOx的范围做限定的判断了。由下面的代码可以得知,输入的参数 GPIOx 被限定在了 GPIOA、GPIOB、GPIOC、GPIOH 这几个值之间,如果是在范围之外,则在调试的时候会触发断言。


这种断言的叫做动态断言,动态断言是在运行时检查断言。还有一种断言叫做静态断言,静态断言是在编译时检查断言。

推荐阅读

史海拾趣

Cableform Inc公司的发展小趣事

随着全球化趋势的加速推进,Cableform Inc公司开始实施全球化战略。公司在全球范围内设立了多个分支机构和研发中心,加强了与国际同行的合作与交流。同时,公司还积极参与国际展览和技术研讨会等活动,展示了其最新的技术成果和产品应用。这些举措不仅提升了公司在国际市场的知名度和影响力,也为公司的长期发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了Cableform Inc公司可能经历的一些重要发展阶段和关键事件。当然,实际的发展过程可能更加复杂和多变,但无论如何,这些故事都展现了公司在电子行业中的坚韧不拔和不断进取的精神。

Anderson Power Products公司的发展小趣事

2012年,对于Cableform Inc来说是一个重要的转折点。这一年,公司成功加入了HUBBELL系列,与Hubbell工业控制有限公司建立了战略合作关系。这一合作使得Cableform Inc能够借助Hubbell的品牌影响力和市场渠道,进一步拓展业务范围,提升市场地位。同时,通过与Hubbell的技术交流和资源共享,Cableform Inc在技术创新和产品升级方面也取得了显著进展。

GREEGOO公司的发展小趣事
加大时钟信号线路的电线直径,降低线路的电阻和电容,从而减少信号的衰减。
ENPIRION公司的发展小趣事

在经历了几年的快速发展后,ENPIRION公司被Altera公司收购。这一收购标志着ENPIRION公司进入了一个新的发展阶段。在Altera公司的支持下,ENPIRION公司得以继续扩大其研发和生产能力,推出更多创新的产品和服务。同时,随着人工智能、物联网和大数据技术的不断发展,ENPIRION公司也积极探索新的应用领域和市场机会,为其未来发展奠定了坚实的基础。

以上五个故事概述了ENPIRION公司在电子行业中的发展历程和关键里程碑。通过这些故事,我们可以看到ENPIRION公司凭借技术创新、市场扩展和合作伙伴关系等关键因素取得了显著的成功。

芯佰微(Corebai)公司的发展小趣事

芯佰微非常重视技术研发和专利积累。公司拥有一支高素质的研发团队,不断投入资源进行新技术和新产品的研发。同时,芯佰微也积极申请各类专利,保护自己的技术成果。经过多年的积累,芯佰微已经成功申请并获得了数十项专利,这些专利不仅提升了公司的技术实力,也为公司的未来发展提供了有力保障。

Harbour Industries公司的发展小趣事

背景:近年来,随着环保意识的提高和可持续发展理念的普及,电子行业也开始向绿色化、低碳化方向发展。Handok积极响应这一趋势,将绿色可持续发展作为公司的重要战略之一。

发展:Handok加大了对环保技术的研发投入,推出了一系列绿色电子产品和解决方案。同时,公司还优化了生产流程和管理体系,实现了资源的高效利用和废弃物的减量化处理。

影响:Handok的绿色可持续发展战略不仅赢得了市场的广泛认可,还为公司树立了良好的社会形象。此外,这一战略还有助于公司在未来更加激烈的市场竞争中保持领先地位。

问答坊 | AI 解惑

[求助]关于开发的一些技巧

小生最近刚刚开始琢磨WinCE的开发. 一来就使用的是Win32, 感觉入门很难, 但还是愿意继续弄下去. 但是在学习过中有一些疑问, 想请教各位朋友: 1. 很多书上使用的是由空项目来创建程序, 那么现在大家比较推荐使用空项目创建还是用微软的模版生成? ...…

查看全部问答>

EVC下如何加载JPEG图片文件?

EVC下如何加载JPEG图片文件,并且控制图片定位,大小? 有没有相关的库?…

查看全部问答>

关于SCSI Miniport Driver的问题

这两天看了一些关于SCSI Miniport Driver方面的代码和资料,但是还是有一些不明白的地方, 比如当我写了一个Miniport Driver的时候,那Port Driver是如果来知道这个驱动的存在的吗? 另一个我在看破别人的程序的时候看不出Miniport Driver与特定的设 ...…

查看全部问答>

请问大家嵌入式开发和智能技术的关系

请问大家嵌入式开发和智能技术的关系?我对人工智能技术很感兴趣,目前是做web方面的程序开发,虽然只要做得好,哪里都可以拿高薪,但我更爱好智能技术,因此想转去做嵌入式开发,觉得那样似乎离智能更近一些。本人爱好研究算法和各种智能技术,觉 ...…

查看全部问答>

有关编写嵌入式类似驱动的程序

要为三星的44BoX的板子的usb和串口写不加载os时类似驱动的程序,(相当于提供一些底层硬件的接口)请问应该看哪方面的资料,以前驱动也没写过,能给一个大致的框架。底层的我只懂一点arm汇编,不知道够不够?好像大部分程序用C,嵌一点汇编就可以了 ...…

查看全部问答>

EVC4.0 出错自动退出

用EVC4.0写基于PocketPC 2003 的MFC Dialog程序。当向界面添加控件并保存时。老提示出错需要用VS2005调试。(本机也装了vs2005)调试的时候老是说访问冲突。下面是个例子:     Evc.exe 中的 0x7c921010 处未处理的异常: 0xC0000005: 读 ...…

查看全部问答>

Using the infinite-gain, MFB filter topology in fully differential

本帖最后由 dontium 于 2015-1-23 13:38 编辑  Using the infinite-gain, MFB filter topology in fully differential active filters …

查看全部问答>

基于ATmega16的温湿测量仪

        这原来是一个小项目,目的是用sht10温湿传感器对室外的温湿度值采集,依靠从机将数据经过无线24l01模块发送到室内主机上,进行显示;         在单独一部单片机上 ...…

查看全部问答>

STM32RTC应该要改进

1。 32768  晶振 老启动不了问题。这简直是开国际玩笑  有那家的MCU或RTC 外接的晶振会启动不了的?2。RTC就必须要是RTC,STM32的RTC那是什么RTC? 人家的RTC 有年,月,日,时,分,秒,毫秒等寄 ...…

查看全部问答>