Stm32庫函式裡的斷言機制解析

2021-07-25 07:39:27 字數 1374 閱讀 2144

assert_param 在stm32的hal庫函式中的函式中隨處可見。那麼它的作用是什麼呢?

首先看乙個它使用的地方:

這裡的作用很明顯,是對函式輸入的引數進行檢查。那麼它檢查的機制是如何實現的呢?

看下assert_param 定義的地方,在定義了巨集 use_full_assert 的時候,assert_param 才起作用,否則 assert_param 就背替換成 ((void)0u) ,會被編譯器優化掉的,不會產生實際執行的**。所以我們可以在編寫和測試**時,設定 use_full_assert 這個巨集,開啟斷言的功能,方便我們盡快的除錯和定位錯誤。在 release 版的時候可以關閉這個巨集,關閉斷言功能,以節省系統資源。

在定義了 use_full_assert 巨集的時候,如果巨集引數 expr 不為真,那麼則呼叫 assert_failed 函式,否則就是 ((void)0u)  。

那麼看下 assert_failed 函式的原型。這個函式是乙個死迴圈,在迴圈之前使用者可以新增相應的函式來輸出提示資訊(例如:列印觸發斷言的檔名和**行號),這樣就可以根據精確的定位觸發斷言的**位置,從而精確的除錯bug。

看到這裡再回到第乙個問題,這幾行**如何做到對輸入的引數進行檢查。

以第乙個引數 gpiox 為例,

assert_param(is_gpio_all_instance(gpiox));

由上面的分析我們知道,如果assert_param()括號中的引數不為真,那麼就會觸發斷言。那麼 is_gpio_all_instance 就肯定是對 gpiox的範圍做限定的判斷了。由下面的**可以得知,輸入的引數 gpiox 被限定在了 gpioa、gpiob、gpioc、gpioh 這幾個值之間,如果是在範圍之外,則在除錯的時候會觸發斷言。

這種斷言的叫做動態斷言,動態斷言是在執行時檢查斷言。還有一種斷言叫做靜態斷言,靜態斷言是在編譯時檢查斷言。

STM32鍵盤 庫函式

昨天晚上老大回來看我頻繁使用暫存器寫程式給出指點,告訴我盡量使用庫函式,少使用暫存器,畢竟暫存器在後面使用的時候還要乙個乙個查詢手冊可能太麻煩了,nice!這次使用庫函式操作鍵盤,很基礎的實驗,其中摻雜了之前的蜂鳴器和led內容。感覺基礎鍵盤實驗比較有價值的還是那個鍵盤操作函式,以下給出標準模板,m...

stm32 按鍵(庫函式版)

不得不說程序太慢了 感覺很慌 但是幹什麼事情又非常的從容 學的很慢學著學著發現 不止是要學新東西 那些 以前早該知道的東西也忘了好多 還有 一定一定要好好學習 擴充套件知識面 什麼東西都一定要學精 因為知識的封鎖真的真的很可怕 很可怕 所以一定多學習 多動手 要加油 終於可以看這個的重點了 按鍵 就...

STM32 庫函式流水燈程式

我用的stm32f103zet6晶元 led給0亮 先在新建好的專案資料夾syste裡建乙個led資料夾用於存放led.c和led.h 如 接下來直接看 吧!main.c include sys.h include delay.h include led.h intmain void led.c i...