1. 中斷處理函式的返回值和形參
中斷處理函式不能有返回值和形參,因為中斷處理函式都是硬體呼叫(或者叫觸發),沒有程式給它傳遞引數,也沒有程式接收它的返回值,其引數的傳遞透過全域性變數的方式。
但是要注意,如果在中斷服務函式中改變了供其他函式檢測的全域性變數的值,要使用volatile關鍵字定義該全域性變數。因為主程式可能將該變數讀取到暫存器中,以後每次只使用暫存器中的變數副本,這時候吐過不使用volatile關鍵字,會導致中斷服務函式中修改該變數的操作被短路。
2. 中斷處理函式中進行浮點數運算
由於浮點運算一般都是由專門的硬體來完成的,硬體裝置會牽扯到一些類似全域性變數的東西(比如硬體埠,或者硬體裝置本身存放的資料),如果浮點運算的過程被中斷,而其他函式也可能使用浮點數運算,這就會破壞當前硬體裝置中的資料。可以理解為浮點運算一般是不可重入的,因此不能在中斷服務函式中使用浮點運算。
可以在滿足精度的前提下,將浮點運算擴大若干倍,變成整型運算。
3. 中斷處理函式中使用printf函式
這個原理跟上面的在中斷服務函式中使用浮點數類似,因為printf函式使用硬體資源,而這些資源本身就應該互斥訪問(在多執行緒和多程序中),而這些導致printf函式不可重入,不能在中斷中使用。
另外像malloc,free這些函式會使用全域性的記憶體分配表,因此也是不可重入的,不能在中斷中使用。
要注意,標準庫函式中中很多都是不可重入的,在中斷服務函式中要慎重使用它們。
中斷服務函式應該是短而有效的。
1. 中斷處理函式的返回值和形參
中斷處理函式不能有返回值和形參,因為中斷處理函式都是硬體呼叫(或者叫觸發),沒有程式給它傳遞引數,也沒有程式接收它的返回值,其引數的傳遞透過全域性變數的方式。
但是要注意,如果在中斷服務函式中改變了供其他函式檢測的全域性變數的值,要使用volatile關鍵字定義該全域性變數。因為主程式可能將該變數讀取到暫存器中,以後每次只使用暫存器中的變數副本,這時候吐過不使用volatile關鍵字,會導致中斷服務函式中修改該變數的操作被短路。
2. 中斷處理函式中進行浮點數運算
由於浮點運算一般都是由專門的硬體來完成的,硬體裝置會牽扯到一些類似全域性變數的東西(比如硬體埠,或者硬體裝置本身存放的資料),如果浮點運算的過程被中斷,而其他函式也可能使用浮點數運算,這就會破壞當前硬體裝置中的資料。可以理解為浮點運算一般是不可重入的,因此不能在中斷服務函式中使用浮點運算。
可以在滿足精度的前提下,將浮點運算擴大若干倍,變成整型運算。
3. 中斷處理函式中使用printf函式
這個原理跟上面的在中斷服務函式中使用浮點數類似,因為printf函式使用硬體資源,而這些資源本身就應該互斥訪問(在多執行緒和多程序中),而這些導致printf函式不可重入,不能在中斷中使用。
另外像malloc,free這些函式會使用全域性的記憶體分配表,因此也是不可重入的,不能在中斷中使用。
要注意,標準庫函式中中很多都是不可重入的,在中斷服務函式中要慎重使用它們。
中斷服務函式應該是短而有效的。