精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

老司機帶你深入理解ST庫中的 assert_param 語句

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-14 14:52 ? 次閱讀

還有沒上車的嗎

馬上要開車了

不等了,開始發車

老司機,再稍我一個

車已經發動了

你等下一班車吧

車子運行中,大伙兒坐穩啦!

庫函數中的assert_param

STM8STM32標準外設庫,或者HAL庫的stm8_conf.h、stm32···_conf.h文件中會看見如下一段代碼:

/* #define USE_FULL_ASSERT 1 */

#ifdef USE_FULL_ASSERT

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

voidassert_failed(uint8_t* file, uint32_t line);

#else

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

#endif

大概意思就是:如果定義了USE_FULL_ASSERT,則會宏定義:#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

相當于是一個條件語句。

此時,還需要我們實現assert_failed函數,如果不實現,則會報錯(后面來講具體如何實現)。

而在其他地方調用情況(如GPIO)

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

assert_param(IS_GPIO_PIN(GPIO_Pin));

GPIOx->BSRR = GPIO_Pin;

}

調用assert_param的主要作用就是檢測參數正確與否,即我們所說的斷言。

assert_param詳情

1.STM8S中的assert_param

細心的朋友會發現,STM8標準外設庫stm8s_conf.h中開啟了USE_FULL_ASSERT這個宏:

#define USE_FULL_ASSERT (1)

開啟USE_FULL_ASSERT這個宏,就意味著要實現assert_failed((uint8_t *)__FILE__, __LINE__))這個函數;

那么我就在main.c文件下,按照官方的例程實現了assert_failed函數:

#ifdef USE_FULL_ASSERT //斷言(參考官方)

void assert_failed(u8* file, u32 line)

{

while (1)

{

}

}

#endif

2.STM32中的assert_param

在STM32標準外設庫,HAL庫中的USE_FULL_ASSERT這個宏是被屏蔽了的。故程序運行#define assert_param(expr) ((void)0)

也就是沒有做任何處理。

我之前提供的例程中,為了不動官方代碼,assert_param這個函數都是沒有使用的。

3.assert_failed((uint8_t *)__FILE__, __LINE__))

看到這個函數,就要說下__FILE__和__LINE__這兩個標準定義。

__LINE__:正在編譯文件的行號

__FILE__:正在編譯文件的文件名

還不懂的同學,建議參考之前的文章【ANSIC幾種特殊的標準定義(__FILE__、__LINE__、__STDC__···)】。

而上面只是申明,函數具體的實現還需要自己實現。理解了上面兩個參數,相信大家都會知道如何實現了。需要根據自己項目情況來實現。常規舉例:

voidassert_failed(uint8_t* file, uint32_t line)

{

printf("Error code in file:%s,line:%u ",file,line);

}

這條語句在調及產品出廠之前測試是很有必要的,方便分析問題所在。正式推出版本,不定義USE_FULL_ASSERT這個宏既可以關閉了。

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

    關注

    32

    文章

    1129

    瀏覽量

    128826
  • STM32
    +關注

    關注

    2266

    文章

    10871

    瀏覽量

    354789
  • STM8
    +關注

    關注

    18

    文章

    392

    瀏覽量

    56708
收藏 人收藏

    評論

    相關推薦

    技術干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應用

    在編程,條件判斷語句是控制程序流程的核心元素之一。它們使得程序能夠根據不同的輸入和狀態,做出相應的決策。特別是在C語言中,條件判斷語句的使用極為廣泛,涵蓋了從簡單的if語句到更復雜的
    的頭像 發表于 11-09 01:10 ?173次閱讀
    技術干貨驛站 ▏<b class='flag-5'>深入理解</b>C語言:掌握C語言條件判斷,從if到switch的應用

    深入理解FPD-link III ADAS解串器HUB產品

    電子發燒友網站提供《深入理解FPD-link III ADAS解串器HUB產品.pdf》資料免費下載
    發表于 09-06 09:58 ?0次下載
    <b class='flag-5'>深入理解</b>FPD-link III ADAS解串器HUB產品

    技術干貨驛站 ▏深入理解C語言:基本數據類型和變量

    在C語言中,數據類型和變量是編程的基礎,也是理解更復雜概念的關鍵。數據類型決定了變量的內存分配、存儲范圍和操作方式,而變量則是存儲數據的容器。本篇文章將從基本數據類型和變量兩個方面,帶你深入了解C
    的頭像 發表于 07-26 17:53 ?1931次閱讀
    技術干貨驛站 ▏<b class='flag-5'>深入理解</b>C語言:基本數據類型和變量

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

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

    stm8l用iar download debug時出錯的原因?

    錯誤提示是:Error[Li005]: no definition for \"assert_param\" [referenced from D
    發表于 05-13 06:41

    STM32F103C8T6時鐘RTC每次啟動變慢1s是為什么?

    ; /* Check input parameters */ if(hrtc == NULL) { return HAL_ERROR; } /* Check the parameters */ assert_param
    發表于 05-13 06:25

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

    */ if (hspi == NULL) { return HAL_ERROR; } /* Check the parameters */ assert_param(IS_SPI_ALL_INSTANCE
    發表于 05-08 07:00

    stm32F407 USART發送數據,TC不能置位是怎么回事?

    ; /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_FLAG
    發表于 04-25 06:15

    深入理解FFmpeg閱讀體驗》

    ,運動圖像專家組)聯合制定的視頻編碼標準。而X264是一個開源的H.264/MPEG-4 AVC視頻編碼函數,是最好的有損視頻編碼器之一。 先直接從網絡(http
    發表于 04-16 22:54

    如何在if和assert做選擇

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

    深入理解 FPGA 的基礎結構

    轉載地址:https://zhuanlan.zhihu.com/p/506828648 文章很詳細的介紹了FPGA的基礎結構,能更直觀的理解內部結構原理。對深入學習很有幫助。 以下是正文: 這一段
    發表于 04-03 17:39

    恒訊科技帶大家深入理解:WebSocket服務器的工作原理

    WebSocket是一種在單個TCP連接上進行全雙工通信的通信協議。它的設計目標是在Web瀏覽器和服務器之間提供低延遲、高效的雙向通信。下面是深入理解WebSocket服務器工作原理的一些關鍵概念
    的頭像 發表于 01-29 16:48 ?446次閱讀

    深入理解光耦模擬隔離放大電路的技術奧秘

    深入理解光耦模擬隔離放大電路的技術奧秘 ?編輯 ▲ 圖1 仿真原理圖二、原理分析 之所以這個電路圖看起來容易讓人感到困惑,實際上就是這個仿真電路,錯誤的使用了這樣的光電三極管來表示HCNR201
    發表于 01-10 10:12

    深入理解FFmpeg閱讀體驗》+ 書收到了,嶄新的開篇

    今天收到了《深入理解FFmpeg》 嶄新的書,一個在2022年較近距離接觸過卻尚未深入研究的領域圖像處理。最近剛好在作這方面的研究,希望自己可以把握這次機會,好好學習下 FFMpeg,相信可以讓自己
    發表于 01-07 18:57

    深入理解BigBird的塊稀疏高效實現方案

    RoBERTa 架構的 BigBird 模型現已集成入 transformers 。本文的目的是讓讀者 深入 了解 BigBird 的實現,并讓讀者能在 transformers 輕松
    的頭像 發表于 11-29 11:02 ?527次閱讀
    <b class='flag-5'>深入理解</b>BigBird的塊稀疏高效實現方案