可重入函式與不可重入函式

2021-07-10 04:51:10 字數 1155 閱讀 6217

可重入:可重新進入,也即兩次進入的現場一模一樣?

實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會出錯。不可重入函式在實時系統設計中被視為不安全函式。

滿足下列條件的函式多數是不可重入的:

如何寫出可重入的函式?在函式體內不訪問那些全域性變數,不使用靜態區域性變數,堅持只使用預設態(auto)區域性變數,寫出的函式就將是可重入的。如果必須訪問全域性變數,記住利用互斥訊號量來保護全域性變數。或者呼叫該函式前關中斷,呼叫後再開中斷。

可重入函式可以被乙個以上的任務呼叫,而不必擔心資料被破壞。可重入函式任何時候都可以被中斷,一段時間以後又可以執行,而相應的資料不會丟失。可重入函式或者只使用區域性變數,即儲存在cpu暫存器中或堆疊中;或者使用全域性變數,則要對全域性變數予以保護。

說法2:

乙個可重入的函式簡單來說,就是:可以被中斷的函式。就是說,你可以在這個函式執行的任何時候中斷他的執行,在任務排程下去執行另外一段代 碼而不會出現什麼錯誤。而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等等,所以他如果被中斷的話,可能出現問題,所以這類函式是 不能執行在多工環境下的。

基本上下面的函式是不可重入的

把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫他。

其實很簡單,只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。

第一,不要使用全域性變數。因為別的**很可能覆蓋這些變數值。

第二,在和硬體發生互動的時候,切記執行類似disinterrupt()之類的操作,就是關閉硬體中斷。完成互動記得開啟中斷,在有些系列上,這叫做「進入/退出核心」或者用os_enter_kernal/os_exit_kernal來描述。//這是臨界區保護

第三,不能呼叫任何不可重入的函式。

第四,謹慎使用堆疊。最好先在使用前先os_enter_kernal。

還有一些規則,都是很好理解的,總之,時刻記住一句話:保證中斷是安全的!

可重入函式與不可重入函式

可重入 reentrant 函式可以由多於乙個任務併發使用,而不必擔心資料錯誤。相反,不可重入 non reentrant 函式不能由超過乙個任務所共享,除非能確保函式的互斥 或者使用訊號量,或者在 的關鍵部分禁用中斷 可重入函式可以在任意時刻被中斷,稍後再繼續執行,不會丟失資料。可重入函式要麼使用...

不可重入函式 與 可重入函式

不可重入函式不可以在它還沒有返回就再次被呼叫 該函式在被呼叫還沒有結束之前,再次被呼叫,從而可能產生錯誤。但是,可重入函式不存在這樣的問題。不可重入函式在實現時通常使用了全域性的資源 eg.全域性變數 在多執行緒的環境下,如果沒有很好的處理資料保護和互斥訪問,就可能會發生錯誤。常見的不可重入函式有 ...

可重入函式與不可重入函式

在實時 系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果有乙個函式不幸被設計成為這樣 那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。相反,肯定有乙個安全的函式,這個安全的函式又叫可重入函式。那麼什麼是可重入...