中斷服務程序ISR特點:1.不能有返回值,必須用void 2.不能傳遞參數,必須用void 3.多用來處理短而高效的任務 4.ISR內部不可調用不可重入函數。
正確ISR例子:
void timer0_int(void) interrupt 1 using 1
{
unsigned char temp1 ;
unsigned char temp2 ;
}
錯誤ISR例子:
_interrupt double compute_area (double radius)
{
double area = PI * radius * radius; //浮點運算耗時間
printf(” Area = %f”, area); //調用了不可重入函數
return area; //有返回值
}
不可重入函數:該函數不可以在還沒有返回時再次被調用,也可以理解爲不可以被中斷的函數,從而不能運行在多任務的環境下,可能會造成死鎖。如常見的printf,malloc,free等函數,因爲這些函數通常引用了全局變量。printf(stdout全局變量)、malloc(全局內存分配表)、free(全局內存分配表)。
編寫可重入函數方法:在函數體內不訪問全局變量,不使用靜態局部變量,只使用局部變量,若必須訪問全局變量,使用互斥信號量保護全局變量。
死鎖:死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。
產生死鎖的四個必要條件:1.互斥條件 2.不可搶佔條件 3.佔有且申請條件 4.循環等待條件
保護多線程共享全局變量:1.關中斷 2.給互斥量(原子鎖)上鎖