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

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

3天内不再提示

HAL和标准库的Assert断言机制

strongerHuang 来源:strongerHuang 作者:strongerHuang 2022-12-12 10:22 次阅读

偶尔会有读者问:改bug有什么技巧?

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

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

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

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

关于Assert断言

什么是Assert断言?

编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式

断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。

可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言

同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 ---来自百度百科

这里的概念,可能不好理解,简单举一个例子来说明吧。

有这么一个数组和函数:

int Array[5] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5};


int Fun(char i)
{
    return Array[i];
}
如果我们函数中不加Assert断言语句,你觉得直接调用会这个函数会有风险吗? 假如这么调用:
int a;


a = Fun(8);
很明显,就这么调用,会出错,且我们不容易发现错误在哪里。

但是,假如添加有Assert断言语句,错误就能一下找出来。

Assert断言实际应用

其实,Assert断言在很多标准的代码中,基本都有。我们还是拿STM32的代码来说明吧。

不管是STM32标准外设库、还是HAL、LL库源代码里面都有Assert断言机制。

不知道大家有没有注意过assert_param函数

1.拿STM32最常见的GPIO初始化函数为例 A.标准外设库GPIO初始化:

d0db5f92-787c-11ed-8abf-dac502259ad0.jpg

B.HAL库GPIO初始化:

d0f7a79c-787c-11ed-8abf-dac502259ad0.jpg  
相信大家都看到过STM32库中的参数断言语句,他的作用就是用于检查函数传入参数是否正确

2.STM32参数断言使能

STM32的assert_param参数断言函数是没有使能的,如下:

#define assert_param(expr) ((void)0)

也就是assert_param不起作用。

如果需要使用,就需要对其使能才行。

A.标准外设库

d111c67c-787c-11ed-8abf-dac502259ad0.jpg  

B.HAL库

道理一样,使能ASSERT,可以手动:
#define USE_FULL_ASSERT    1U
也可以通过STM32CubeMX配置:

d12657f4-787c-11ed-8abf-dac502259ad0.jpg  
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.断言失败处理

断言失败,可根据实际项目需求,做出一定处理。比如:打印错误信息,存储错误日志等。 本文就讲到这里,具体如何应用实际项目中,还需要大家进一步深入理解其中精髓。

审核编辑:汤梓红

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

    关注

    0

    文章

    31

    浏览量

    7385
  • ASSERT
    +关注

    关注

    0

    文章

    17

    浏览量

    7194
  • HAL
    HAL
    +关注

    关注

    2

    文章

    69

    浏览量

    12543

原文标题:HAL和标准库的Assert断言机制

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中assert的使用

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

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

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

    C语言assert(断言)简介

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

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

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

    HAL标准的原理区别

    HAL的学习HAL标准的原理区别串口通信实验包含的文件区别具体代码区别总结
    发表于 07-29 08:48

    标准HAL有啥区别

    “健康守护者”——STM32标准HAL的比较使用STM32芯片的时候呢,大家可能都喜欢用,什么
    发表于 08-04 08:22

    HAL标准有哪些区别

    什么是HAL标准又是什么?HAL标准
    发表于 10-26 06:54

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

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

    STM32标准改为HAL的程序实现

    标准占绝大多数,自己买的板子跟的资料也一般是标准HAL很少,不过要是使用STM32Cub
    发表于 11-22 11:23 3.4w次阅读

    怎么理解Assert中的断言语句?

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

    STM32Cube HAL中断处理机制 以及回调函数实现原理

    STM32Cube HAL中断处理机制,以及回调函数实现原理
    的头像 发表于 03-03 14:01 1.3w次阅读

    仿标准,对HAL的补充代码

    前言: ST官方从2017年下半年开始就不再维护升级标准,转而推广HAL。到2019年,HAL
    发表于 11-29 11:36 30次下载
    仿<b class='flag-5'>标准</b><b class='flag-5'>库</b>,对<b class='flag-5'>HAL</b><b class='flag-5'>库</b>的补充代码

    STM32函数Assert断言机制

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

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

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

    STM32 HAL的功能和使用方法 STM32 HAL标准的区别

    和可维护性,从而节省开发成本和时间。STM32 HAL是STM32系列芯片的HAL,由ST公司提供和维护。下面将介绍STM32 HAL
    发表于 08-08 18:21 3740次阅读