s3c2410中斷異常處理流程
在進(jìn)入正題之前,我想先把ARM920T的異常向量表(Exception Vectors)做一個(gè)簡(jiǎn)短的介紹。:]
本文引用地址:http://dyxdggzs.com/article/150005.htmARM920T的異常向量表有兩種存放方式,一種是低端存放(從0x00000000處開(kāi)始存放),另一種是高端存放(從0xfff000000處開(kāi)始存放)。關(guān)于為什么要分兩種方式進(jìn)行存放這點(diǎn)我將在介紹MMU的文章中進(jìn)行說(shuō)明,本文采用低端模式。ARM920T能處理有8個(gè)異常,他們分別是:
Reset,
Undefined instruction,
Software Interrupt,
Abort (prefetch),
Abort(data),
Reserved,
IRQ,
FIQ
下面是某個(gè)采用低端模式的系統源碼片段:
/*****************************************************************************
_start:
b
Handle_Reset
b HandleUndef
b HandleSWI
b
HandlePrefetchAbort
b HandleDataAbort
b
HandleNotUsed
b HandleIRQ
b
HandleFIQ
…..
…
..
other
codes
…
..
.
*****************************************************************************/
上面這部分片段一般出現在一個(gè)名叫“head.s”的匯編文件的里,“b
Handle_Reset”這條語(yǔ)句就是系統上電之后運行的第一條語(yǔ)句。也就是說(shuō)這部分代碼的二進(jìn)制碼必須位于內存的最開(kāi)始部分(這正是低端存放模式),因為上電后CPU會(huì )從SDRAM的0x00000000處取第一條指令并執行。
Address
Instruct
0x00000000: b
Handle_Reset
0x00000004: b
HandleUndef
0x00000008: b
HandleSWI
0x0000000C: b
HandlePrefetchAbort
0x00000010: b
HandleDataAbort
0x00000014: b
HandleNotUsed
0x00000018: b
HandleIRQ
0x0000001C: b
HandleFIQ
上面是該程序段在系統上電后加載到內存后的分布情況,我們可以看到每條指令占用了4個(gè)字節。
上電后,PC指針會(huì )跳轉到Handle_Reset處開(kāi)始運行。以后系統每當有異常出現,則CPU會(huì )根據異常號,從內存的0x00000000處開(kāi)始查表做相應的處理,比如系統觸發(fā)了一個(gè)IRQ異常,IRQ為第6號異常,則CPU將把PC指向0x00000018地址(4*6=24=
0x00000018)處運行,該地址的指令是跳轉到“中斷異常服務(wù)例程”(HandleIRQ)處運行。以上就是我對異常向量表的一個(gè)簡(jiǎn)單介紹?,F在可以進(jìn)入我們文章的主題
“中斷異常處理”,s3c2410的中斷分快中斷(FIQ)和普通中斷(IRQ),我們討論的重點(diǎn)是普通中斷(IRQ)。
評論