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

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

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

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

    关注

    30

    文章

    4637

    浏览量

    67623
  • 异常处理
    +关注

    关注

    0

    文章

    14

    浏览量

    7257
  • 断言
    +关注

    关注

    0

    文章

    8

    浏览量

    6667
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

    7182
收藏 人收藏

    评论

    相关推荐

    LWIP多线程强烈建议开启LWIP_ASSERT_CORE_LOCKED宏,这个在RTT里面要怎么实现?

    LWIP多线程强烈建议开启LWIP_ ASSERT_CORE_LOCKED宏,这个在RTT里面要怎么实现,之前参考网上代码,这样写,压力测试下有概率 断言失败 extern sys_mutex_t
    发表于07-25 06:27

    请问HAL函数对Handle有效性的检查为什么不是用assert_param断言

    )); ...... } 以HAL_SPI_Init为例,hspi参数的检查并没有使用 assert_param 断言宏,如果是我实现的话,我会用 assert_param(hspi != NULL)实现。一般
    发表于05-08 07:00

    如何在if和assert做选择

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

    assign语句和always语句的用法

    的用法和功能。 一、Assign 语句Assign 语句的定义和语法 Assign 语句用于在HDL 连续赋值,它允许在设计 为信号或变量分配一
    的头像 发表于02-22 16:24 1295次阅读

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

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

    单片机if是什么语句

    单片机 的if 语句是一种条件 语句,用于根据不同的条件执行不同的代码块。在程序执行过程 ,条件 语句用来决定是否执行特定的代码段。在单片机编程
    的头像 发表于01-05 14:04 1148次阅读

    单片机for语句的运用

    单片机 的for 语句是一种常见的循环控制结构,用于重复执行一段代码块,可以简化程序的编写和减少代码量。本文将详细介绍单片机 for 语句的运用。 一、for
    的头像 发表于01-05 14:02 1258次阅读

    java的switch语句case的取值

    Java 的switch 语句是一种用于多重条件判断的 语句,用于根据不同的条件执行不同的代码块。在switch 语句中,case关键字用来指定不同的取值。 在Java
    的头像 发表于11-30 16:05 608次阅读

    C语言assert(断言)简介

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

    select语句的基本语法

    SELECT 语句是SQL(Structured Query Language,结构化查询语言) 的一种查询 语句,用于从数据库 检索数据。它是数据库操作中最常用和基本的
    的头像 发表于11-17 16:23 1208次阅读

    FOR循环语句分析与应用

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

    Rust的 match语句用法

    执行不同的代码,这在处理复杂的逻辑时非常有用。在本教程 ,我们将深入了解 Rust 的 match 语句,包括基础用法、进阶用法和实践经验等方面。 基础用法 match 语句是 Rust
    的头像 发表于09-19 17:08 768次阅读

    Python什么是语句

    。Python将一个tab字符解释为到下一个tab字符位置的移动,而一个tab字符位置为8个空格,但是标准且推荐的方式是只用空格,尤其是在每个缩进需要4个空格的时候。 在Python ,英文版冒号(:)用来标识 语句块的开始,块
    的头像 发表于09-12 16:41 808次阅读

    程序卡在rt_assert_handler,main线程都没有进入是为什么?

    程序卡住在rt_ assert_handler ,main线程都没有进入,在启动文件debug发现是板级初始化函数就卡住了,根据网上debug查找定位,断点打在if (rt_ assert
    发表于09-03 11:01

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

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