linuxarm中斷
❶ 在arm-linux下,如何確定中斷號
這個由主板的硬體決定。
❷ arm linux下的串口中斷有沒有像單片機的開中斷和關中斷的控制位
linux下串口屬於用戶空間的問題。
中斷屬於內核控制項的問題。
如果需要對中斷進行操作,
要看你的驅動有沒有在ioctl函數中做了相應支持。
❸ Linux如何及時響應外部中斷
FPGA每隔100us給運行linux的ARM一個中斷,要求在20us內響應中斷,並讀走2000*16bit的數據。
目前主要的問題是,當系統同時發生多個中斷時,會嚴重影響linux對FPGA中斷的響應時間。如何解決?
1、首先想到了ARM的FIQ,它可以打斷IRQ中斷服務程序,保證對外部FIQ的及時響應。但是發現linux只實現了IRQ,沒有顯示FIQ。
linux是從devicetree讀取中斷號,加入中斷向量表的。
interrupts = <0x0 0x32 0x0>;中的第一個欄位0表示非共享中斷,非零表示共享中斷,SDK產生的dts統一為0,此時第二欄位的值比XPS中的小32;如果第一欄位非零,則第二欄位比XPS小16.
最後欄位表示中斷的觸發方式。
IRQ_TYPE_EDGE_RISING =0x00000001,
IRQ_TYPE_EDGE_FALLING =0x00000002,
IRQ_TYPE_LEVEL_HIGH =0x00000004,
IRQ_TYPE_LEVEL_LOW =0x00000008,
很明顯,devicetree根本沒有提供通知linux有FIQ的渠道。
2、再來看linux的IRQ
linux的中斷分為上半部和下半部,上半部運行在IRQ模式,會屏蔽所有中斷,下半部運行在SVC模式,會重新打開中斷。
也就是說,當一個中斷的上半部正在運行時(不能再次響應中斷),FPGA的中斷是不能被linux響應的;
反過來,當FPGA中斷的上半部正在運行時(不能再次響應中斷),其他的中斷也不能被linux響應;
unsigned long flags;
...
local_irq_save(flags);
....
local_irq_restore(flags);
3.
ARM有七種模式,我們這里只討論SVC、IRQ和FIQ模式。
我們可以假設ARM核心有兩根中斷引腳(實際上是看不見的),一根叫 irq pin, 一根叫fiq pin.
在ARM的cpsr中,有一個I位和一個F位,分別用來禁止IRQ和FIQ的。
先不說中斷控制器,只說ARM核心。正常情況下,ARM核都只是機械地隨著pc的指示去做事情,當CPSR中的I和F位為1的時候,IRQ和FIQ全部處於禁止狀態。無論你在irq
pin和fiq pin上面發什麼樣的中斷信號,ARM是不會理你的,你根本不能打斷他,因為他耳聾了,眼也瞎了。
在I位和F位為0的時候,當irq
pin上有中斷信號過來的時候,就會打斷arm的當前工作,並且切換到IRQ模式下,並且跳到相應的異常向量表(vector)位置去執行代碼。這個過程是自動的,但是返回到被中斷打斷的地方就得您親自動手了。當你跳到異常向量表,處於IRQ的模式的時候,這個時候如果irq
pin上面又來中斷信號了,這個時候ARM不會理你的,irq
pin就跟秘書一樣,ARM核心就像老闆,老闆本來在做事,結果來了一個客戶,秘書打斷它,讓客戶進去了。而這個時候再來一個客戶,要麼秘書不斷去敲門問,要麼客戶走人。老闆第一個客戶沒有會見完,是不會理你的。
但是有一種情況例外,當ARM處在IRQ模式,這個時候fiq pin來了一個中斷信號,fiq
pin是什麼?是快速中斷呀,比如是公安局的來查刑事案件,那才不管你老闆是不是在會見客戶,直接打斷,進入到fiq模式下,並且跳到相應的fiq的異常向量表處去執行代碼。那如果當ARM處理FIQ模式,fiq
pin又來中斷信號,又就是又一批公安來了,那沒戲,都是執法人員,你打不斷我。那如果這個時候irq
pin來了呢?來了也不理呀,正在辦案,還敢來妨礙公務。
所以得出一個結論: IRQ模式只能被FIQ模式打斷,FIQ模式下誰也打不斷。
在打不斷的情況下,irq pin 或 fiq pin隨便你怎麼發中斷信號,都是白發。
所以除了fiq能打斷irq以外,根本沒有所謂中斷嵌套的情況。
Linux不用FIQ,只用到了IRQ。但是我們有時候一個中斷需要處理很長時間,那我們就需要佔用IRQ模式那麼長的時間嗎?沒有,linux在IRQ模式下只是簡單的記錄是什麼中斷,馬上就切換回了SVC模式,換句話說,Linux的中斷處理都是在SVC模式下處理的。
只不過SVC模式下的ISR上半部關閉了當前中斷線,下半部才重新打開
❹ 如何在ARM Linux內核中使用硬體斷點
在ARM Linux內核中使用硬體斷點 一般的CPU都支持硬體斷點,也就是通過處理器提供專門斷點寄存器保存一個地址,處理器在執行程序過程,會不斷去匹配,可以設置成不同的模式來觸發程序中斷,如執行到這個地址,讀這個地址或寫這個地址
❺ 現在在學arm Linux嵌入式,剛寫的裸機程序,想用中斷的方式來控制LED燈的亮滅,可為什麼我
硬體平台:FS2410開發平台:MDK3.5程序源碼:GPFCON EQU 0x56000050 ;Port F control GPFDAT EQU 0x56000054 ;Port F data GPFUP EQU 0x56000058 ;Pull-up control F AREA myarea, CODE ENTRY LDR r0, =0x5500 LDR r1, = GPFCON STR r0,[r1] LDR...
❻ arm linux如何限制大量高頻發硬體中斷
可以幫你不想要的文件刪除了這樣的話就不會沖動
❼ ARM +linux 驅動程序,GPIO中斷,上升沿觸發,請問處理器能夠承受的最大中斷頻率怎麼算!!!
你好!
理論上中斷頻率再高都不會導致系統死機。但是會導致觸發丟失,比如有100個觸發輸入,實際只產生了80個中斷。
而實際上,中斷頻率過高導致死機,很有的可能是因為中斷處理佔用太多CPU時間,導致其他程序的響應中斷,系統死機。而查詢方式能保證其他任務還有一定的CPU時間分配。
希望對你有所幫助,望採納。
❽ arm-linux 驅動編程中,C代碼中的IRQ_EINT(2)與硬體手冊中的XEINT2與外部中斷號2有什麼關系
EINT2表示外部中斷2,IRQ_EINT(2)是程序中的中斷號,對應的就是外部中斷EINT2
❾ linux 在中斷處理時,要進去SVC模式,請問這到底是什麼原因
對ARM來說,當發生中斷的時候,CPU進入的是中斷mode, 只是Linux在SVC mode下處理中斷了. 當然,理論上來說,不在SVC下,而在 中斷mode下處理也可以。我猜想Linux這樣做的原因是,Linux要兼容絕大多數的ARCH,每一個ARCH相關的代碼都放在arch/目錄下,比如ARM是放在arch/arm下。所以,如果arm要是不利用現有Linux的框架,把絕大多數的代碼都放在arch/arm下(中斷處理的代碼也放在arch/arm下的irq mode中處理),那linux就非常臃腫。所以,arm Linux為了最大程度的利用Linux已有的架構,就放在SVC模式下處理了(Linux最早是在i386上開發的,i386隻利用了2個ring, 即,ring0 和 ring 3, ring 0,對應於ARM的svc mode)。 事實上,到了現在的ARMV8,AARCH64已經取消了這么多的MODE,而採取了4個Level, 分別是 0,1,2,3. 對於OS來說,支持0和1 兩個Level就可以了, Level 2 是用於虛擬化,Level 3 是用於monitor.
當fiq中斷發生的時候,也會進入FIQ mode, 只是 在ARM SOC中,很少有FIQ的外設。所以,Linux中,沒有對FIQ進行處理,但介面還是有的。