ARM中斷

今天調試三星S3C2440的中斷部分,遇到一些問題,也解決了一些問題,希望與大家分享。
我先列寫一下三星ARM的中斷初始化過程:
1、GPnCON。   對中斷口進行設置(默認狀態爲I/O)
2、EXTINTn(外部中斷控制寄存器)。設置外部中斷的信號方式,本寄存器僅針對外部中斷。
3、EINTMASK,EINTPEND。這兩個寄存器針對外部中斷,用於使能外部中斷,只需要初始化一次。
4、SRCPND,INTPND。針對所有中斷。
     SRCPND--源中斷指示寄存器:32位中的每一位對應着一箇中斷源,每一位被設置爲1,則相應的中斷源產生中斷請求並且等待中斷被服務,因此這個寄存器表明哪個中斷源在等待中斷請求被處理。不管INTMASK如何設置,當有中斷請求時,SRCPND都會自動被置1。在指定的中斷源的服務程序中。SRCPND相應的位必須被清除,這樣纔可以正確的響應同一中斷源的中斷請求。如果從ISR返回而沒有清除相應的位,也就是說SRCPND中對應的還是1,那麼就會一直相應這個中斷請求。
    INTPND--中斷請求寄存器:32位中的每一位對應着相應的中斷請求,經過優先級邏輯後,INTPND寄存器只能有一位被設置爲1。在IRQ中斷服務程序中能夠讀取這個寄存器的值來決定32箇中斷源的哪一個中斷被服務。同SRCPND寄存器一樣,在中斷服務程序裏,這個寄存器的相應位需要被清除。我們可以向INTPND寄存器寫一個數據1,來清除寄存器的指定位。 
5、將中斷服務子程序的入口地址賦給中斷向量。CPU在響應中斷後首先會跳到中斷向量表,中斷向量表存放中斷服務子程序的函數地址。在ISR中一定要記住第一件要做事情,將SRCPND,INTPND些“1”。

6、INTMASK:中斷屏蔽寄存器,默認爲中斷屏蔽。當你的CPU接收到中斷的話,就可以啓動ISR了。

     在代碼的調試中,深入學習了幾個知識點:
extern的作用
      extern關鍵字的作用是聲明變量和函數爲外部鏈接,即該變量或函數名在其它文件中可見。用其聲明的變量或函數應該在別的文件或同一文件的其它地方定義,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。 僅僅是一個變量的聲明,並不分配內存空間。
       如果函數的聲明中帶有關鍵字extern,僅僅是暗示這個函數可能在別的源文件裏定義,沒有其它作用。即下述兩個函數聲明沒有明顯的區別:extern int f(); 和int f(); 
       當函數提供方單方面修改函數原型時,如果使用方不知情繼續沿用原來的extern申明,這樣編譯時編譯器不會報錯。但是在運行過程中,因爲少了或者多了輸入參數,往往會照成系統錯誤。目前業界針對這種情況的處理沒有一個很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供對外部接口的聲明,然後調用方include該頭文件,從而省去extern這一步。以避免這種錯誤。 
       在C++環境下使用C函數的時候,常常會出現編譯器無法找到obj模塊中的C函數定義,從而導致鏈接失敗的情況。C++語言在編譯的時候爲了解決函數的多態問題,會將函數名和參數聯合起來生成一箇中間的函數名稱,而C語言則不會,因此會造成鏈接時找不到對應函數的情況,此時C函數就需要用extern “C”進行鏈接指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈接的中間函數名。 
下面是一個標準的寫法: 
//在.h文件的頭上 
#ifdef __cplusplus 
#if __cplusplus 
extern 'C'{ 
#endif 
#endif /* __cplusplus */ 
… 
… 
//.h文件結束的地方 
#ifdef __cplusplus 
#if __cplusplus 

#endif 
#endif /* __cplusplus */

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