chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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ù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-03 14:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1寫在前面

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

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

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

今天就說(shuō)其中的一點(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)行后,最終用戶在遇到問(wèn)題時(shí)可以重新啟用斷言。

---來(lái)自百度百科

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

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

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

如果我們函數(shù)中不加Assert斷言語(yǔ)句,你覺(jué)得直接調(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ò)誤就能一下找出來(lái)。

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

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

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

不知道大家有沒(méi)有注意過(guò)assert_param函數(shù)?


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

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

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

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

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

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

#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

也可以通過(guò)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ī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4955

    瀏覽量

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

    關(guān)注

    0

    文章

    15

    瀏覽量

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

    關(guān)注

    0

    文章

    8

    瀏覽量

    6858
  • ASSERT
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7642
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    條件的執(zhí)行語(yǔ)句

    條件執(zhí)行語(yǔ)句大多在if語(yǔ)句中使用,也在使用關(guān)系運(yùn)算符(<,==,>等) 或者布爾值表達(dá)式(,!等)計(jì)算復(fù)雜表達(dá)式時(shí)使用。對(duì)于包含函數(shù)調(diào) 用的代碼片段,由于函數(shù)返回值會(huì)被
    發(fā)表于 12-12 08:25

    斷言(Assertion)使用

    斷言(Assertion),斷言用于在程序檢查特定條件是否滿足,如果條件為假,會(huì)觸發(fā)斷言失敗,并輸出相關(guān)信息 #define assert
    發(fā)表于 12-12 07:46

    關(guān)于e203_ifu_litebpu的rsx1xn_rdrf寄存器的清除條件的疑問(wèn)求解

    ~rs1xn_rdrf_r斷言)) 且 ( 當(dāng)前沒(méi)有指令正在執(zhí)行(~jalr_rs1xn_dep斷言) 或 當(dāng)前OITF為空(沒(méi)有流水的多周期指令指令),IR不為空時(shí):IR即將被清除(IR的指令到達(dá)了最后一個(gè)
    發(fā)表于 10-20 10:01

    在使用rt_free釋放內(nèi)存時(shí)觸發(fā)了斷言,怎么解決?

    的, 就是代碼從循環(huán)改成回調(diào), 釋放就斷言了 內(nèi)存使用沒(méi)有問(wèn)題, 里面的內(nèi)容都好好的, 只有釋放錯(cuò)誤 這是斷言內(nèi)容, 這是什么意思
    發(fā)表于 09-29 07:02

    FreeModbus主機(jī)調(diào)試一直斷言錯(cuò)誤是怎么回事?

    發(fā)送數(shù)據(jù)后,xMBMasterRTUReceiveFSM中斷言錯(cuò)誤,但通過(guò)打印查看eSndState值為STATE_M_TX_XMIT eSndState[1] STATE_M_TX_IDLE
    發(fā)表于 09-17 07:15

    在線程刪除時(shí)遇到斷言,是什么原因?qū)е碌模?/a>

    在一個(gè)線程調(diào)用線程刪除函數(shù)刪除另外一個(gè)線程,這2個(gè)線程的優(yōu)先級(jí)是相等的,被刪除的線程也是動(dòng)態(tài)創(chuàng)建的,出現(xiàn)了下面的斷言內(nèi)容,一般是什么情況導(dǎo)致的?堆棧分配不足?刪除的線程和被刪除的線程哪個(gè)堆棧分配
    發(fā)表于 09-12 06:08

    線程超時(shí)函數(shù) assert 失敗是什么原因?qū)е碌?

    最近調(diào)試 gd32h759 遇到了一個(gè)十分奇怪的問(wèn)題,在初步調(diào)通所有的邏輯功能后,發(fā)現(xiàn)系統(tǒng)經(jīng)常會(huì)在運(yùn)行一段時(shí)間后死在一個(gè)奇怪的線程超時(shí)函數(shù) assert 失敗導(dǎo)致卡死。用 cmbacktrace
    發(fā)表于 09-09 06:56

    Unicore標(biāo)準(zhǔn)NEMA語(yǔ)句GSA及說(shuō)明

    本文介紹和芯星通的NEMA語(yǔ)句說(shuō)明。
    的頭像 發(fā)表于 07-16 11:39 ?599次閱讀
    Unicore標(biāo)準(zhǔn)NEMA<b class='flag-5'>語(yǔ)句</b>GSA及說(shuō)明

    基礎(chǔ)篇3:掌握Python的條件語(yǔ)句與循環(huán)

    在Python編程語(yǔ)言中,條件語(yǔ)句和循環(huán)是構(gòu)成復(fù)雜邏輯和數(shù)據(jù)處理的基石。本篇基礎(chǔ)教程將幫助您深入了解Python的條件語(yǔ)句和循環(huán)結(jié)構(gòu),讓您能夠更好地控制程序流程。 條件語(yǔ)句 條件
    發(fā)表于 07-03 16:13

    詳解TIA Portal SCL編程語(yǔ)言中的IF語(yǔ)句

    IF 語(yǔ)句是編程中最基本和最重要的控制結(jié)構(gòu)之一,它的主要作用是根據(jù)條件決定程序的執(zhí)行路徑,IF 語(yǔ)句是編程實(shí)現(xiàn)邏輯判斷和決策的基礎(chǔ)。
    的頭像 發(fā)表于 05-24 15:01 ?1679次閱讀
    詳解TIA Portal SCL編程語(yǔ)言中的IF<b class='flag-5'>語(yǔ)句</b>

    SVA斷言的用法教程

    SVA是System Verilog Assertion的縮寫,即用SV語(yǔ)言來(lái)描述斷言斷言是對(duì)設(shè)計(jì)的屬性的描述,用以檢查設(shè)計(jì)是否按照預(yù)期執(zhí)行。
    的頭像 發(fā)表于 05-15 11:39 ?3058次閱讀
    SVA<b class='flag-5'>斷言</b>的用法教程

    深入理解C語(yǔ)言:C語(yǔ)言循環(huán)控制

    在C語(yǔ)言編程,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循環(huán)控制語(yǔ)句,如break、continue和goto,用于
    的頭像 發(fā)表于 04-29 18:49 ?1904次閱讀
    深入<b class='flag-5'>理解</b>C語(yǔ)言:C語(yǔ)言循環(huán)控制

    FS26和S32K3可以正常喚醒,當(dāng)添加與SJA1110的通信時(shí),喚醒過(guò)程會(huì)卡在斷言錯(cuò)誤處,為什么?

    FS26 和 S32K3 可以正常喚醒,但當(dāng)添加與 SJA1110 的通信時(shí),喚醒過(guò)程會(huì)卡在斷言錯(cuò)誤處: "GMAC_DEV_ASSERT((Bd-&gt;Des3
    發(fā)表于 04-14 08:02

    使用rt_free釋放內(nèi)存時(shí)觸發(fā)了斷言怎么解決?

    代碼從循環(huán)改成回調(diào), 釋放就斷言了 內(nèi)存使用沒(méi)有問(wèn)題, 里面的內(nèi)容都好好的, 只有釋放錯(cuò)誤 這是斷言內(nèi)容, 這是什么意思
    發(fā)表于 03-20 07:21

    如何理解芯片設(shè)計(jì)的IP

    本文主要介紹如何理解芯片設(shè)計(jì)的IP 在芯片設(shè)計(jì),IP(知識(shí)產(chǎn)權(quán)核心,Intellectual Property Core)是指在芯片設(shè)計(jì)采用的、已經(jīng)開(kāi)發(fā)好的功能模塊、設(shè)計(jì)或技術(shù),
    的頭像 發(fā)表于 02-08 10:43 ?2503次閱讀