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
原创粉丝点击