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

    文章

    4940

    浏览量

    73116
  • 异常处理
    +关注

    关注

    0

    文章

    15

    浏览量

    7448
  • 断言
    +关注

    关注

    0

    文章

    8

    浏览量

    6850
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

    7622
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    求助,关于C代码的printf打印的疑问求解

    在使用E203 testbench执行附带的benchmark测试用例时候,得到如下打印信息: CPU验证小白一枚,有个问题不是很理解:黄色框框内的字符看起来应该是C代码的printf语句
    发表于 11-10 07:54

    关于e203_ifu_litebpu的rsx1xn_rdrf寄存器的清除条件的疑问求解

    ~rs1xn_rdrf_r断言)) 且 ( 当前没有指令正在执行(~jalr_rs1xn_dep断言) 或 当前OITF为空(没有流水的多周期指令指令),IR不为空时:IR即将被清除(IR的指令到达了最后一个
    发表于 10-20 10:01

    在使用rt_free释放内存时触发了断言,怎么解决?

    的, 就是代码从循环改成回调, 释放就断言了 内存使用没有问题, 里面的内容都好好的, 只有释放错误 这是断言内容, 这是什么意思
    发表于 09-29 07:02

    FreeModbus主机调试一直断言错误是怎么回事?

    发送数据后,xMBMasterRTUReceiveFSM中断言错误,但通过打印查看eSndState值为STATE_M_TX_XMIT eSndState[1] STATE_M_TX_IDLE
    发表于 09-17 07:15

    在线程删除时遇到断言,是什么原因导致的?

    在一个线程调用线程删除函数删除另外一个线程,这2个线程的优先级是相等的,被删除的线程也是动态创建的,出现了下面的断言内容,一般是什么情况导致的?堆栈分配不足?删除的线程和被删除的线程哪个堆栈分配
    发表于 09-12 06:08

    线程超时函数 assert 失败是什么原因导致的?

    最近调试 gd32h759 遇到了一个十分奇怪的问题,在初步调通所有的逻辑功能后,发现系统经常会在运行一段时间后死在一个奇怪的线程超时函数 assert 失败导致卡死。用 cmbacktrace
    发表于 09-09 06:56

    Unicore标准NEMA语句GSA及说明

    本文介绍和芯星通的NEMA语句说明。
    的头像 发表于 07-16 11:39 479次阅读
    Unicore标准NEMA<b class='flag-5'>语句</b>GSA及说明

    基础篇3:掌握Python的条件语句与循环

    在Python编程语言中,条件语句和循环是构成复杂逻辑和数据处理的基石。本篇基础教程将帮助您深入了解Python的条件语句和循环结构,让您能够更好地控制程序流程。 条件语句 条件
    发表于 07-03 16:13

    详解TIA Portal SCL编程语言中的IF语句

    IF 语句是编程中最基本和最重要的控制结构之一,它的主要作用是根据条件决定程序的执行路径,IF 语句是编程实现逻辑判断和决策的基础。
    的头像 发表于 05-24 15:01 1427次阅读
    详解TIA Portal SCL编程语言中的IF<b class='flag-5'>语句</b>

    SVA断言的用法教程

    SVA是System Verilog Assertion的缩写,即用SV语言来描述断言断言是对设计的属性的描述,用以检查设计是否按照预期执行。
    的头像 发表于 05-15 11:39 2662次阅读
    SVA<b class='flag-5'>断言</b>的用法教程

    深入理解C语言:C语言循环控制

    在C语言编程,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和goto,用于
    的头像 发表于 04-29 18:49 1728次阅读
    深入<b class='flag-5'>理解</b>C语言:C语言循环控制

    FS26和S32K3可以正常唤醒,当添加与SJA1110的通信时,唤醒过程会卡在断言错误处,为什么?

    FS26 和 S32K3 可以正常唤醒,但当添加与 SJA1110 的通信时,唤醒过程会卡在断言错误处: "GMAC_DEV_ASSERT((Bd-&gt;Des3
    发表于 04-14 08:02

    使用rt_free释放内存时触发了断言怎么解决?

    代码从循环改成回调, 释放就断言了 内存使用没有问题, 里面的内容都好好的, 只有释放错误 这是断言内容, 这是什么意思
    发表于 03-20 07:21

    如何理解芯片设计的IP

    本文主要介绍如何理解芯片设计的IP 在芯片设计,IP(知识产权核心,Intellectual Property Core)是指在芯片设计采用的、已经开发好的功能模块、设计或技术,
    的头像 发表于 02-08 10:43 2064次阅读

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

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