14.1 中斷體系
ARM 體系的CPU 有 7 種工作模式
用戶模式(usr):ARM 處理器正常的程序執(zhí)行狀態(tài)
快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理
中斷模式(irq):用戶通用的中斷處理
管理模式(svc):操作系統(tǒng)使用的保護(hù)模式
數(shù)據(jù)訪問終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)
系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)
未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真
可通過軟件來進(jìn)行模式切換,或者發(fā)生各類中斷、異常時(shí)CPU自動(dòng)進(jìn)入相應(yīng)的模式。除用戶模式外,其他6種工作模式都屬于特權(quán)模式,
ARM體系的CPU有以下兩種工作狀態(tài)
ARM 狀態(tài):此時(shí)處理器執(zhí)行 32 位的字對(duì)齊的 ARM 指令
Thumb 狀態(tài):此時(shí)處理器執(zhí)行 16 位的、半字對(duì)齊的 Thumb 指令
ARM920T 有 31 個(gè)通用的 32 位寄存器和 6 個(gè)程序狀態(tài)寄存器。這37個(gè)寄存器分位7組,進(jìn)入某個(gè)工作模式就使用哪組寄存器。在ARM狀態(tài)下,每種工作模式都有16個(gè)通用寄存器和1個(gè)(或2個(gè),取決于工作模式)程序寄存器。如下圖:
14.1.1 CPSR 寄存器
CPSR 寄存器稱為 當(dāng)前程序狀態(tài)寄存器
(1)條件碼標(biāo)志
N、Z、C、V均為條件碼標(biāo)志位。它們的內(nèi)容可被算術(shù)或邏輯運(yùn)算的結(jié)果所改變,并且可以決定某條指令是否被執(zhí)行。條件碼標(biāo)志各位的具體含義如下表所示:
標(biāo)志位 | 含 義 |
N | 當(dāng)用兩個(gè)補(bǔ)碼表示的帶符號(hào)數(shù)進(jìn)行運(yùn)算時(shí),N=1表示運(yùn)算的結(jié)果為負(fù)數(shù);N=0表示運(yùn)算的結(jié)果為正數(shù)或零 |
Z | Z=1表示運(yùn)算的結(jié)果為零,Z=0表示運(yùn)算的結(jié)果非零。 |
C | 可以有4種方法設(shè)置C的值: |
-加法運(yùn)算(包括CMP):當(dāng)運(yùn)算結(jié)果產(chǎn)生了進(jìn)位時(shí)(無符號(hào)數(shù)溢出),C=1,否則C=0。 | |
-減法運(yùn)算(包括CMP):當(dāng)運(yùn)算時(shí)產(chǎn)生了借位時(shí)(無符號(hào)數(shù)溢出),C=0,否則C=1。 | |
-對(duì)于包含移位操作的非加/減運(yùn)算指令,C為移出值的最后一位。 | |
-對(duì)于其它的非加/減運(yùn)算指令,C的值通常不會(huì)改變。 | |
V | 可以有2種方法設(shè)置V的值: |
-對(duì)于加減法運(yùn)算指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)位溢出 | |
-對(duì)于其它的非加/減運(yùn)算指令,V的值通常不會(huì)改變。 | |
Q | 在ARM V5及以上版本的E系列處理器中,用Q標(biāo)志位指示增強(qiáng)的DSP運(yùn)算指令是否發(fā)生了溢出。在其它版本的處理器中,Q標(biāo)志位無定義 |
在ARM狀態(tài)下,絕大多數(shù)的指令都是有條件執(zhí)行的;在THUMB狀態(tài)下,僅有分支指令是條件執(zhí)行的。
(2) 控制位
CPSR的低8位(包括I、F、T和M[4:0])稱為控制位,當(dāng)發(fā)生異常時(shí)這些位可以被改變。如果處理器運(yùn)行于特權(quán)模式時(shí),這些位也可以由程序修改。
中斷禁止位I、F:置1時(shí),禁止IRQ中斷和FIQ中斷。
T標(biāo)志位:該位反映處理器的運(yùn)行狀態(tài)。當(dāng)該位為1時(shí),程序運(yùn)行于THUMB狀態(tài),否則運(yùn)行于ARM狀態(tài)。該信號(hào)反映在外部引腳TBIT上。在程序中不得修改CPSR中的TBIT位,否則處理器工作狀態(tài)不能確定。
運(yùn)行模式位M[4:0]:這幾位是模式位,這些位決定了處理器的運(yùn)行模式。具體含義如下表所示:
保留位:CPSR中的其余位為保留位,當(dāng)改變CPSR中的條件碼標(biāo)志位或者控制位時(shí),保留位不要改變,在程序中也不要用保留位存儲(chǔ)數(shù)據(jù)。保留位將用于ARM版本的擴(kuò)展。
14.1.2 SPSR---程序狀態(tài)保存寄存器
當(dāng)切換進(jìn)入其他模式時(shí)候,在SPSR種保存前一個(gè)工作模式的 CPSR 的值,當(dāng)返回前一個(gè)工作模式時(shí),可以將 SPSR 的值恢復(fù)到 CPSR中。
當(dāng)一個(gè)異常發(fā)生時(shí),將切換進(jìn)入相應(yīng)的工作模式,這時(shí),CPU 核將自動(dòng)完成如下事情:
在異常工作模式的連接寄存器 R14 中保存前一個(gè)工作模式的下一條,即將執(zhí)行的指令的地址。對(duì)于ARM狀態(tài),這個(gè)值是當(dāng)前PC值加4或加8
將CPSR 的值復(fù)制到異常模式的 SPSR
將 CPSR 的工作模式位設(shè)為這個(gè)異常對(duì)應(yīng)的工作模式
令 PC 值等于這個(gè)異常模式在異常向量表中的地址,即跳轉(zhuǎn)去執(zhí)行異常向量表中的相應(yīng)指令。
從異常工作模式退出回到之前的工作模式時(shí),需要通過軟件完成如下事情:
前面進(jìn)入異常工作模式時(shí),連接寄存器中保存了前一工作模式的一個(gè)指令地址,將它減去一個(gè)適當(dāng)?shù)闹岛筚x值給 PC 寄存器
將 SPSR 的值復(fù)制給 CPSR
14.2 S3C2440 中斷控制器
CPU 運(yùn)行過程中通過兩種方法知道各類外設(shè)發(fā)生了某些不預(yù)期的事件:
查詢方式:程序循環(huán)地查詢各設(shè)備的狀態(tài)并作出相應(yīng)反應(yīng)。
中斷方式:當(dāng)某事件發(fā)生時(shí),硬件會(huì)設(shè)備某個(gè)寄存器;CPU 在每執(zhí)行完一個(gè)指令時(shí),通過硬件查看這個(gè)寄存器,如果發(fā)現(xiàn)所關(guān)注的事件發(fā)生了,則中斷當(dāng)前程序流程,跳轉(zhuǎn)到一個(gè)固定的物理地址處理這事件,最后返回繼續(xù)執(zhí)行被中斷的程序。
中斷處理過程:
中斷控制器匯集各類外設(shè)發(fā)出的中斷信號(hào),然后告訴 CPU
CPU 保存當(dāng)前程序的運(yùn)行環(huán)境(各個(gè)寄存器等),調(diào)用中斷服務(wù)程序(ISR,Interrupt Service Routine)來處理這些中斷
在 ISR 中通過讀取中斷控制器、外設(shè)的相關(guān)寄存器來識(shí)別這是哪個(gè)中斷,并進(jìn)行相應(yīng)的處理
清除中斷:通過讀寫中斷控制器和外設(shè)的相關(guān)寄存器來實(shí)現(xiàn)
最后恢復(fù)被中斷程序的運(yùn)行環(huán)境(即上面保存的各個(gè)寄存器等),繼續(xù)執(zhí)行
2440 的中斷處理框圖如下:
Request sources(without sub-register) 中的中斷源被觸發(fā)后,SRCPND 寄存器中相應(yīng)位被只1,如果此時(shí)中斷沒有被 INTMSK 寄存器屏蔽或者快速中斷(FIQ)的話,它將被進(jìn)一步處理
Request sources(with sub-register) 中的中斷源被觸發(fā)后,SUBSRCPND 寄存器中的相應(yīng)位被置1,如果此中斷沒有被 INTSUBMSK 寄存器屏蔽的話,它在 SRCPND 寄存器中的相應(yīng)位也被置 1 ,之后的處理過程與 上面 1 相同
在 SRCPND 寄存器中,被觸發(fā)的中斷的相應(yīng)位被置1,等待處理,如果被觸發(fā)的中斷中有快速中斷(FIQ)——MODE(INTMOD 寄存器)中為1的位對(duì)應(yīng)的中斷是 FIQ,則CPU進(jìn)入快速中斷模式(FIQ Mode)進(jìn)行處理
對(duì)于一般中斷IRQ,可能同時(shí)有幾個(gè)中斷被觸發(fā),未被 INTMSK 寄存器屏蔽的中斷經(jīng)過比較后,選出優(yōu)先級(jí)最后的中斷,此中斷在 INTPND 寄存器中的相應(yīng)位被置1,然后CPU進(jìn)入中斷模式(IRQ Mode)進(jìn)行處理。中斷服務(wù)程序可以通過讀取 INTPND 寄存器或者 INTOFFSET 寄存器來確定中斷源
1 objs := head.o init.o interrupt.o main.o
2
3 int.bin: $(objs)
4 arm-linux-ld -Ttext 0x00000000 -o int_elf $^
5 arm-linux-objcopy -O binary -S int_elf $@
6 arm-linux-objdump -D -m arm int_elf > int.dis
7
8 %.o:%.c
9 arm-linux-gcc -Wall -O2 -c -o $@ $<
10
11 %.o:%.S
12 arm-linux-gcc -Wall -O2 -c -o $@ $<
13
14 clean:
15 rm -f int.bin int_elf int.dis *.o
interrupt.c
1 #include 's3c24xx.h'
2
3 void EINT_Handle()
4 {
5 unsigned long oft = INTOFFSET;
6 unsigned long val;
7
8 switch( oft )
9 {
10 // S2被按下
11 case 0:
12 {
13 GPFDAT |= (0x7<<4); // 所有LED熄滅
14 GPFDAT &= ~(1<<4); // LED1點(diǎn)亮
15 break;
16 }
17
18 // S3被按下
19 case 2:
20 {
21 GPFDAT |= (0x7<<4); // 所有LED熄滅
22 GPFDAT &= ~(1<<5); // LED2點(diǎn)亮
23 break;
24 }
25
26 // K4被按下
27 case 5:
28 {
29 GPFDAT |= (0x7<<4); // 所有LED熄滅
30 GPFDAT &= ~(1<<6); // LED4點(diǎn)亮
31 break;
32 }
33
34 default:
35 break;
36 }
37
38 //清中斷
39 if( oft == 5 )
40 EINTPEND = (1<<11); // EINT8_23合用IRQ5
41 SRCPND = 1< s3c24xxx.h 1 /* WOTCH DOG register */ 2 #define WTCON (*(volatile unsigned long *)0x53000000) 3 4 /* SDRAM regisers */ 5 #define MEM_CTL_BASE 0x48000000 6 #define SDRAM_BASE 0x30000000 7 8 /* NAND Flash registers */ 9 #define NFCONF (*(volatile unsigned int *)0x4e000000) 10 #define NFCMD (*(volatile unsigned char *)0x4e000004) 11 #define NFADDR (*(volatile unsigned char *)0x4e000008) 12 #define NFDATA (*(volatile unsigned char *)0x4e00000c) 13 #define NFSTAT (*(volatile unsigned char *)0x4e000010) 14 15 /*GPIO registers*/ 16 #define GPBCON (*(volatile unsigned long *)0x56000010) 17 #define GPBDAT (*(volatile unsigned long *)0x56000014) 18 19 #define GPFCON (*(volatile unsigned long *)0x56000050) 20 #define GPFDAT (*(volatile unsigned long *)0x56000054) 21 #define GPFUP (*(volatile unsigned long *)0x56000058) 22 23 #define GPGCON (*(volatile unsigned long *)0x56000060) 24 #define GPGDAT (*(volatile unsigned long *)0x56000064) 25 #define GPGUP (*(volatile unsigned long *)0x56000068) 26 27 #define GPHCON (*(volatile unsigned long *)0x56000070) 28 #define GPHDAT (*(volatile unsigned long *)0x56000074) 29 #define GPHUP (*(volatile unsigned long *)0x56000078) 30 31 32 33 /*UART registers*/ 34 #define ULCON0 (*(volatile unsigned long *)0x50000000) 35 #define UCON0 (*(volatile unsigned long *)0x50000004) 36 #define UFCON0 (*(volatile unsigned long *)0x50000008) 37 #define UMCON0 (*(volatile unsigned long *)0x5000000c) 38 #define UTRSTAT0 (*(volatile unsigned long *)0x50000010) 39 #define UTXH0 (*(volatile unsigned char *)0x50000020) 40 #define URXH0 (*(volatile unsigned char *)0x50000024) 41 #define UBRDIV0 (*(volatile unsigned long *)0x50000028) 42 43 44 /*interrupt registes*/ 45 #define SRCPND (*(volatile unsigned long *)0x4A000000) 46 #define INTMOD (*(volatile unsigned long *)0x4A000004) 47 #define INTMSK (*(volatile unsigned long *)0x4A000008) 48 #define PRIORITY (*(volatile unsigned long *)0x4A00000c) 49 #define INTPND (*(volatile unsigned long *)0x4A000010) 50 #define INTOFFSET (*(volatile unsigned long *)0x4A000014) 51 #define SUBSRCPND (*(volatile unsigned long *)0x4A000018) 52 #define INTSUBMSK (*(volatile unsigned long *)0x4A00001c) 53 54 /*external interrupt registers*/ 55 #define EINTMASK (*(volatile unsigned long *)0x560000a4) 56 #define EINTPEND (*(volatile unsigned long *)0x560000a8) head.S 1 @****************************************************************************** 2 @ File:head.S 3 @ 功能:初始化,設(shè)置中斷模式、管理模式的棧,設(shè)置好中斷處理函數(shù) 4 @******************************************************************************
上一篇:Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步I/O
下一篇:GCC編譯器原理(三)------編譯原理三:編譯過程(3)---編譯之匯編以及靜態(tài)鏈接【2】
推薦閱讀最新更新時(shí)間:2025-07-01 01:18





設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- LTC1871、4.5V 至 15V 輸入、12.0V/2A 輸出 SEPIC 轉(zhuǎn)換器
- AMSRL-7815-NZ 15V 高達(dá) 7.5 瓦 DC-DC 開關(guān)穩(wěn)壓器的典型應(yīng)用
- CY8C5888AXI-LP096 CY8C58LP PSoC 5LP 可編程片上系統(tǒng)的典型應(yīng)用
- AM1D-0512S-RZ 12V 1 瓦 DC/DC 轉(zhuǎn)換器的典型應(yīng)用
- DER-526 - 18W非調(diào)光非隔離降壓-升壓LED驅(qū)動(dòng)器
- 使用 Richtek Technology Corporation 的 RT8011APQW 的參考設(shè)計(jì)
- 使用 Analog Devices 的 LT1317IS8 的參考設(shè)計(jì)
- AM1D-1505SH30-RZ 5V 1W DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- LTC4089 的典型應(yīng)用,全功能鋰離子電池充電器
- 使用 ON Semiconductor 的 NUD4022 的參考設(shè)計(jì)
- 無刷電機(jī)的工作原理及優(yōu)勢(shì)是什么
- 泰克示波器MSO5系列進(jìn)行基本信號(hào)獲取和探頭補(bǔ)償?shù)牟僮鞣椒?/a>
- 汽車網(wǎng)絡(luò)安全問題頻出 車企做了什么?
- STM32的GPIO工作原理
- TDR測(cè)量的基本原理與應(yīng)用
- PW3390功率分析儀的功能特性及應(yīng)用范圍
- 晶心科技和 IAR攜手助力奕力科技加速開發(fā)其符合ISO 26262標(biāo)準(zhǔn)的TDDI SoC ILI6600A
- OPPO Find X6 Pro 較上一代產(chǎn)品銷量同比增長129%
- 征程5賦能,東軟睿馳高性能行泊一體域控制器量產(chǎn)落地
- 納祥科技2W 24位數(shù)字功放NX4920,可用于AI語音播報(bào)、WIFI播放器
- 常用解調(diào)器的定義和工作原理
- 從性能與網(wǎng)絡(luò)傳輸出發(fā),講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業(yè)與酒店業(yè)運(yùn)營模式
- 跨國商務(wù)溝通困局破解之道:時(shí)空壺 W4Pro 全場(chǎng)景應(yīng)用解析
- 從矢量降噪到雙向同傳,時(shí)空壺 W4Pro 如何重構(gòu) AI 同傳技術(shù)標(biāo)準(zhǔn)?
- LoRa+NB-IoT雙模融合,地下車庫信號(hào)盲區(qū)電梯場(chǎng)景等的冗余通信
- LoRa與UWB的“定位之戰(zhàn)”,成本敏感場(chǎng)景高精度需求的場(chǎng)景切割
- 時(shí)空壺X1再升級(jí):引領(lǐng)AI同傳新時(shí)代,革新演講翻譯體驗(yàn)
- ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測(cè)試方案
- 英特爾 5g不只是無線互聯(lián),更是第四次工業(yè)革命基礎(chǔ)
- 第三方App曝隱私丑聞 允許員工閱讀用戶的郵件
- Android P Beta 3谷歌Material Design:UI調(diào)整
- 華為新專利:把一對(duì)兒無線耳機(jī)塞進(jìn)
- 谷歌Pixel 3透視圖曝光:后置單攝+背部指紋
- 廣東發(fā)布電動(dòng)汽車充電基礎(chǔ)設(shè)施建設(shè)技術(shù)規(guī)程
- 夏威夷通過非凡的太陽能+儲(chǔ)能來實(shí)現(xiàn)100%可再生能源的目標(biāo)
- 人類告別體力勞動(dòng)的日子,可能真的就不遠(yuǎn)了
- 2019年中國機(jī)器人產(chǎn)業(yè)發(fā)展趨勢(shì)預(yù)測(cè)
- 中國搬運(yùn)碼垛機(jī)器人企業(yè)集中在這三個(gè)地方