欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

怎么理解Assert中的斷言語句?

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

1寫在前面

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

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

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

今天就說其中的一點:Assert斷言。

2關(guān)于Assert斷言

什么是Assert斷言?

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

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

可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。

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

---來自百度百科

這里的概念,可能不好理解,簡單舉一個例子來說明吧。

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

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

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

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

int a; a = Fun(8);

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

但是,假如添加有Assert斷言語句,錯誤就能一下找出來。

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

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

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

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


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

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

B.HAL庫GPIO初始化:

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

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

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

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

也就是assert_param不起作用。

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

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

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

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

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

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

    關(guān)注

    30

    文章

    4834

    瀏覽量

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

    關(guān)注

    0

    文章

    14

    瀏覽量

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

    關(guān)注

    0

    文章

    8

    瀏覽量

    6715
  • ASSERT
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7283
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    深入理解C語言:循環(huán)語句的應(yīng)用與優(yōu)化技巧

    在程序設(shè)計,我們常常需要重復(fù)執(zhí)行某一段代碼。為了提高效率和簡化代碼,循環(huán)語句應(yīng)運而生。C語言作為一門經(jīng)典的編程語言,提供了多種循環(huán)控制結(jié)構(gòu),幫助程序員高效地實現(xiàn)重復(fù)操作。掌握循環(huán)語句的使用,不僅
    的頭像 發(fā)表于 12-07 01:11 ?259次閱讀
    深入<b class='flag-5'>理解</b>C語言:循環(huán)<b class='flag-5'>語句</b>的應(yīng)用與優(yōu)化技巧

    TLK1101E的los assert具體什么意思?

    TLK1101E第5引腳LOSL的功能描述是adjusts the LOS assert and de-assert levels。我有兩個問題:1、los assert具體什么意思?2、如何控制
    發(fā)表于 09-20 14:58

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

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

    多線程操作flash導(dǎo)致lld_adv.c 3023斷言失敗怎么解決?

    與flash_operator_task2同時操作了flash, 則概率性的觸發(fā)如下斷言: assert lld_adv.c 3023, param 00000000 00000000 Guru Meditation
    發(fā)表于 06-11 06:12

    KW-2402鉑RTD傳感器的SPICE模型的其中一句LTspice仿真語句是什么意思呢?

    我想問下,.param UNIT=(IF(T1&gt;0,1,0))這句仿真語句,怎么理解呢? 最近在做測溫電路,正好讀到了ADI智庫新出來的一個資料(非常非常好)。看到這個仿真語句
    發(fā)表于 06-04 13:30

    STM8S007老是參數(shù)檢查錯誤進(jìn)入assert_failed()的原因?

    請哪位大俠解答一下,在使用STM8S007和STM8S105K4的時候,經(jīng)過跟蹤發(fā)現(xiàn),調(diào)用一些固件庫函數(shù)時老是會出現(xiàn)參數(shù)檢查錯誤而進(jìn)入到assert_failed()函數(shù),關(guān)鍵是參數(shù)都是庫預(yù)定義的
    發(fā)表于 05-17 06:18

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

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

    如何在if和assert做選擇

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

    鴻蒙TypeScript入門學(xué)習(xí)第6天:【條件語句

    條件語句用于基于不同的條件來執(zhí)行不同的動作。 TypeScript 條件語句是通過一條或多條語句的執(zhí)行結(jié)果(True 或 False)來決定執(zhí)行的代碼塊。
    的頭像 發(fā)表于 04-01 13:51 ?802次閱讀
    鴻蒙TypeScript入門學(xué)習(xí)第6天:【條件<b class='flag-5'>語句</b>】

    使用Keil編譯的時候else里的語句沒有編譯是怎么回事?

    最近遇到了一個編譯問題,我在stm32f4xx_it.c文件的CAN2_RX0_IRQHandler函數(shù)里編寫了一個if——else if ——else語句,但調(diào)試的時候發(fā)現(xiàn)elseif
    發(fā)表于 03-11 06:42

    STM32WB55使用CubeMX生成默認(rèn)Zigbee程序,執(zhí)行時有處斷言過不去的原因?

    STM32WB55使用CubeMX生成默認(rèn)Zigbee程序,執(zhí)行時有處斷言過不去,但是respository的demo正常。
    發(fā)表于 03-11 06:35

    verilogrepeat必須用begin和end嗎

    在Verilog,repeat語句不需要使用begin和end塊。repeat語句是一種循環(huán)控制語句,允許重復(fù)執(zhí)行一個代碼塊指定的次數(shù)。它的一般語法如下: repeat (n) st
    的頭像 發(fā)表于 02-23 10:14 ?1321次閱讀

    請問GPIF狀態(tài)機(jī)的內(nèi)部信號需要延遲才能斷言嗎?

    dma_wm_thn 這樣的過渡觸發(fā)器需要一些周期的延遲才能斷言嗎? 在我的實踐,DMA_WM_THN 觸發(fā)器似乎有 1 個時鐘周期延遲: ? 圖像是我的狀態(tài)機(jī)的一部分,數(shù)據(jù)總線是 32 位
    發(fā)表于 02-23 07:43

    assign語句和always語句的用法

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