你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于Assert的内容

[复制链接]
gaosmile 发布时间:2020-7-15 20:21
很多小伙伴都不清楚什么是Assert,今天就再来分享一下关于Assert的内容。
) s( M( b* S) J$ F2 F+ C1 Z4 b& ~( v3 S& ^
1、写在前面$ ^, ]+ ]0 \/ x6 j( S+ K
有经验的工程师都知道,随着软件版本的迭代,或者需求不断变更,我们的代码就会变得越来越“臃肿”。
! J; `: h1 y) `1 X) {在编码的过程中,如果没有注重一些细节,你的代码就可能存在许多隐藏的Bug。
' N$ v- \2 I, o! X3 w3 b3 Y那么,我们如何找出这些隐藏的Bug呢?
0 ?. k2 K% K- V2 }/ Z, \$ U今天就说其中的一点:Assert断言。; }& h, V+ n) {7 v0 ~3 Y- S
( F  \) a7 T" m6 M) n* c9 h/ w
2、关于Assert断言
5 m. X* A! r& L0 T什么是Assert断言?
0 k( |# W8 W# w2 k+ F( _0 x& v编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。: \* k( _$ n/ ^7 n
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。# I& C* b& R* O4 o
可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。
' T' U) ^$ G9 C& O同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。---来自百度百科
& ?1 f3 o2 Y0 Y- N6 p! n! V0 N. i. U. K* O* R% S! X
这里的概念,可能不好理解,简单举一个例子来说明吧。
$ Q" ~  e7 x6 t2 D# b- a2 \有这么一个数组和函数:8 a0 H- s  |% @/ S

  1. / y0 U. J: c- W- y
  2. int Array[5] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5};
    3 [6 p) ?7 _, A( ~  S1 }( b$ z
  3. int Fun(char i)
    # w3 B2 F( C0 Y4 i
  4. {; R' l' V# [' F( Q; Q/ Y9 G( J
  5.     return Array[i];
    # a. [2 F& `$ i* Z
  6. }; H! J  b, o* |9 v/ \# P. D. ^. `# u
复制代码

8 Q0 p$ X8 ^  ^
& D. V, y  i' D- ~  m; X4 u如果我们函数中不加Assert断言语句,你觉得直接调用会这个函数会有风险吗?

- V  M2 J  S+ A3 m  ]5 u& W假如这么调用:" Z! U7 z& f2 b! x# h

  1. , A( ^" O3 |. S& j) ]' x
  2. int a;& m' L7 C1 U1 {; \, B
  3. a = Fun(8);
    ' ^$ f, {7 g9 q/ `/ }: M
复制代码
$ _7 X  y# [- V* |

6 F) a! @$ h" Z7 P; Q: O+ i; n很明显,就这么调用,会出错,且我们不容易发现错误在哪里。$ I7 T4 R2 w! ~
但是,假如添加有Assert断言语句,错误就能一下找出来。, m6 K0 y; u' S) T  W
3Assert断言实际应用其实,Assert断言在很多标准的代码中,基本都有。我们还是拿STM32的代码来说明吧。

! a3 u4 W# L- B) a
不管是STM32标准外设库、还是HAL、LL库源代码里面都有Assert断言机制。9 w4 g1 S7 H% g+ O/ I# o
不知道大家有没有注意过assert_param函数?/ o0 r( {, V, P) ?1 g1 S# U
1.拿STM32最常见的GPIO初始化函数为例A.标准外设库GPIO初始化: 微信图片_20200715201927.jpg
; T2 D1 o/ x! z# f" v% UB.HAL库GPIO初始化: 微信图片_20200715201930.jpg : ?4 |$ d6 h# I
相信大家都看到过STM32库中的参数断言语句,他的作用就是用于检查函数传入参数是否正确。( [5 O. i" v  h  s& L$ ^
2.STM32参数断言使能STM32的assert_param参数断言函数是没有使能的,如下:

( q1 {; h5 n5 K1 b$ P# U
  • #define assert_param(expr) ((void)0)
      o% d. L6 |& M' V# d

    ' Z# |9 y# O; M
也就是assert_param不起作用。$ X* X5 h. g: z* D1 ^& k
如果需要使用,就需要对其使能才行。! D  j+ R# U" z5 G# p
A.标准外设库 微信图片_20200715201924.jpg 1 T1 f4 G" N8 p! h6 {
B.HAL库道理一样,使能ASSERT,可以手动:

0 q9 E. Z/ K% `9 W" m# r
  • #define USE_FULL_ASSERT    1U
    , z; Y. O; _0 n

      y3 `/ |. Y) J* ?2 f, A
也可以通过STM32CubeMX配置:
9 f0 S2 ^; t* R$ p 微信图片_20200715201921.jpg + `9 H6 u: R4 F) H7 N7 c+ T
3.代码大小
. h, @# b2 x5 X& E7 G) M. E; g添加Assert断言之后,代码量肯定要增加,比如:
$ }% q% z& H. j4 c! J4 t0 r不使能assert_param代码量:) `: A' F# I) V( E2 k
Code=5350 RO-data=360 RW-data=16 ZI-data=1152- E) e4 i: T. b: R. U' l: e: Z' @
使能assert_param:$ b9 U; r" c! P
Code=8300 RO-data=362 RW-data=16 ZI-data=1152
# ]9 K( a' w6 p3 [3 s4.断言失败处理断言失败,可根据实际项目需求,做出一定处理。比如:打印错误信息,存储错误日志等。
- }6 o% p, [/ N0 u本文就讲到这里,方法教给大家,需要自己理解并消化其中内容。: d3 a! M1 O  M# ^/ [2 u* Y) M
2 u( h" T+ Q5 N8 V" Q( g0 c1 l, a; p
赞 收藏 评论0 发布时间:2020-7-15 20:21

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版