0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么理解Assert中的斷言語(yǔ)句?

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-03 14:12 ? 次閱讀

1寫在前面

有經(jīng)驗(yàn)的工程師都知道,隨著軟件版本的迭代,或者需求不斷變更,我們的代碼就會(huì)變得越來越“臃腫”。

在編碼的過程中,如果沒有注重一些細(xì)節(jié),你的代碼就可能存在許多隱藏的Bug。

那么,我們?nèi)绾握页鲞@些隱藏的Bug呢?

今天就說其中的一點(diǎn):Assert斷言。

2關(guān)于Assert斷言

什么是Assert斷言?

編寫代碼時(shí),我們總是會(huì)做出一些假設(shè),斷言就是用于在代碼中捕捉這些假設(shè),可以將斷言看作是異常處理的一種高級(jí)形式。

斷言表示為一些布爾表達(dá)式,程序員相信在程序中的某個(gè)特定點(diǎn)該表達(dá)式值為真。

可以在任何時(shí)候啟用和禁用斷言驗(yàn)證,因此可以在測(cè)試時(shí)啟用斷言,而在部署時(shí)禁用斷言。

同樣,程序投入運(yùn)行后,最終用戶在遇到問題時(shí)可以重新啟用斷言。

---來自百度百科

這里的概念,可能不好理解,簡(jiǎn)單舉一個(gè)例子來說明吧。

有這么一個(gè)數(shù)組和函數(shù):

int Array[5] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5}; int Fun(char i){ return Array[i];}

如果我們函數(shù)中不加Assert斷言語(yǔ)句,你覺得直接調(diào)用會(huì)這個(gè)函數(shù)會(huì)有風(fēng)險(xiǎn)嗎?

假如這么調(diào)用:

int a; a = Fun(8);

很明顯,就這么調(diào)用,會(huì)出錯(cuò),且我們不容易發(fā)現(xiàn)錯(cuò)誤在哪里。

但是,假如添加有Assert斷言語(yǔ)句,錯(cuò)誤就能一下找出來。

3Assert斷言實(shí)際應(yīng)用

其實(shí),Assert斷言在很多標(biāo)準(zhǔn)的代碼中,基本都有。我們還是拿STM32的代碼來說明吧。

不管是STM32標(biāo)準(zhǔn)外設(shè)庫(kù),還是HAL、LL庫(kù)源代碼里面都有Assert斷言機(jī)制。

不知道大家有沒有注意過assert_param函數(shù)?


1.拿STM32最常見的GPIO初始化函數(shù)為例

A.標(biāo)準(zhǔn)外設(shè)庫(kù)GPIO初始化:

B.HAL庫(kù)GPIO初始化:

相信大家都看到過STM32庫(kù)中的參數(shù)斷言語(yǔ)句,他的作用就是用于檢查函數(shù)傳入?yún)?shù)是否正確。

2.STM32參數(shù)斷言使能

STM32的assert_param參數(shù)斷言函數(shù)是沒有使能的,如下:

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

也就是assert_param不起作用。

如果需要使用,就需要對(duì)其使能才行。

A.標(biāo)準(zhǔn)外設(shè)庫(kù)

B.HAL庫(kù)

道理一樣,使能ASSERT,可以手動(dòng):

#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.斷言失敗處理

斷言失敗,可根據(jù)實(shí)際項(xiàng)目需求,做出一定處理。比如:打印錯(cuò)誤信息,存儲(chǔ)錯(cuò)誤日志等。

本文就講到這里,方法教給大家,需要自己理解并消化其中內(nèi)容。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67765
  • 異常處理
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    7260
  • 斷言
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    6668
  • ASSERT
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7190
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    LWIP多線程強(qiáng)烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面要怎么實(shí)現(xiàn)?

    LWIP多線程強(qiáng)烈建議開啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面要怎么實(shí)現(xiàn),之前參考網(wǎng)上代碼,這樣寫,壓力測(cè)試下有概率斷言失敗 extern sys_mutex_t
    發(fā)表于 07-25 06:27

    請(qǐng)問HAL函數(shù)對(duì)Handle有效性的檢查為什么不是用assert_param斷言?

    )); ...... } 以HAL_SPI_Init為例,hspi參數(shù)的檢查并沒有使用assert_param斷言宏,如果是我實(shí)現(xiàn)的話,我會(huì)用assert_param(hspi != NULL)實(shí)現(xiàn)。一般
    發(fā)表于 05-08 07:00

    如何在if和assert做選擇

    面的定義可以看到: 如果定義了宏 NDEBUG,那么 assert() 宏將不做什么動(dòng)作,也就是相當(dāng)于一條空語(yǔ)句:(void)0;,當(dāng)在 release 階段編譯代碼的時(shí)候,都會(huì)在編譯選項(xiàng)
    發(fā)表于 04-08 06:13

    assign語(yǔ)句和always語(yǔ)句的用法

    的用法和功能。 一、Assign語(yǔ)句 Assign語(yǔ)句的定義和語(yǔ)法 Assign語(yǔ)句用于在HDL連續(xù)賦值,它允許在設(shè)計(jì)為信號(hào)或變量分配一
    的頭像 發(fā)表于 02-22 16:24 ?1546次閱讀

    基于斷言的驗(yàn)證簡(jiǎn)介 – 第 1 部分

    基于斷言的驗(yàn)證(ABV)是一種與傳統(tǒng)方法相比可以大大減少驗(yàn)證過程的技術(shù).
    的頭像 發(fā)表于 01-09 09:59 ?461次閱讀
    基于<b class='flag-5'>斷言</b>的驗(yàn)證簡(jiǎn)介 – 第 1 部分

    單片機(jī)if是什么語(yǔ)句

    單片機(jī)的if語(yǔ)句是一種條件語(yǔ)句,用于根據(jù)不同的條件執(zhí)行不同的代碼塊。在程序執(zhí)行過程,條件語(yǔ)句用來決定是否執(zhí)行特定的代碼段。在單片機(jī)編程
    的頭像 發(fā)表于 01-05 14:04 ?1255次閱讀

    單片機(jī)for語(yǔ)句的運(yùn)用

    單片機(jī)的for語(yǔ)句是一種常見的循環(huán)控制結(jié)構(gòu),用于重復(fù)執(zhí)行一段代碼塊,可以簡(jiǎn)化程序的編寫和減少代碼量。本文將詳細(xì)介紹單片機(jī)for語(yǔ)句的運(yùn)用。 一、for
    的頭像 發(fā)表于 01-05 14:02 ?1513次閱讀

    oracle執(zhí)行sql查詢語(yǔ)句的步驟是什么

    Oracle數(shù)據(jù)庫(kù)是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有強(qiáng)大的SQL查詢功能。Oracle執(zhí)行SQL查詢語(yǔ)句的步驟包括編寫SQL語(yǔ)句、解析SQL語(yǔ)句、生成執(zhí)行計(jì)劃、執(zhí)行SQL語(yǔ)句、返回
    的頭像 發(fā)表于 12-06 10:49 ?774次閱讀

    java的switch語(yǔ)句 case的取值

    Java的switch語(yǔ)句是一種用于多重條件判斷的語(yǔ)句,用于根據(jù)不同的條件執(zhí)行不同的代碼塊。在switch語(yǔ)句中,case關(guān)鍵字用來指定不同的取值。 在Java
    的頭像 發(fā)表于 11-30 16:05 ?705次閱讀

    oracle數(shù)據(jù)庫(kù)添加字段語(yǔ)句

    Oracle數(shù)據(jù)庫(kù)添加字段語(yǔ)句是在已有表添加新的列,以擴(kuò)展表的結(jié)構(gòu)和功能。添加字段語(yǔ)句的語(yǔ)法有多種,可以根據(jù)實(shí)際需求選擇不同的語(yǔ)法。下面將詳細(xì)介紹Oracle數(shù)據(jù)庫(kù)添加字段的語(yǔ)法和一些常見的用法
    的頭像 發(fā)表于 11-21 11:37 ?5868次閱讀

    AND2890的LOS Assert Time指標(biāo)如何測(cè)得?

    想看下los assert time和los de-assert time這兩個(gè)參數(shù),但是不知道如何測(cè)得。需要什么儀器?測(cè)試原理如何?哪位能夠指導(dǎo)一下,謝謝。
    發(fā)表于 11-21 06:30

    C語(yǔ)言assert(斷言)簡(jiǎn)介

    assert的功能,條件為真,程序繼續(xù)執(zhí)行;如果斷言為假(false),則程序終止。
    的頭像 發(fā)表于 11-17 16:33 ?973次閱讀
    C語(yǔ)言<b class='flag-5'>assert</b>(<b class='flag-5'>斷言</b>)簡(jiǎn)介

    select語(yǔ)句的基本語(yǔ)法

    SELECT語(yǔ)句是SQL(Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)的一種查詢語(yǔ)句,用于從數(shù)據(jù)庫(kù)檢索數(shù)據(jù)。它是數(shù)據(jù)庫(kù)操作中最常用和基本的
    的頭像 發(fā)表于 11-17 16:23 ?1347次閱讀

    SELECT語(yǔ)句的基本格式

    SELECT語(yǔ)句是SQL中最基本和最重要的語(yǔ)句之一。它被用于從數(shù)據(jù)庫(kù)檢索數(shù)據(jù)。在本文中,我們將詳細(xì)介紹SELECT語(yǔ)句的基本格式和各個(gè)組成部分。 SELECT
    的頭像 發(fā)表于 11-17 15:10 ?2352次閱讀

    FOR循環(huán)語(yǔ)句分析與應(yīng)用

    FOR循環(huán)語(yǔ)句應(yīng)用比較廣泛,在機(jī)器人編程、PLC編程、C語(yǔ)言編程中都有應(yīng)用。能讀懂這些程序語(yǔ)句,可以更好地理解機(jī)電設(shè)備控制原理,為機(jī)電設(shè)備安裝維修工作帶來便利。
    的頭像 發(fā)表于 09-25 17:14 ?2805次閱讀
    FOR循環(huán)<b class='flag-5'>語(yǔ)句</b>分析與應(yīng)用