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

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

3天內不再提示

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

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

還有沒上車的嗎

馬上要開車了

不等了,開始發車

老司機,再稍我一個

車已經發動了

你等下一班車吧

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

庫函數中的assert_param

STM8、STM32標準外設庫,或者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

    文章

    1101

    瀏覽量

    128268
  • STM32
    +關注

    關注

    2245

    文章

    10688

    瀏覽量

    349656
  • STM8
    +關注

    關注

    18

    文章

    391

    瀏覽量

    56310
收藏 人收藏

    評論

    相關推薦

    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 ?229次閱讀

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

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

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

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

    【書籍評測活動NO.25】深入理解FFmpeg,帶你FFmpeg從入門到精通

    ,涵蓋音視頻基礎知識、FFmpeg參數解析、API使用、內部組件的開發定制 行業大咖審校,多名業界專家與學者作序推薦 詳細解讀實際應用與開發案例,幫助讀者深入理解FFmpeg 大咖推薦 我
    發表于 11-15 14:26

    深入理解redis分布式鎖

    深入理解redis分布式鎖 哈嘍,大家好,我是指北君。 本篇文件我們來介紹如何Redis實現分布式鎖的演進過程,以及為什么不能直接用Setnx實現分布式鎖。 1、分布式鎖簡介 分布式鎖是控制分布式
    的頭像 發表于 10-08 14:13 ?612次閱讀
    <b class='flag-5'>深入理解</b>redis分布式鎖

    311集(56.4#100)觀察 GPIO 初始化 assert_param 函數做了什么?

    嵌入式程序函數
    于振南的單片機世界
    發布于 :2023年08月27日 15:11:47

    深入理解微電子電路設計——數字電子技術及應用》+深究數字芯片的內核與要點

    吧,與感興趣的同仁一起來領略一下《深入理解微電子電路設計》吧! 《深入理解微電子電路設計》是2020年清華大學出版社出版的圖書,由宋延強翻譯。原書作者是[美] 理查德 · C.耶格(Richard
    發表于 07-29 11:59
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>