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

    文章

    4907

    浏览量

    71246
  • 异常处理
    +关注

    关注

    0

    文章

    14

    浏览量

    7400
  • 断言
    +关注

    关注

    0

    文章

    8

    浏览量

    6794
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Unicore标准NEMA语句GSA及说明

    本文介绍和芯星通的NEMA语句说明。
    的头像 发表于 07-16 11:39 ?238次阅读
    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 ?754次阅读
    详解TIA Portal SCL编程语言中的IF<b class='flag-5'>语句</b>

    SVA断言的用法教程

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

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

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

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

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

    请问ADS131A04指标的Normalized SNR如何理解

    在ADS131A04手册Normalized SNR在-20dBFS性能最好, 随着输入信号增高反而变差,与通常认为的输入信号越高信噪比越高不同, 按图中理解,随着信号达到满量程0dBFS,噪声比信号增长的更快? 请问这样理解
    发表于 12-05 06:43

    技术干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用

    在编程,条件判断语句是控制程序流程的核心元素之一。它们使得程序能够根据不同的输入和状态,做出相应的决策。特别是在C语言中,条件判断语句的使用极为广泛,涵盖了从简单的if语句到更复杂的
    的头像 发表于 11-09 01:10 ?954次阅读
    技术干货驿站 ▏深入<b class='flag-5'>理解</b>C语言:掌握C语言条件判断,从if到switch的应用

    请问DRC,Energy Filter,Attack Filters ,Decay Filters怎样理解

    请问DRC,Energy Filter,Attack Filters ,Decay Filters怎样理解?设置不同的值起什么不同的作用?
    发表于 10-31 07:31

    LTspice的编程语句应该怎么写?

    有关LTspice电路仿真软件的使用,应该怎么编写一个变压器的语句,尤其是多路输出的,并且这个软件是否支持多路浮动电源输出,就像反激式开关电源那样副边多路浮地? 有关LTspice的软件使用有什么资料推荐,重点是关于编程语句编写的,就像上面那样两个电感的耦合关系那样实现变
    发表于 10-11 19:19

    FPGA Verilog HDL代码如何debug?

    到整个系统断言语句(Assertions):使用 assert 语句来检查特定的条件是否满足。如果不满足,仿真工具会给出相应的提示。 逻辑分析仪:如果在实际的 FPGA 硬件上调
    发表于 09-24 19:16

    TLK1101E的los assert具体什么意思?

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