1、可重入函數:主要用於多任務環境中,一個可重入的函數簡單來說就是可以被中斷的函數,也就是說,可以在這個函數執行的任何時刻中斷它,轉入OS調度下去執行另外一段代碼,而返回控制時不會出現什麼錯誤;所謂可重入函數是指一個可以被多個任務調用的過程,任務在調用時不必擔心數據是否會出錯。
保證函數的可重入性的方法:在寫函數時候儘量使用局部變量(例如寄存器、堆棧中的變量),對於要使用的全局變量要加以保護(如採取關中斷、信號量等方法),這樣構成的函數就一定是一個可重入的函數。
2、不可重入的函數:由於使用了一些系統資源,比如全局變量區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函數是不能運行在多任務環境下的。
不可重入函數在實時系統設計中被視爲不安全函數。
滿足下列條件的函數多數是不可重入的:
2) 函數體內調用了malloc()或者free()函數;
3) 函數體內調用了標準I/O函數。
下面舉例加以說明。
A. 可重入函數
void strcpy(char *lpszDest, char *lpszSrc) {
while(*lpszDest++=*lpszSrc++);
*dest=0;
}
B. 不可重入函數1
char cTemp;//全局變量
void SwapChar1(char *lpcX, char *lpcY) {
cTemp=*lpcX;
*lpcX=*lpcY;
lpcY=cTemp;//訪問了全局變量
}
C. 不可重入函數2
void SwapChar2(char *lpcX,char *lpcY) {
static char cTemp;//靜態局部變量
cTemp=*lpcX;
*lpcX=*lpcY;
}