0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么理解Assert中的断言语句?

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-03 14:12 次阅读

1写在前面

有经验的工程师都知道,随着软件版本的迭代,或者需求不断变更,我们的代码就会变得越来越“臃肿”。

在编码的过程中,如果没有注重一些细节,你的代码就可能存在许多隐藏的Bug。

那么,我们如何找出这些隐藏的Bug呢?

今天就说其中的一点:Assert断言。

2关于Assert断言

什么是Assert断言?

编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。

断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。

可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。

同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

---来自百度百科

这里的概念,可能不好理解,简单举一个例子来说明吧。

有这么一个数组和函数:

int Array[5] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5}; int Fun(char i){ return Array[i];}

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

假如这么调用:

int a; a = Fun(8);

很明显,就这么调用,会出错,且我们不容易发现错误在哪里。

但是,假如添加有Assert断言语句,错误就能一下找出来。

3Assert断言实际应用

其实,Assert断言在很多标准的代码中,基本都有。我们还是拿STM32的代码来说明吧。

不管是STM32标准外设库,还是HAL、LL库源代码里面都有Assert断言机制。

不知道大家有没有注意过assert_param函数?


1.拿STM32最常见的GPIO初始化函数为例

A.标准外设库GPIO初始化:

B.HAL库GPIO初始化:

相信大家都看到过STM32库中的参数断言语句,他的作用就是用于检查函数传入参数是否正确。

2.STM32参数断言使能

STM32的assert_param参数断言函数是没有使能的,如下:

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

也就是assert_param不起作用。

如果需要使用,就需要对其使能才行。

A.标准外设库

B.HAL库

道理一样,使能ASSERT,可以手动:

#define USE_FULL_ASSERT 1U

也可以通过STM32CubeMX配置:

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.断言失败处理

断言失败,可根据实际项目需求,做出一定处理。比如:打印错误信息,存储错误日志等。

本文就讲到这里,方法教给大家,需要自己理解并消化其中内容。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814
  • 异常处理
    +关注

    关注

    0

    文章

    14

    浏览量

    7251
  • 断言
    +关注

    关注

    0

    文章

    8

    浏览量

    6657
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

    7136
收藏 人收藏

    评论

    相关推荐

    如何在if和assert做选择

    面的定义可以看到: 如果定义了宏 NDEBUG,那么 assert() 宏将不做什么动作,也就是相当于一条空语句:(void)0;,当在 release 阶段编译代码的时候,都会在编译选项
    发表于 04-08 06:13

    assign语句和always语句的用法

    Assign语句和Always语句是在硬件描述语言(HDL)中常用的两种语句,用于对数字电路建模和设计。Assign语句用于连续赋值,而Always
    的头像 发表于 02-22 16:24 493次阅读

    基于断言的验证简介 – 第 1 部分

    基于断言的验证(ABV)是一种与传统方法相比可以大大减少验证过程的技术.
    的头像 发表于 01-09 09:59 254次阅读
    基于<b class='flag-5'>断言</b>的验证简介 – 第 1 部分

    C语言assert(断言)简介

    assert的功能,条件为真,程序继续执行;如果断言为假(false),则程序终止。
    的头像 发表于 11-17 16:33 652次阅读
    C语言<b class='flag-5'>assert</b>(<b class='flag-5'>断言</b>)简介

    FOR循环语句分析与应用

    FOR循环语句应用比较广泛,在机器人编程、PLC编程、C语言编程中都有应用。能读懂这些程序语句,可以更好地理解机电设备控制原理,为机电设备安装维修工作带来便利。
    的头像 发表于 09-25 17:14 2568次阅读
    FOR循环<b class='flag-5'>语句</b>分析与应用

    Python中什么是语句

    条件判断 语句块 什么是语句块呢? 语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组
    的头像 发表于 09-12 16:41 632次阅读

    何为断言断言的作用有哪些?断言的种类 断言层次结构

    断言主要用来检查仿真过程中存在的时序问题,如果存在异常情况,断言会报警。一般在数字电路设计中都要加入断言断言占整个设计的比例应不少于30%。
    的头像 发表于 08-28 11:16 5544次阅读
    何为<b class='flag-5'>断言</b>?<b class='flag-5'>断言</b>的作用有哪些?<b class='flag-5'>断言</b>的种类 <b class='flag-5'>断言</b>层次结构

    用vivado仿真添加rtl时导致编译不通过如何解决?

    用VCS仿真没问题,用vivado仿真时添加rtl时就出现错误; 出错在rtl里断言语法上(assert property),这会导致编译不通过;该如何解决?
    发表于 08-16 07:47

    解析C语言断言函数的使用

    对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性。简单地讲,断言就是对某种假设条件进行检查。 在 C 语言中,断言被定义为宏的形式(as
    发表于 08-08 09:51 236次阅读
    解析C语言<b class='flag-5'>断言</b>函数的使用

    什么是断言?C语言中断言的语法和用法

    在软件开发过程中,我们经常需要处理各种错误和异常情况。为了提高代码的健壮性和可靠性,我们需要使用一些工具和技术来检测和处理这些问题。本篇博客将深入探讨C语言中断言的使用,帮助读者更好地理解和应用断言,提高代码的质量和可维护性。
    发表于 08-03 10:34 1679次阅读

    C语言中assert的使用

    assert意思是断言,常用在程序的DEBUG版本中。
    发表于 07-21 14:51 518次阅读

    组み込みC言语入门~文法编~

    组み込みC言语入门~文法编~
    发表于 07-04 19:25 0次下载
    组み込みC<b class='flag-5'>言语</b>入门~文法编~

    言语音数据在方言语音识别中的关键作用

    言语音识别是一项重要的技术,它能够将方言语音转化为文字或指令,从而实现对方言用户的理解和响应。而方言语音数据在方言语音识别中起到了关键作用
    的头像 发表于 06-24 10:06 708次阅读

    Verilog中的If语句和case语句介绍

    我们在上一篇文章中已经看到了如何使用程序块(例如 always 块来编写按顺序执行的 verilog 代码。 我们还可以在程序块中使用许多语句来控制在我们的verilog设计中信号赋值的方式
    的头像 发表于 05-11 15:37 3143次阅读
    Verilog中的If<b class='flag-5'>语句</b>和case<b class='flag-5'>语句</b>介绍

    在什么情况下信号量断言会失效呢?

    连接stlink调试的时候发现,485通信线上有大量数据,不是主机发的,不知道从哪里来的,然后单步调试运行一会,会卡在dummy == 0这里 void rt_assert
    发表于 05-11 14:35