把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。
1) 不要使用全域性變數。因為別的**很可能覆蓋這些變數值。
2) 在和硬體發生互動的時候,切記執行類似disinterrupt(
)之類的操作,就是關閉硬體中斷。完成互動記得開啟中斷,在有些系列上,這叫做「進入/退出核心」。
3) 不能呼叫其它任何不可重入的函式。
4) 謹慎使用堆疊。最好先在使用前先os_enter_kernal。
a. 可重入函式
void strcpy(char *lpszdest, char *lpszsrc)
b. 不可重入函式1
charctemp;
//全域性變數
void swapchar1(char *lpcx, char *lpcy)
c. 不可重入函式2
void swapchar2(char *lpcx,char *lpcy)
d. unsigned int sum_int( unsigned int base )
分析:所謂的函式是可重入的(也可以說是可**的),即只要輸入資料相同就應產生相同的輸出。
這個函式之所以是不可**的,就是因為函式中使用了 static變數,因為static變數的特徵,
這樣的函式被稱為:帶「內部儲存器」功能的的函式。因此如果需要乙個可重入的函式,一定要避免
函式中使用 static變數,這種函式中的static變數,使用原則是,能不用盡量不用。
將上面的函式修改為可重入的函式,只要將宣告sum變數中的static關鍵字去掉,變數sum即變為乙個
auto型別的變數,函式即變為乙個可重入的函式。
當然,有些時候,在函式中是必須要使用static變數的,比如當某函式的返回值為指標型別時,則必須是
static的區域性變數的位址作為返回值,若為auto型別,則返回為錯指標。
** 可重入函式和不可重入函式
可重入函式 可重入函式主要用於多工環境中,乙個可重入函式簡單來說是可以被中斷的函式,即可以在函式執行的任何時刻中斷它,轉入os排程下去執行另一段 而返回控制時不出現錯誤,這意味著它除了使用自己棧上的變數以外,不依賴於任何環境 包括static 這樣的函式就是purecode 純 可重入,它可以允許該...
可重入函式和不可重入函式
作為乙個程式設計人員,一定要有可重入和不可重入概念,但工作中發現的現象讓我大跌眼鏡 很多人沒聽說過!亡羊補牢,為時不晚,現在在腦子中種下這顆概念種子也不遲。為什麼說一定要有可重入和不可重入的概念呢,因為我們的程式肯定不只在main 函式中簡單的跑乙個while 1 迴圈,一般都會涉及到中斷和作業系統...
可重入函式和不可重入函式
在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果有乙個函式不幸被設計成為這樣 那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。這樣的函式是不安全的函式,也叫不可重入函式。注 含有全域性變數或者靜態成員變數 不可重入函式 相反,肯定有乙個安全的函式...