Stm32库函数里的断言机制解析
来源:互联网 发布:株洲知明培训学校 编辑:程序博客网 时间:2024/05/29 03:44
Stm32库函数里的断言机制
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 这几个值之间,如果是在范围之外,则在调试的时候会触发断言。 这种断言的叫做动态断言,动态断言是在运行时检查断言。还有一种断言叫做静态断言,静态断言是在编译时检查断言。
0 0
- Stm32库函数里的断言机制解析
- 解析STM32的库函数
- 献给新手:解析STM32的库函数
- stm32库函数FSMC_NORSRAMInit()解析
- stm32库函数GPIO_Init()解析
- stm32库函数GPIO_Init()解析
- STM32的断言机制——函数assert_param()
- STM32 断言的使用
- STM32的库函数
- Stm32调试之assert_param() 断言机制
- STM32库函数SystemInit()的理解
- 【嵌入式】STM32的库函数使用
- c++断言机制的应用
- 断言机制assert_param的使用
- libxml2库函数的解析
- ASSERT(断言)的用法解析
- STM32:STM32库函数配置
- STM32库函数中GPIO_Init的理解
- 对”对象和类“的理解
- hibernate配置报错
- 第十六周项目一验证算法(3)直接选择排序
- Cannot change version of project facet Dynamic web
- ubuntu 龙芯 qt 交叉编译
- Stm32库函数里的断言机制解析
- ZCMU—1125
- Open Source Trading Platforms (Master List)
- 一种新型的APP运营方法--APP个性化安装
- hexo+Travis-ci+github构建自动化博客
- 嵌入式linux开发环境搭建(二)
- SparseArray浅析
- 网页中输出漂亮格式的Php数组神器
- git学习--从本地项目到远程项目(github)