<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S3C6410中斷以及外部中斷

          S3C6410中斷以及外部中斷

          作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          6410的中斷系統(tǒng)

          本文引用地址:http://www.ex-cimer.com/article/201611/318392.htm

          嵌入式軟件里的中斷處理,除了中斷初始化,主要工作就是編寫ISR.

          在嵌入式的SOC的CPU里,在CPU里內(nèi)部會帶一些設(shè)備模塊,它們產(chǎn)生的中斷稱為內(nèi)部中斷。因為聯(lián)線比較固定,因此編程比較簡單。而且在物理上CPU分離的芯片產(chǎn)生的中斷,稱為外部中斷,外部中斷可以聯(lián)接不同的中斷腳上,因此需要對中斷IO進行較復(fù)雜的配置。

          輪詢模式是否一無是處?輪詢的優(yōu)點是在重負(fù)荷的情況下,輪詢比中斷效率會高很多。比如一個教室很多學(xué)生不斷的問問題,這樣與其不斷被中斷,老師還不如起身在教室走動,隨機處理學(xué)生問題會高很多。


          異常(Exception)
          --------------------------------------------------------------------------

          Exception(異常), 計算機體系結(jié)構(gòu)中,異常或者中斷是處理系統(tǒng)中突發(fā)事件的一種機制,幾乎所有的處理器都提供這種機制。異常主要是從處理器被動接受的角度出發(fā)的一種描述,指意外操作引起的異常。而中斷則帶有向處理器主動申請的意味。但這兩種情況具有一定的共性,都是請求處理器打斷正常的程序執(zhí)行流程,進入特定程序的一種機制。


          從結(jié)構(gòu)來看,外部設(shè)備產(chǎn)生的中斷可以看成一種特殊的異常.除了中斷之外,還有ARM不少固定的異常.包括以下七種:


          1. 復(fù)位(Reset)


          當(dāng)按下RESET鍵后,會產(chǎn)生一個復(fù)位異常,此時程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行.當(dāng)CPU重啟后.一般剛好跳到這個復(fù)位異常來


          2. 未定義指令


          當(dāng)ARM的處理器或協(xié)處理器遇到不能處理的指令時,產(chǎn)生未定義指令異常,采用這個機制,可以通過軟件仿真擴展ARM或Thumb 指令集.


          3. 軟件中斷(SWI)


          硬件中斷是有固定的硬件產(chǎn)生的中斷,而軟中斷是指沒具體的硬件產(chǎn)生,是CPU虛擬出來的.該異常由程序執(zhí)行匯編SWI產(chǎn)生.軟中斷的優(yōu)點,


          可用于用戶模式下的程序調(diào)用特權(quán)操作指令.Linux 系統(tǒng)調(diào)用就是使用這個異常來實現(xiàn)的.


          有利用程序結(jié)構(gòu)的優(yōu)化.比如在Linux 驅(qū)動里,硬件中斷不能長時間運行.但是很多軟件的長時間操作依賴的于中斷的調(diào)用.有時為解決這個沖突,會在驅(qū)動設(shè)計兩級,從硬件存取用硬件中斷,而長時間操作用軟件中斷的模擬.


          4. 指令預(yù)取中止


          若處理預(yù)取的指令的地址不存在,或該地址不允許當(dāng)前指令訪問,存儲器會向處理器發(fā)出中止信號,但當(dāng)預(yù)取的指令被執(zhí)行時,才會產(chǎn)生指令預(yù)取中止的異常.比如用ADS把程序下載到開發(fā)板上0x8000地址上.就會產(chǎn)生Abort異常.


          5. 數(shù)據(jù)中止


          若處理器數(shù)據(jù)訪問數(shù)據(jù)的地址不存在,或該地址不允許當(dāng)前指令訪問時,產(chǎn)生數(shù)據(jù)中止異常


          6. IRQ


          當(dāng)外部設(shè)備在外部中斷腳產(chǎn)生中斷信號時.即觸發(fā)了IRQ中斷.這是外部設(shè)備使用最常用的一種手段.


          在S3C24X0是一個集成的SOC,內(nèi)部除了ARM模塊以外.還其它內(nèi)部集成的模塊,如USB,RTC,等.這一些模塊在CPU內(nèi)部也會有相應(yīng)的中斷線連到ARM920T的內(nèi)核上.但這一些管腳在CPU外部是不可見的,只能用于寄存器去控制.


          還一些GPIO腳就充當(dāng)外部中斷控制線,外部IC可以把自己中斷信號線連到相應(yīng)的中斷腳上.當(dāng)外部產(chǎn)中斷信號后,CPU就可以知道,外設(shè)有中斷發(fā)來.


          7. FIQ


          快速中斷,類似于IRQ,但是具有較快響應(yīng)速度.而且設(shè)為FIQ的條件也比較嚴(yán)格,比如一次觸發(fā)只能有一個FIQ





          一句話,中斷(IRQ,F(xiàn)IQ,SWI)是異常中的一個特例。當(dāng)產(chǎn)生外部中斷時,大部分CPU會只產(chǎn)生一個異常。在異常處理程序里軟件再去讀不同的中斷寄存器分析后來調(diào)用ISR。這里ISR是由軟件來執(zhí)行的。象S3C2440就是這樣機制。





          S3C6410中,還可以采用簡化的中斷處理流程。由CPU直接去調(diào)用中斷的ISR來處理。 這樣中斷處理軟件的編寫難度就大大下降了。








          向量(vector)


          異常處理函數(shù)或中斷處理函數(shù)的地址都會按中斷號的順離順序排列在一個連續(xù)的內(nèi)存當(dāng)中,從C語言的角度來看,可以看成是一個指針數(shù)組。數(shù)組又稱為向量(Vector).




          如果你熟悉S3C2440的中斷處理機制,可以發(fā)現(xiàn)S3C6410大大簡化的中斷編程處理。


          相對于S3C2440詳細(xì)而豐富的關(guān)于中斷的解釋,S3C6410的dataSheet明顯是趕工之作,關(guān)于中斷只有短短的15頁,大量內(nèi)容還是寄存器表格。

          因此以下大部分我從S3C6410的測試程序和Application Note反推出來的。并且重新用ADS寫程序驗證了。



          S3C6410的中斷主要改進是.

          增加中斷向量控制器,這樣在S3C2440里需要用軟件來跳轉(zhuǎn)的中斷處理機制,在S3C6410完全由硬件來跳轉(zhuǎn)。你只要把ISR地址是存在連續(xù)向量寄存器空間,而不是象S3C2440自行分配空間自行管理。

          換句話說,在S3C2440下是由CPU觸發(fā)IRQ/FIQ異常,由異常處理函數(shù)里再查找相關(guān)中斷寄存器來跳到指定的ISR,而可以全部由S3C6410的VIC硬件來自動處理。 這個大大簡化中斷處理編程。

          另一個是外部中斷加入濾波電路,這樣原來需要軟件去毛刺的地方均可以采用硬件來進行濾波了,這樣大大簡化外部中斷處理。



          S3C6410 中斷操作
          --------------------------------------------------------------------

          S3C6410 中斷號




          64個中斷按硬件分組分成VIC0, VIC1兩個組,各組由一個相應(yīng)寄存器來處理。
          中斷號為0-31是VIC0組
          中斷號為32-63是VIC1組

          S3C6410中斷操作很簡單。

          打開中斷 VICxINTENABLE
          x為0,1,0-31中斷使用VIC0INTENABLE,32-63中斷使用VIC1INTENABLE.以下各寄存器均同,不再重復(fù).

          對應(yīng)位為1表示這個中斷可用,如0號中斷有效,是VIC0INTENABLE的第0位為1


          關(guān)閉一個中斷
          向VICxINTENCLEAR對應(yīng)位置1表示關(guān)閉這個中斷.


          設(shè)置中斷類型
          設(shè)置某一個中斷是IRQ還是FIQ,注意只有一個中斷才能FIQ.設(shè)置對應(yīng)位1表示設(shè)為FIQ模式。



          設(shè)置S3C6410的向量地址(ISR地址)
          注意在S3C6410自已從了各用32個地址連續(xù)的寄存器然成兩個寄存器數(shù)組。首地址分別是0x71200100和0x71300100.你可以象指針數(shù)組一樣來操作它們,數(shù)組的下標(biāo)就是中斷號,每個中斷源對應(yīng)自己的中斷地址位,共64個中斷源,所以是兩個32*32的數(shù)組。
          這樣設(shè)置讓開發(fā)者大大簡單化ISR的向量組織。


          設(shè)置中斷優(yōu)先級
          這個也采用用32*2寄存器形成兩個優(yōu)先級數(shù)組。每一個寄存器對應(yīng)優(yōu)先級別,取值范圍在0-15之間.

          中斷運行后指示
          這個因為了用VIC,現(xiàn)在省掉了S3C2440一大堆的SRCPND,INTPND,INTOFFSET,SUBSRCPND等寄存器。直接由VICxADDRESS來指示當(dāng)前的ISR地址。




          注意這個VICxADDRESS的寄存器,在S3C6410里稱為在System BUS.調(diào)用。這種方式不建議調(diào)用,因為這種模式相當(dāng)于S3C2440的用軟件進行ISR跳轉(zhuǎn).
          這三星的給的參考流程。



          更為簡單的調(diào)用方式.是VIC port 模式,是我強烈推薦的模式,它是系統(tǒng)產(chǎn)生中斷后,將由VIC直接去執(zhí)行相應(yīng)的ISR。這不僅上編程變成簡單,而且效率上更快,因為它沒有訪問VICxADDRESS和在System BUS執(zhí)行的時間
          使用這種模式,只需要在啟動加上特定的代碼

          外部中斷編程

          除INT_EINT0-INT_EINT4以外,全部中斷是由S3C6410內(nèi)部的模塊觸發(fā)的。稱為內(nèi)部中斷


          INT_EINT0-INT_EINT4是外部中斷,是由CPU外的外設(shè)來觸發(fā)的,它的觸發(fā)哪一個中斷取決外設(shè)聯(lián)接哪一個GPIO中斷腳。
          象開發(fā)板的網(wǎng)絡(luò)控制器,按鈕等都是掛在某一些GPIO腳上。它們都是使用典形外部中斷.

          外部中斷腳
          S3C6410 分9組GPIO腳來充當(dāng)外部中斷腳
          第0組,共28腳.GPN0-GPN15 (16腳),GPL8-GPL14(7腳),GPM0-GPM4 (5腳)
          第1組,由GPA0-GPA7,8個中斷腳,GPB0-GPB7,8個中斷腳
          第2組,由GPC0-GPC0,共8個中斷腳…

          第8組,由GPP0-GPP14,共15個中斷腳
          第9組,由GPQ0-GPQ8,共9個中斷腳

          外部中斷號

          第0組的第0腳到第3腳的設(shè)備將觸INT_EINT0=0中斷
          第0組的第4-11腳將觸發(fā)INT_EINT1=1中斷
          第0組的第12-19腳將觸發(fā)INT_EINT2=32中斷
          第0組的第20-27腳將觸發(fā)INT_EINT3=33中斷
          第1組-第9組所有設(shè)備只觸發(fā)INT_EINT4=53中斷

          我們可以看到,每一個組都是多個中斷腳共享一個中斷號的。其中第0組比較常用,占用了3個中斷號,每個管腳都有各自的子中斷。1-9組共享一個中斷號,每一組一個子中斷源。


          ??在ISR中,如何判斷是哪一個中斷腳的產(chǎn)生中斷?

          不同的IO腳上多個設(shè)備產(chǎn)生同一個中斷,軟件如何知道是哪一個腳?
          由External Interrupt Pending Register 來判斷

          第0組由EINT0PEND來判斷,腳位對應(yīng)可以參考上圖,不是很規(guī)整。

          第1,2組由EINT12PEND來判斷


          依此類推,EINT34PEND,EINT56PEND, 一直到EINT9PEND 來指示

          外部中斷信號類型

          這里設(shè)置中斷產(chǎn)生何種信號才會被捕獲。主要是五種,低電平,高電平,上升沿,下降沿或者兩者均可,
          第0組用 EINT0CON0/EINT0CON1兩個寄存器來設(shè)定.




          第1,2組采用 EINT12CON ,
          第3,4組采用EINT34CON,
          依此類推

          臨時關(guān)閉外部中斷
          EINTxMask是臨時性關(guān)閉中斷
          為1表示關(guān)閉某一個中斷,為表示打開0,一般只要需要使用中斷才會打開。


          EINT0MASK是第0組的使用


          EINT12MASK是第1,2組的中斷掩碼


          依次類推...

          定義硬件濾波類型


          對于一些波形不規(guī)整的外部中斷信號,可以通過濾波電路讓其變成規(guī)整,這樣會簡化軟件的編寫.


          S3C6410有兩種濾波電路,一種延時濾波(如按鈕類中斷可以采用這一類型),一種是數(shù)字采樣濾波.第二種濾波電路還要設(shè)采樣寬度。


          第0組的濾波用EINT0FLTCON0,EINT0FLTCON1, EINT0FLTCON2, EINT0FLTCON3配置.


          FLTEN表示是否打開濾波功能,FLTSEL是設(shè)置濾波方式,EINTn表示數(shù)字濾波采校的寬度

          第1,2組的濾波采用 EINT12FLTCON
          第3,4組的濾波采用 EINT34FLTCON


          第9組濾波 采用EINT9FLTCON

          外部中斷編程

          外部中斷除了中斷編程所有流程外,
          一般額外配置相應(yīng)的GPxCON配置成中斷腳。
          還要配置濾波方式和中斷信號方式。



          還要打開外部中斷掩碼

          在ISR中,在最后除了要把VICxADDRESS清0外,還需要清除 VICxSOFTINTCLEAR相應(yīng)位。

          軟件中斷編程
          -------------------------------------------------------------
          在S3C6410有64個軟中斷(與硬件中斷對應(yīng)),這一段描述是非常含糊。是同一硬件中斷可以用軟件觸發(fā)還是是,有一個完全對應(yīng)的軟件中斷?這個需要軟件來驗證.

          軟中斷除硬件中斷的所有流程還要加上如下兩條.
          用VICxSOFTINT來觸發(fā)軟中斷
          ISR退出時使用VICxSOFTINTCLEAR清除狀態(tài)

          軟中斷編程流程



          關(guān)鍵詞: S3C6410中斷外部中

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();