首頁>Club>
18
回覆列表
  • 1 # 大寶8211

    1. 中斷處理函式的返回值和形參

    中斷處理函式不能有返回值和形參,因為中斷處理函式都是硬體呼叫(或者叫觸發),沒有程式給它傳遞引數,也沒有程式接收它的返回值,其引數的傳遞透過全域性變數的方式。

    但是要注意,如果在中斷服務函式中改變了供其他函式檢測的全域性變數的值,要使用volatile關鍵字定義該全域性變數。因為主程式可能將該變數讀取到暫存器中,以後每次只使用暫存器中的變數副本,這時候吐過不使用volatile關鍵字,會導致中斷服務函式中修改該變數的操作被短路。

    2. 中斷處理函式中進行浮點數運算

    由於浮點運算一般都是由專門的硬體來完成的,硬體裝置會牽扯到一些類似全域性變數的東西(比如硬體埠,或者硬體裝置本身存放的資料),如果浮點運算的過程被中斷,而其他函式也可能使用浮點數運算,這就會破壞當前硬體裝置中的資料。可以理解為浮點運算一般是不可重入的,因此不能在中斷服務函式中使用浮點運算。

    可以在滿足精度的前提下,將浮點運算擴大若干倍,變成整型運算。

    3. 中斷處理函式中使用printf函式

    這個原理跟上面的在中斷服務函式中使用浮點數類似,因為printf函式使用硬體資源,而這些資源本身就應該互斥訪問(在多執行緒和多程序中),而這些導致printf函式不可重入,不能在中斷中使用。

    另外像malloc,free這些函式會使用全域性的記憶體分配表,因此也是不可重入的,不能在中斷中使用。

    要注意,標準庫函式中中很多都是不可重入的,在中斷服務函式中要慎重使用它們。

    中斷服務函式應該是短而有效的。

  • 中秋節和大豐收的關聯?
  • 系統啟動時,提示找不到NTLDR檔案怎麼辦?