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

    文章

    4780

    浏览量

    68539
  • 异常处理
    +关注

    关注

    0

    文章

    14

    浏览量

    7269
  • 断言
    +关注

    关注

    0

    文章

    8

    浏览量

    6691
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

    7239
收藏 人收藏

    评论

    相关推荐

    深入理解C语言:循环语句的应用与优化技巧

    在程序设计,我们常常需要重复执行某一段代码。为了提高效率和简化代码,循环语句应运而生。C语言作为一门经典的编程语言,提供了多种循环控制结构,帮助程序员高效地实现重复操作。掌握循环语句的使用,不仅
    的头像 发表于 12-07 01:11 115次阅读
    深入<b class='flag-5'>理解</b>C语言:循环<b class='flag-5'>语句</b>的应用与优化技巧

    TLK1101E的los assert具体什么意思?

    TLK1101E第5引脚LOSL的功能描述是adjusts the LOS assert and de-assert levels。我有两个问题:1、los assert具体什么意思?2、如何控制
    发表于 09-20 14:58

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

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

    KW-2402铂RTD传感器的SPICE模型的其中一句LTspice仿真语句是什么意思呢?

    我想问下,.param UNIT=(IF(T1&gt;0,1,0))这句仿真语句,怎么理解呢? 最近在做测温电路,正好读到了ADI智库新出来的一个资料(非常非常好)。看到这个仿真语句
    发表于 06-04 13:30

    请问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

    鸿蒙TypeScript入门学习第6天:【条件语句

    条件语句用于基于不同的条件来执行不同的动作。 TypeScript 条件语句是通过一条或多条语句的执行结果(True 或 False)来决定执行的代码块。
    的头像 发表于 04-01 13:51 753次阅读
    鸿蒙TypeScript入门学习第6天:【条件<b class='flag-5'>语句</b>】

    STM32WB55使用CubeMX生成默认Zigbee程序,执行时有处断言过不去的原因?

    STM32WB55使用CubeMX生成默认Zigbee程序,执行时有处断言过不去,但是respository的demo正常。
    发表于 03-11 06:35

    verilogrepeat必须用begin和end吗

    在Verilog,repeat语句不需要使用begin和end块。repeat语句是一种循环控制语句,允许重复执行一个代码块指定的次数。它的一般语法如下: repeat (n) st
    的头像 发表于 02-23 10:14 1193次阅读

    请问GPIF状态机的内部信号需要延迟才能断言吗?

    dma_wm_thn 这样的过渡触发器需要一些周期的延迟才能断言吗? 在我的实践,DMA_WM_THN 触发器似乎有 1 个时钟周期延迟:   图像是我的状态机的一部分,数据总线是 32 位
    发表于 02-23 07:43

    assign语句和always语句的用法

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

    深入探讨嵌入式C编程的goto语句

    什么是goto语句? goto 语句被称为 C 语言中的跳转语句。 用于无条件跳转到其他标签。它将控制权转移到程序的其他部分。 goto 语句一般很少使用,因为它使程
    发表于 01-21 10:41 599次阅读
    深入探讨嵌入式C编程的goto<b class='flag-5'>语句</b>

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

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

    单片机if是什么语句

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

    单片机for语句的运用

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