色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是斷言函數呢?斷言函數在調試中的應用

冬至子 ? 來源:聊點嵌入式 ? 作者:聊點嵌入式 ? 2023-11-06 15:55 ? 次閱讀

這一次我們繼續講調試方法。調試是排查程序Bug的有效方法,同時也對嵌入式軟件設計的可靠性、穩定性而言至關重要。之前講的調試方法能夠打印出變量值、系統狀態,或用互動的方式去調試程序,都不能動態的在系統運行時由程序判斷變量、參數是否出錯。

而我們今天要講的斷言(assert)函數則能做到在運行時判斷參數是否超出預設值、狀態是否出錯,然后打印出出錯數據所在的源文件和行號。

那么,什么是斷言函數呢?百度百科給的定義是:“斷言(assertion)是一種在程序中的一階邏輯(如:一個結果為真或假的邏輯判斷式),目的為了表示與驗證軟件開發者預期的結果——當程序執行到斷言的位置時,對應的斷言應該為真。若斷言不為真時,程序會中止執行,并給出錯誤信息。“

接下來,我們繼續采用上一次實時跟蹤調試的例子,加入斷言函數對運行過程的參數進行判斷,看看斷言函數如何應用,有什么效果。

1. CubeMX設置

我們可以在CubeMX中打開例子工程中的.ioc文件,按下圖進行設置。

圖片

除此之外,可以直接在CubeIDE的工程屬性里定義一個宏USE_FULL_ASSERT,也可以在工程任意頭文件中定義這個宏,效果是一樣的。其實采用CubeMX配置之后,就是在工程的stm2f7xx_hal_conf.h頭文件中定義了這個宏。

2. 修改代碼

當定義了宏USE_FULL_ASSERT之后,assert_failed函數就能參與編譯了,這個函數在main.c的最下邊。這個函數的代碼如下:

void assert_failed(uint8_t *file, uint32_t line)
{
printf("Wrong parameters value: file %s on line %drn", file, (uint16_t)line);
}

斷言失敗的話則會執行這個函數,利用printf打印一條消息,這里我們用的是CubeIDE的ITM模塊向外打印,打印的消息里包含斷言失敗語句所在的源文件及行數。

要注意的是,參數line本來是無符號長整形,printf函數用%d對應長整形的話會給警告,所以做了一個強制類型轉換,變為無符號短整型。我想應該不會有一個源文件超過65535行吧,那是要挨打的。

接下來在main.h里定義一個宏IS_PARA_COUNTER_OK,當然名字可以自己任意取。

#define IS_PARA_COUNTER_OK(para) (para < 5)

這個宏的其實是個表達式,用以對para參數的值進行判斷,這里假設para的值小于5是正常的。為了防止出錯,表達式用小括號括起來了。

在main函數while循環開始的地方,我們加上一條語句,用來對我們設置的一個用來計數的變量counter進行參數斷言。

assert_param(IS_PARA_COUNTER_OK(counter));

其中,assert_param是在stm2f7xx_hal_conf.h中定義的一個宏。

#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *) FILE , LINE ))

意思是當expr表達式的值為真的時候,不執行任何操作,為假時,斷言失敗,執行assert_failed函數,并向該函數傳遞斷言失敗語句所在的源文件和行。__FILE__和__LINE__都是C語言定義的宏,分別代表當前源文件和所在行。

我們在main函數中寫的斷言語句可以完全展開如下:

(((counter < 5)) ? (void)0U : assert_failed((uint8_t *)"D:workspaceSTM32F7example2_ITMCoreSrcmain.c", 101))

是的,這條語句位于main.c的101行。

3. 調試結果

代碼修改好后,連接好開發板,構建工程,進入調試模式并開始運行,我們可以在SWV ITM Data Console窗口看到如下信息。

圖片

這里要說明一下,代碼里counter值是在打印之后加1的,也就是說在打印出4之后,其值已經變為5,導致參數斷言出錯,打印出預設消息。另外我們也可以在assert_failed函數里加入一個死循環,斷言失敗后程序就不會繼續往下執行了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136713
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27533
  • HAL庫
    +關注

    關注

    1

    文章

    121

    瀏覽量

    6220
收藏 人收藏

    評論

    相關推薦

    什么是斷言?C語言中斷言的語法和用法

    軟件開發過程,我們經常需要處理各種錯誤和異常情況。為了提高代碼的健壯性和可靠性,我們需要使用一些工具和技術來檢測和處理這些問題。本篇博客將深入探討C語言中斷言的使用,幫助讀者更好地理解和應用
    發表于 08-03 10:34 ?2741次閱讀

    解析C語言斷言函數的使用

    對于斷言,相信大家都不陌生,大多數編程語言也都有斷言這一特性。簡單地講,斷言就是對某種假設條件進行檢查。 C 語言中,斷言被定義為宏的形
    發表于 08-08 09:51 ?461次閱讀
    解析C語言<b class='flag-5'>斷言</b><b class='flag-5'>函數</b>的使用

    何為斷言斷言的作用有哪些?斷言的種類 斷言層次結構

    斷言主要用來檢查仿真過程存在的時序問題,如果存在異常情況,斷言會報警。一般在數字電路設計中都要加入斷言斷言占整個設計的比例應不少于30%
    的頭像 發表于 08-28 11:16 ?8429次閱讀
    何為<b class='flag-5'>斷言</b>?<b class='flag-5'>斷言</b>的作用有哪些?<b class='flag-5'>斷言</b>的種類 <b class='flag-5'>斷言</b>層次結構

    C語言assert(斷言)簡介

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

    如何在XC8使用斷言的?

    大家好,我正在嘗試使用XC8斷言,但是當我使用“*”時,“斷言h”空格main(空隙){BOOL X=0;斷言(x= 1);而(1){}}我的程序停止,并且
    發表于 03-26 10:58

    ART-Pi調試LAN8720object初始化遇到斷言報錯的原因是什么?

    使用rt-thread stdio平臺和ART-Pi開發LAN8720A。目前已經過了ETH的初始化,但是object.c的rt_object_init()初始化函數斷言報錯。請教一下論壇的朋友
    發表于 04-14 09:42

    SVA斷言是基于邊沿還是電平

    SVA斷言是一個強時序的技術,很多時候SVA的實際時序和驗證工程師的期望可能不同,這種不同很難調試定位。下面是一個SVA斷言的示例,驗證工程師期望斷言當檢測到req的上升沿后,再持續高
    發表于 08-25 15:57

    何為斷言斷言該怎么使用

    的每個函數的參數!調試的便利 :如果在程序測試和調試期間違反了前置條件,也就是說斷言異常了,則調用包含前置條件的函數的代碼
    發表于 09-21 14:59

    怎樣去修復HAL_NVIC_SetPriority的斷言故障

    優先級值HAL_NVIC_SetPriority 的 PreemptPriority 值 0-15 之間變化,但是當調用 HAL_RCC_ClockConfig 函數時,該值是 16。(最大 4 位
    發表于 12-12 07:17

    SystemVerilog斷言及其應用

    介紹SystemVerilog 斷言的概念、使用斷言的好處、斷言的分類、斷言的組成以及斷言如何
    發表于 05-24 16:35 ?0次下載
    SystemVerilog<b class='flag-5'>斷言</b>及其應用

    怎么理解Assert斷言語句?

    為什么項目中的代碼需要有Assert斷言語句?
    的頭像 發表于 03-03 14:12 ?2740次閱讀

    STM32函數庫Assert斷言機制

    編寫代碼時,我們總是會做出一些假設,斷言就是用于代碼捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。斷言表示為一些布爾表達式,程序
    發表于 02-08 15:29 ?2次下載
    STM32<b class='flag-5'>函數</b>庫Assert<b class='flag-5'>斷言</b>機制

    C語言斷言函數assert()的應用,清晰明了!

    這樣可以快速發現并定位軟件問題,同時對系統錯誤進行自動報警。對于系統隱藏很深,用其他手段極難發現的問題也可以通過斷言進行定位,從而縮短軟件問題定位時間,提高系統的可測性。
    的頭像 發表于 04-12 10:02 ?1102次閱讀

    防御式編程之斷言assert的使用

    防御式編程的重點就是需要防御一些程序未曾預料的錯誤,這是一種提高軟件質量的輔助性方法,斷言assert就用于防御式編程,編寫代碼時,我們總是會做出一些假設,斷言就是用于代碼捕捉這些
    的頭像 發表于 04-19 11:35 ?670次閱讀

    基于斷言的驗證簡介 – 第 1 部分

    基于斷言的驗證(ABV)是一種與傳統方法相比可以大大減少驗證過程的技術.
    的頭像 發表于 01-09 09:59 ?581次閱讀
    基于<b class='flag-5'>斷言</b>的驗證簡介 – 第 1 部分
    主站蜘蛛池模板: 亚洲精品91| 亚洲在线2018最新无码| 3D内射动漫同人资源在线观看| 久久全国免费观看视频| 97精品国偷拍自产在线| 日本xxxx裸体xxxx| 国产精品99AV在线观看| 亚洲一区二区三区乱码在线欧洲| 久久资源365| 大香伊人中文字幕精品| 亚洲AV精品无码国产一区| 快播理伦片| 高h浪荡文辣文神奇宝贝| 亚洲精品九色在线网站| 麻豆精品国产剧情观看| 俄罗斯19girl video9| 亚洲精品在线观看视频| 嫩草AV久久伊人妇女| 国产精品禁18久久久夂久| 又黄又粗又爽免费观看| 日本免费无码A专区在线观看| 极品少妇高潮啪啪AV无码吴梦梦 | 亚洲.日韩.欧美另类| 毛片大全网站| 国产偷国产偷亚洲高清SWAG| 91素人约啪| 亚洲精品无码一区二区三区四虎 | 欧美一区二区激情视频| 花蝴蝶高清影视视频在线播放| cctv网站| 伊人久久青青草| 双性将军粗壮H灌满怀孕| 久久亚洲精品专区蓝色区| 国产精品高潮呻吟AV久久96| 中文字幕亚洲乱码熟女在线萌芽 | 欧美成人国产| 九色91精品国产网站| 国产精品VIDEOSSEX久久发布| 99视频免费看| 羽月希被黑人吃奶dasd585| 午夜看片福利在线观看|