中斷函數里不能用動態內存申請和釋放


一個是只要是內存動態申請,必然涉及到了堆,所以必然是要做共享資源保護的,FreeRTOS里,用了臨界區,沒毛病。第二,只要是內存的動態管理,必然涉及到了復雜的算法,他的運行時間是帶有很強的不確定性的。在中斷里跑算法,跑耗時的操作,只會是坑你自己而已。

 

當你在一個多線程環境內使用堆時,會出現一類新的問題。堆變成一個共享的資源,因此引發了全部和資源共享有關的麻煩,新問題是:
 malloc() 和 free() (常常)是不可重入的,也就是說,它們不能從多個執行線程被安全的調用。
 可以通過使用一個互斥體保護 malloc() , free() , realloc() 這類函數來彌補重入的問題,互斥體 mutex 僅允許每次一個線程存取共享的堆。然而,這個方案可能造成過度的線程阻塞(特別是如果內存管理是不可確定的)並且可以顯著的降低並行性。互斥體也可以造成優

先級倒置。一般的,被一個互斥體保護的堆管理函數不適用於 ISR 因為 ISR 不能阻塞

 

所以說,在中斷里malloc,和作死沒啥區別


當然,也有些說是臨界保護還有優先級有關,這個也是,但總的來說是為了防止不安全的操作發生,系統給了一些限制,在中斷里面,只有指定的函數可用

 

 

注:中斷中絕不可使用無“FromISR”結尾的API函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM