周立功在startup.s檔案中新增了一段支援軟中斷的**,**如下:
;軟中斷
softwareinterrupt
; b softwareinterrupt
;//增加開/關中斷處理 chenxibing-2004-02-09
cmp r0, #4//判斷傳過來的引數是否大於4
ldrlo pc, [pc, r0, lsl #2]//小於4(引數正確),pc = pc + r0*4進行查表
movs pc, lr
swifunction
dcd irqdisable ;0
dcd irqenable ;1
dcd fiqdisable ;2
dcd fiqenable ;3
irqdisable
;關irq中斷
mrs r0, spsr
orr r0, r0, #noint
msr spsr_c, r0
movs pc, lr
irqenable
;開irq中斷
mrs r0, spsr
bic r0, r0, #noint
msr spsr_c, r0
movs pc, lr
fiqdisable
;關fiq中斷
mrs r0, spsr
orr r0, r0, #nofiq
msr spsr_c, r0
movs pc, lr
fiqenable
;開fiq中斷
mrs r0, spsr
bic r0, r0, #nofiq
msr spsr_c, r0
movs pc, lr
;// changed 2004-12-09
我們平時想使用軟中斷irq的時候,我們會在我們的應用程式中使用如下語句:
irqdisable()
我們細細看,會發現它在target.h檔案中定義,如下:
__swi(0x00) void swihandle1(int handle);
#define irqdisable() swihandle1(0)
#define irqenable() swihandle1(1)
#define fiqdisable() swihandle1(2)
#define fiqenable() swihandle1(3)
__swi是ads編譯器的關鍵字,用它做字首可以宣告乙個軟中斷呼叫,格式為:
__swi(功能號) 返回值 名稱 (引數列表)
功能號:即軟中斷指令中的24位立即數,軟中斷號
名 稱:即呼叫軟中斷時用於描述軟中斷的函式名稱
參 數:軟中斷函式的引數,根據atpcs規則,如果軟中斷函式有不超過4個引數時,通過r0~r3傳遞,超過4個引數時用堆疊來傳遞。
—swi(0x00) void swihandle1(int handle)。其中0x00為軟中斷功能號(軟中斷號);軟中斷函式名稱為swihandle1;只有乙個引數,則使用r0來傳遞;函式沒有返回值。
緊接著這句**的是定義了4個巨集,分別表示禁能irq函式、使能irq函式、禁能fiq函式、使能ifq函式,其實呼叫的軟中斷函式是一樣的,只是引數不同而已。例如在使用者程式中呼叫「irqenable( );」時,處理器會產生軟中斷。
位於啟動**中的那些是軟中斷處理函式,當發生軟中斷時,pc被強制指向0x00000008(ldr pc, swi_addr),這個位址中存放的是軟中斷異常的處理函式的位址(swi_addr dcd softwareinterrupt),所以程式會跳轉至標號「softwareinterrupt 」處執行。softwareinterrupt 函式的功能是判斷r0的值(r0的值為軟中斷函式傳遞過來的引數)是否小於4,如果小於4則跳轉至標號「swifunction」執行,如果不是則函式返回。swifunction函式是乙個散轉函式,它的功能是根據r0的值跳轉至對應的函式處執行,即如果引數為1,則函式會跳轉至irqenable處執行,將irq中斷使能。
LPC2000系列學習筆記4 儲存器對映控制
對於一般的處理器,系統啟動後是從0x00000000 位址開始讀取中斷向量表並引導程式的。但利用lpc2000 的儲存器重對映功能,我們可以將中斷向量表轉移至其它儲存器,而不一定要從0x00000000 這個位址讀取。lpc2000 的這個功能是通過儲存器對映控制暫存器memmap 和boot 管腳...
Linux2 6軟中斷分析
linux2.6 的軟中斷框架與 2.4相比有了一些不同 2.2之前的傳統bottom half已經幾乎沒有了,任務佇列被取消,軟中斷的呼叫時機也有所不同。下面分析一下 2.6軟中斷的框架。2.6中軟中斷還是由函式 do softirq 呼叫,但異常和系統呼叫返回 排程時不再執行軟中斷,執行時機變為...
Linux中軟中斷機制分析
什麼是軟中斷機制?linux中的軟中斷機制用於系統中對時間要求最嚴格以及最重要的中斷下半部進行使用。在系統設計過程中,大家都清楚中斷上下文不能處理太多的事情,需要快速的返回,否則很容易導致中斷事件的丟失,所以這就產生了乙個問題 中斷發生之後的事務處理由誰來完成?在前後台程式中,由於只有中斷上下文和乙...