嵌入式關鍵知識點

中斷服務程序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.給互斥量(原子鎖)上鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章