stm32 中斷處理函數注意事項

一 前記
最近在公司的一個項目中碰到一個解決了定位很久的 bug , bug 找到的時候發現犯了很低級的錯誤——在中斷處理函數中調用了 printf 函數,因爲中斷處理函數的調用了不可重入函數,導致接收到莫名其妙的數據。後面通過定位才發現這個是因爲裏面調用了不可重入函數導致的。那麼,
  • 那什麼是不可重入函數呢?
  • 爲什麼中斷處理函數不能直接調用不可重入函數?
  • 怎樣寫可重入函數?
二 概念
可重入函數主要用於多任務環境中,一個可重入的函數簡單來說就是可以被中斷的函數,也就是說,可以在這個函數執行的任何時刻中斷它,轉入 OS 調度下去執行另外一段代碼,而返回控制時不會出現什麼錯誤;而不可重入的函數由於使用了一些系統資源,比如全局變量區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函數是不能運行在多任務環境下的。
滿足下列條件的函數多數是不可重入的:
  • 函數體內使用了靜態(static)的數據結構;
  • 函數體內調用了 malloc() 或者 free() 函數;
  • 函數體內調用了標準 I/O 函數;
在多任務系統下,中斷可能在任務執行的任何時間發生;如果一個函數的執行期間被中斷後,到重新恢復到斷點進行執行的過程中,函數所依賴的環境沒有發生改變,那麼這個函數就是可重入的,否則就不可重入。
三 總結
1 總而言之,中斷處理函數做的事情越簡單越好。
2 戒律:中斷服務程序裏,儘量不要調用不可重入函數,比如printf,malloc 函數等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章