<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

S3C6410中斷以及外部中斷

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

本文引用地址:http://dyxdggzs.com/article/201611/318392.htm

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

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

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


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

Exception(異常), 計算機體系結構中,異?;蛘咧袛嗍翘幚硐到y中突發(fā)事件的一種機制,幾乎所有的處理器都提供這種機制。異常主要是從處理器被動(dòng)接受的角度出發(fā)的一種描述,指意外操作引起的異常。而中斷則帶有向處理器主動(dòng)申請的意味。但這兩種情況具有一定的共性,都是請求處理器打斷正常的程序執行流程,進(jìn)入特定程序的一種機制。


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


1. 復位(Reset)


當按下RESET鍵后,會(huì )產(chǎn)生一個(gè)復位異常,此時(shí)程序跳轉到復位異常處理程序處執行.當CPU重啟后.一般剛好跳到這個(gè)復位異常來(lái)


2. 未定義指令


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


3. 軟件中斷(SWI)


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


可用于用戶(hù)模式下的程序調用特權操作指令.Linux 系統調用就是使用這個(gè)異常來(lái)實(shí)現的.


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


4. 指令預取中止


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


5. 數據中止


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


6. IRQ


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


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


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


7. FIQ


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





一句話(huà),中斷(IRQ,FIQ,SWI)是異常中的一個(gè)特例。當產(chǎn)生外部中斷時(shí),大部分CPU會(huì )只產(chǎn)生一個(gè)異常。在異常處理程序里軟件再去讀不同的中斷寄存器分析后來(lái)調用ISR。這里ISR是由軟件來(lái)執行的。象S3C2440就是這樣機制。





S3C6410中,還可以采用簡(jiǎn)化的中斷處理流程。由CPU直接去調用中斷的ISR來(lái)處理。 這樣中斷處理軟件的編寫(xiě)難度就大大下降了。








向量(vector)


異常處理函數或中斷處理函數的地址都會(huì )按中斷號的順離順序排列在一個(gè)連續的內存當中,從C語(yǔ)言的角度來(lái)看,可以看成是一個(gè)指針數組。數組又稱(chēng)為向量(Vector).




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


相對于S3C2440詳細而豐富的關(guān)于中斷的解釋?zhuān)琒3C6410的dataSheet明顯是趕工之作,關(guān)于中斷只有短短的15頁(yè),大量?jì)热葸€是寄存器表格。

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



S3C6410的中斷主要改進(jìn)是.

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

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

另一個(gè)是外部中斷加入濾波電路,這樣原來(lái)需要軟件去毛刺的地方均可以采用硬件來(lái)進(jìn)行濾波了,這樣大大簡(jiǎn)化外部中斷處理。



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

S3C6410 中斷號




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

S3C6410中斷操作很簡(jiǎn)單。

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

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


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


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



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


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

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




注意這個(gè)VICxADDRESS的寄存器,在S3C6410里稱(chēng)為在System BUS.調用。這種方式不建議調用,因為這種模式相當于S3C2440的用軟件進(jìn)行ISR跳轉.
這三星的給的參考流程。



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

外部中斷編程

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


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

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

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

外部中斷號

第0組的第0腳到第3腳的設備將觸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組所有設備只觸發(fā)INT_EINT4=53中斷

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


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

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

第0組由EINT0PEND來(lái)判斷,腳位對應可以參考上圖,不是很規整。

第1,2組由EINT12PEND來(lái)判斷


依此類(lèi)推,EINT34PEND,EINT56PEND, 一直到EINT9PEND 來(lái)指示

外部中斷信號類(lèi)型

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




第1,2組采用 EINT12CON ,
第3,4組采用EINT34CON,
依此類(lèi)推

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


EINT0MASK是第0組的使用


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


依次類(lèi)推...

定義硬件濾波類(lèi)型


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


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


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


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

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


第9組濾波 采用EINT9FLTCON

外部中斷編程

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



還要打開(kāi)外部中斷掩碼

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

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

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

軟中斷編程流程



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>