引用:
這主要在多工環境中使用,乙個可重入的函式簡單來說,就是:可以被中斷的函式。就是說,你可以在這個函式執行的任何時候中斷他的執行,在os的排程下去執行另外一段**而不會出現什麼錯誤。而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等等,所以他如果被中斷的話,可能出現問題,所以這類函式是不能執行在多工環境下的。
把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫他。
第一,不要使用全域性變數。因為別的**很可能覆蓋這些變數值。
第二,在和硬體發生互動的時候,切記執行類似disinterrupt()之類的操作,就是關閉硬體中斷。完成互動記得開啟中斷,在有些系列上,這叫做「進入/退出核心」或者用os_enter_kernal/os_exit_kernal來描述。
第三,不能呼叫任何不可重入的函式。
第四,謹慎使用堆疊。最好先在使用前先os_enter_kernal。
還有一些規則,都是很好理解的,總之,時刻記住一句話:保證中斷是安全的!
通俗的來講吧:由於中斷是可能隨時發生的,斷點位置也是無法預期的。所以必須保證每個函式都具有不被中斷發生,壓棧,轉向isr,彈棧後繼續執行影響的穩定性。也就是說具有不會被中斷影響的能力。既然有這個要求,你提供和編寫的每個函式就不能拿公共的資源或者是變數來使用,因為該函式使用的同時,isr(中斷服務程式)也可那會去修改或者是獲取這個資源,從而有可能使中斷返回之後,這部分公用的資源已經面目全非。
滿足下列條件的函式多數是不可重入的:
(1)函式體內使用了靜態的資料結構;
(2)函式體內呼叫了malloc()或者free()函式;
(3)函式體內呼叫了標準i/o函式。
可重入函式與不可重入函式
可重入 reentrant 函式可以由多於乙個任務併發使用,而不必擔心資料錯誤。相反,不可重入 non reentrant 函式不能由超過乙個任務所共享,除非能確保函式的互斥 或者使用訊號量,或者在 的關鍵部分禁用中斷 可重入函式可以在任意時刻被中斷,稍後再繼續執行,不會丟失資料。可重入函式要麼使用...
可重入函式與不可重入函式
可重入 可重新進入,也即兩次進入的現場一模一樣?在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指乙個可以被多個任務呼叫...
不可重入函式 與 可重入函式
不可重入函式不可以在它還沒有返回就再次被呼叫 該函式在被呼叫還沒有結束之前,再次被呼叫,從而可能產生錯誤。但是,可重入函式不存在這樣的問題。不可重入函式在實現時通常使用了全域性的資源 eg.全域性變數 在多執行緒的環境下,如果沒有很好的處理資料保護和互斥訪問,就可能會發生錯誤。常見的不可重入函式有 ...