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

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

3天内不再提示

为什么项目中的代码需要有Assert断言语句Assert断言的详细资料说明

5RJg_mcuworld 来源:未知 2019-03-30 11:04 次阅读

1写在前面

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

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

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

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

为什么项目中的代码需要有Assert断言语句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.断言失败处理

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

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

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

    关注

    2239

    文章

    10671

    浏览量

    348725
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66746
  • GPIO
    +关注

    关注

    16

    文章

    1133

    浏览量

    50564

原文标题:为什么项目中的代码需要有Assert断言语句?

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中assert的使用

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

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

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

    C语言assert(断言)简介

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

    如何在if和assert中做选择

    assert 就是为了验证有效性,它最大作用就是:在开发阶段,让我们的程序尽可能地 crash。每一次的 crash,都意味着代码中存在着 bug,需要我们去修正。 当我们写下一个 asser
    发表于 04-08 06:13

    断言ASSERT)的用法

    包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下: 1 #include 2 #define NDEBUG 3 #include   用法总结
    发表于 08-23 09:33

    如何在XC8中使用断言的?

    大家好,我正在尝试使用XC8中的断言,但是当我使用“*”时,“断言h”空格main(空隙){BOOL X=0;断言(x= 1);而(1){}}我的程序停止,并且在控制台中不显示任何MsAGAGEM
    发表于 03-26 10:58

    C语言中断言如何去使用

    文章目录1 C语言中断言的使用1.1 处理方式1.2 原型定义1.3 示例代码1 C语言中断言的使用1.1 处理方式如果断言的条件返回错误,则终止程序执行。1.2 原型定义#inclu
    发表于 07-14 08:15

    何为断言断言该怎么使用呢

    存在错误。因此,断言是提高程序可靠性的有效手段。也是开发阶段快速定位问题的一种很好防御式编程方法。在C语言中,断言是一些条件判断的宏。比如C语言内置断言是用标准的 assert 宏实现
    发表于 09-21 14:59

    SystemVerilog断言及其应用

    在介绍SystemVerilog 断言的概念、使用断言的好处、断言的分类、断言的组成以及断言如何被插入到被测设计(DUT)的基础上,本文
    发表于 05-24 16:35 0次下载
    SystemVerilog<b class='flag-5'>断言</b>及其应用

    ASSERT的定义及调试技巧

    C语言中的ASSERT(断言)宏是嵌入式软件开发人员可以使用的最好的调试工具之一。
    的头像 发表于 12-17 11:26 4427次阅读

    怎么理解Assert中的断言语句

    为什么项目中代码需要有Assert断言语句
    的头像 发表于 03-03 14:12 2473次阅读

    老司机带你深入理解ST库中的 assert_param 语句

    老司机带你深入理解ST库中的assert_param语句
    的头像 发表于 03-14 14:52 3453次阅读

    STM32函数库Assert断言机制

    编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序
    发表于 02-08 15:29 2次下载
    STM32函数库<b class='flag-5'>Assert</b><b class='flag-5'>断言</b>机制

    RT-Thread 大会:utest提供的断言方法

    utest提供的断言方法:Utest单元测试框架提供了-系列的assert 宏,用于测试用例判断运行结果。
    的头像 发表于 05-27 16:23 994次阅读
    RT-Thread 大会:utest提供的<b class='flag-5'>断言</b>方法

    防御式编程之断言assert的使用

    防御式编程的重点就是需要防御一些程序未曾预料的错误,这是一种提高软件质量的辅助性方法,断言assert就用于防御式编程,编写代码时,我们总是会做出一些假设,
    的头像 发表于 04-19 11:35 370次阅读