历史上的今天
今天是: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 这几个值之间,如果是在范围之外,则在调试的时候会触发断言。
这种断言的叫做动态断言,动态断言是在运行时检查断言。还有一种断言叫做静态断言,静态断言是在编译时检查断言。
下一篇:stm32 can通信发送解释
史海拾趣
|
小生最近刚刚开始琢磨WinCE的开发. 一来就使用的是Win32, 感觉入门很难, 但还是愿意继续弄下去. 但是在学习过中有一些疑问, 想请教各位朋友: 1. 很多书上使用的是由空项目来创建程序, 那么现在大家比较推荐使用空项目创建还是用微软的模版生成? ...… 查看全部问答> |
|
这两天看了一些关于SCSI Miniport Driver方面的代码和资料,但是还是有一些不明白的地方, 比如当我写了一个Miniport Driver的时候,那Port Driver是如果来知道这个驱动的存在的吗? 另一个我在看破别人的程序的时候看不出Miniport Driver与特定的设 ...… 查看全部问答> |
|
请问大家嵌入式开发和智能技术的关系?我对人工智能技术很感兴趣,目前是做web方面的程序开发,虽然只要做得好,哪里都可以拿高薪,但我更爱好智能技术,因此想转去做嵌入式开发,觉得那样似乎离智能更近一些。本人爱好研究算法和各种智能技术,觉 ...… 查看全部问答> |
|
要为三星的44BoX的板子的usb和串口写不加载os时类似驱动的程序,(相当于提供一些底层硬件的接口)请问应该看哪方面的资料,以前驱动也没写过,能给一个大致的框架。底层的我只懂一点arm汇编,不知道够不够?好像大部分程序用C,嵌一点汇编就可以了 ...… 查看全部问答> |
|
用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 … 查看全部问答> |
|
这原来是一个小项目,目的是用sht10温湿传感器对室外的温湿度值采集,依靠从机将数据经过无线24l01模块发送到室内主机上,进行显示; 在单独一部单片机上 ...… 查看全部问答> |
|
1。 32768 晶振 老启动不了问题。这简直是开国际玩笑 有那家的MCU或RTC 外接的晶振会启动不了的?2。RTC就必须要是RTC,STM32的RTC那是什么RTC? 人家的RTC 有年,月,日,时,分,秒,毫秒等寄 ...… 查看全部问答> |




