你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于Assert的内容

[复制链接]
gaosmile 发布时间:2020-7-15 20:21
很多小伙伴都不清楚什么是Assert,今天就再来分享一下关于Assert的内容。

1、写在前面
有经验的工程师都知道,随着软件版本的迭代,或者需求不断变更,我们的代码就会变得越来越“臃肿”。
在编码的过程中,如果没有注重一些细节,你的代码就可能存在许多隐藏的Bug。
那么,我们如何找出这些隐藏的Bug呢?
今天就说其中的一点:Assert断言。

2、关于Assert断言
什么是Assert断言?
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。
可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言
同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。---来自百度百科

这里的概念,可能不好理解,简单举一个例子来说明吧。
有这么一个数组和函数:

  1. int Array[5] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5};
  2. int Fun(char i)
  3. {
  4.     return Array[i];
  5. }
复制代码


如果我们函数中不加Assert断言语句,你觉得直接调用会这个函数会有风险吗?

假如这么调用:

  1. int a;
  2. a = Fun(8);
复制代码


很明显,就这么调用,会出错,且我们不容易发现错误在哪里。
但是,假如添加有Assert断言语句,错误就能一下找出来。
3Assert断言实际应用其实,Assert断言在很多标准的代码中,基本都有。我们还是拿STM32的代码来说明吧。

不管是STM32标准外设库、还是HAL、LL库源代码里面都有Assert断言机制。
不知道大家有没有注意过assert_param函数
1.拿STM32最常见的GPIO初始化函数为例A.标准外设库GPIO初始化: 微信图片_20200715201927.jpg
B.HAL库GPIO初始化: 微信图片_20200715201930.jpg
相信大家都看到过STM32库中的参数断言语句,他的作用就是用于检查函数传入参数是否正确
2.STM32参数断言使能STM32的assert_param参数断言函数是没有使能的,如下:

  • #define assert_param(expr) ((void)0)

也就是assert_param不起作用。
如果需要使用,就需要对其使能才行。
A.标准外设库 微信图片_20200715201924.jpg
B.HAL库道理一样,使能ASSERT,可以手动:

  • #define USE_FULL_ASSERT    1U

也可以通过STM32CubeMX配置:
微信图片_20200715201921.jpg
3.代码大小
添加Assert断言之后,代码量肯定要增加,比如:
不使能assert_param代码量:
Code=5350 RO-data=360 RW-data=16 ZI-data=1152
使能assert_param:
Code=8300 RO-data=362 RW-data=16 ZI-data=1152
4.断言失败处理断言失败,可根据实际项目需求,做出一定处理。比如:打印错误信息,存储错误日志等。
本文就讲到这里,方法教给大家,需要自己理解并消化其中内容。

收藏 评论0 发布时间:2020-7-15 20:21

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版