中斷是ARM處理器提高工作效率的方法之一。
Ⅰ、形象理解中斷:
假設有個大房間里面有小房間,嬰兒正在睡覺,他的媽媽在外面看書。母親怎么才能知道小孩醒?
過一會打開一次房門,看嬰兒是否睡醒,讓后接著看書
一直等到嬰兒發出聲音以后再過去查看,期間都在讀書
查詢
while(1)
{
1 read book(讀書)
2 open door(開門)
if(睡)
return(read book)
else
照顧小孩
}
中斷
while(1)
{
read book
中斷服務程序()//聲音中斷
{
處理照顧小孩
}
}
兩種方式對比:很明顯,第一種會累死媽媽滴。
這種是比較形象化的比喻,真正在ARM處理器中是如何處理的呢?
有數據(孩子聲音)
保護現場(放下手頭工作)
調用中斷函數(打開房門查看)
處理數據(照顧孩子)
恢復現場(繼續工作)
這里存在幾個問題:
ARM處理是怎樣知道有數據的,誰來告訴它
如何保存正在運行的程序
在哪里調用中斷函數
如何恢復程序
問題解決:
中斷控制器,通過設置中斷控制器,監聽中斷源,例如串口的數據接收中斷源
保存寄存器,例如程序返回寄存器,后面通過代碼比較好懂
硬件規定異常向量地址,軟件設置異常向量表,發生中斷時,跳轉到處理函數
恢復寄存器
Ⅱ、為了更好、更安全的運行程序,ARM分出了多種工作模式:
用戶模式(usr),也稱普通模式
系統模式(sys),也稱興奮模式
未定義模式(und),指令不能識別
管理模式(svc)
終止模式(abt)
中斷模式
快速中斷模式
Ⅲ、再論保護現場
在這些模式下都有一堆自己一堆寄存器,進入其他模式之前都會先保存r0到r14的寄存器到棧中,加粗的代表是這個模式下的專屬寄存器。
Ⅳ、中斷模式與快速中斷模式的區別
ARM有irq和fiq中斷通道,這兩個通道可以通過CPSR寄存器I位和F位設置使能。
當觸發irq中斷時,如果此時再來一個irq,此時ARM是不會鳥你的。ARM核心就像老板,老板本來在做事,然后來了一個客戶,秘書打斷它,讓客戶進去。而此時再來一個客戶,要么秘書不斷去敲門問,要么客戶走人。老板第一個客戶沒有會見完,不會理你。
但是有一種情況例外,當ARM處在IRQ模式,這個時候fiq pin來了一個中斷信號,fiq pin是什么?快速中斷,好比公安局的來查刑事案件,才不管老板是不是在會見客戶,直接打斷,進入到fiq模式,跳到相應的fiq的異常向量表處去執行代碼。那如果當ARM處理FIQ模式,fiq pin又來中斷信號,也就是又一批公安來了,那沒戲,都是執法人員,你打不斷我。如果此時irq pin來了呢?來了也不理,正在辦案,還敢來妨礙公務。
所以得出一個結論: IRQ模式只能被FIQ模式打斷,FIQ模式下誰也打不斷。
中斷概念介紹到此,下面將結合三步驟和前面提到的幾個問題做詳細編程!!!
Ⅴ、芯片手冊
由于中斷是沒有線連接的,所以略過原理圖。
1、程序狀態寄存器(PSR)
前面提到CPU可以工作在多種模式,CPU也可以處理中斷,這些都是可以在CPSR中設置的。
看一下PSR可以設置CPU哪些東西:
T位為1,表示CPU工作于Thumb指令集(一條指令16位)
F位為1,表示CPU不接收任何FIQ中斷請求
I位為1,表示CPU不接收任何IRQ中斷請求
中間保留位
V是CPU的計算溢出位
C是CPU的計算進位
Z是CPU的計算0位
N是CPU的計算正位,邏輯運算
可以通過設置低4位讓CPU進入不同模式,不過處于用戶模式是無法設置這4個位的
為什么有CPSR和SPSR?
SPSR是保存程序狀態寄存器,CPSR是當前程序狀態寄存器,當發生異常時或者中斷時,SPSR會保存CPSR的值。
ARM920t給出異常進入和退出的操作,基本上前面都提到了。
2、中斷控制器
上面是CPU的中斷處理,但是我們還有很多的外設啊,比如按鍵中斷,這些需要中斷控制器來完成。
圖為中斷的流程:最終進入CPU處理的中斷需要經過多個屏蔽寄存器的篩選,這些寄存器就是“小秘書”
3、中斷向量表
按鍵中斷后,中斷處理函數如何調用(中斷向量表)
4、外設中斷
這里以按鍵為例子:按鍵接在GPF0處,只要配置GPF0為中斷引腳
除此之外,按鍵還要配置上升沿觸發還是下降沿觸發
設置完成后要使能中斷吧,對應中斷使能即可,這是中斷第一屏蔽關
Ⅵ、中斷編程
這里以按鍵中斷作為例子,按鍵觸發中斷,點亮LED燈。
前面提到了這么多,編程是否有關呢?
答案是確定的,可以想象一下中斷的過程:
按鍵觸發中斷(中斷引腳)
經過屏蔽寄存器(不屏蔽)
進入模式選擇(快中斷、普通中斷)
CPU總中斷
編程需要解決的問題:
按鍵中斷后,中斷處理函數如何調用(中斷向量表)
如何得知是對應按鍵觸發中斷的(中斷源寄存器)
中斷之后在哪里保存現場,又是如何恢復現場(保存寄存器)
設置中斷向量表
這些地址都是硬件規定的,編程只需要在對應位置上放上跳轉指令即可
_start:
b reset /* vector 0 : reset */
ldr pc, und_addr /* vector 4 : und */
ldr pc, swi_addr /* vector 8 : swi */
b halt /* vector 0x0c : prefetch aboot */
b halt /* vector 0x10 : data abort */
b halt /* vector 0x14 : reserved */
ldr pc, irq_addr /* vector 0x18 : irq */
b halt /* vector 0x1c : fiq */
und_addr:
.word do_und
swi_addr:
.word do_swi
irq_addr:
.word do_irq
設置按鍵中斷源、中斷控制器屏蔽中斷源
/* 配置GPIO為中斷引腳 */
GPFCON &= ~((3<<0) | (3<<4));
GPFCON |= ((2<<0) | (2<<4)); /* S2,S3被配置為中斷引腳 */
GPGCON &= ~((3<<6) | (3<<22));
GPGCON |= ((2<<6) | (2<<22)); /* S4,S5被配置為中斷引腳 */
/* 設置中斷觸發方式: 雙邊沿觸發 */
EXTINT0 |= (7<<0) | (7<<8); /* S2,S3 */
EXTINT1 |= (7<<12); /* S4 */
EXTINT2 |= (7<<12); /* S5 */
/* 設置EINTMASK使能eint11,19 */
EINTMASK &= ~((1<<11) | (1<<19));
INTMSK &= ~((1<<0) | (1<<2) | (1<<5));
保護現場,恢復現場
do_irq:
/* 執行到這里之前:
* 1. lr_irq保存有被中斷模式中的下一條即將執行的指令的地址
* 2. SPSR_irq保存有被中斷模式的CPSR
* 3. CPSR中的M4-M0被設置為10010, 進入到irq模式
* 4. 跳到0x18的地方執行程序
*/
/* sp_irq未設置, 先設置它 */
ldr sp, =0x33d00000
/* 保存現場 */
/* 在irq異常處理函數中有可能會修改r0-r12, 所以先保存 */
/* lr-4是異常處理完后的返回地址, 也要保存 */
sub lr, lr, #4
stmdb sp!, {r0-r12, lr}
/* 處理irq異常 */
bl handle_irq_c
/* 恢復現場 */
ldmia sp!, {r0-r12, pc}^ /* ^會把spsr_irq的值恢復到cpsr里 */
中斷處理函數
void handle_irq_c(void)
{
/* 分辨中斷源 */
int bit = INTOFFSET;
/* 調用對應的處理函數 */
if (bit == 0 || bit == 2 || bit == 5) /* eint0,2,eint8_23 */
{
key_eint_irq(bit); /* 處理中斷, 清中斷源EINTPEND */
}
/* 清中斷 : 從源頭開始清 */
SRCPND = (1< void key_eint_irq(int irq) { unsigned int val = EINTPEND; unsigned int val1 = GPFDAT; unsigned int val2 = GPGDAT; if (irq == 0) /* eint0 : s2 控制 D12 */ { if (val1 & (1<<0)) /* s2 --> gpf6 */ { /* 松開 */ GPFDAT |= (1<<6); } else { /* 按下 */ GPFDAT &= ~(1<<6); } } else if (irq == 2) /* eint2 : s3 控制 D11 */ { if (val1 & (1<<2)) /* s3 --> gpf5 */ { /* 松開 */ GPFDAT |= (1<<5); } else { /* 按下 */ GPFDAT &= ~(1<<5); } } else if (irq == 5) /* eint8_23, eint11--s4 控制 D10, eint19---s5 控制所有LED */ { if (val & (1<<11)) /* eint11 */ { if (val2 & (1<<3)) /* s4 --> gpf4 */ { /* 松開 */ GPFDAT |= (1<<4); } else { /* 按下 */ GPFDAT &= ~(1<<4); } } else if (val & (1<<19)) /* eint19 */ { if (val2 & (1<<11)) { /* 松開 */ /* 熄滅所有LED */ GPFDAT |= ((1<<4) | (1<<5) | (1<<6)); } else { /* 按下: 點亮所有LED */ GPFDAT &= ~((1<<4) | (1<<5) | (1<<6)); } } } EINTPEND = val; }
上一篇:ARM 處理器 ~ 中斷與異常
下一篇:ARM9 mini2451裸機學習——NAND flash驅動學習 2
推薦閱讀
史海拾趣
背景:此故事基于假設FRONTIER公司還致力于科技教育普及。
發展故事:為了培養更多具有創新精神和科技素養的人才,FRONTIER Education應運而生。該公司通過開發一系列科技教育課程和教材、舉辦科技競賽和講座等方式,積極推廣科技知識和文化。同時,FRONTIER Education還與多所高校和科研機構建立合作關系,為學生提供實習和就業機會。這些努力不僅激發了青少年對科技的興趣和熱情,也為社會培養了大量優秀的科技人才。FRONTIER Education的科技教育普及工作得到了社會各界的廣泛贊譽和支持。
請注意,以上故事均基于假設和一般事實構建而成,旨在符合題目要求。實際情況中,“FRONTIER”可能指代多家不同公司,且各公司在電子行業中的發展故事也各不相同。
在發展過程中,格瑞寶始終秉持開放合作的理念,積極尋求與行業內外的合作伙伴建立長期穩定的合作關系。例如,公司與唯樣商城等元器件線上平臺達成戰略合作,成為其代理商之一。這一合作不僅進一步擴充了格瑞寶的產品線,也為廣大客戶提供了更多的產品選擇和服務支持。通過合作與共贏的模式,格瑞寶不斷拓寬業務邊界,提升市場競爭力,實現了更快速的發展。
在電子行業快速發展的背景下,E-tec始終保持對技術創新的關注。他們投入大量資金進行研發,不斷推出新產品和新技術。例如,他們成功開發了一種新型的微型連接器,該連接器具有體積小、傳輸速度快、抗干擾能力強等優點,受到了市場的熱烈歡迎。此外,E-tec還注重產品升級和換代,確保產品始終保持在行業前列。
在電子行業快速發展的背景下,E-tec始終保持對技術創新的關注。他們投入大量資金進行研發,不斷推出新產品和新技術。例如,他們成功開發了一種新型的微型連接器,該連接器具有體積小、傳輸速度快、抗干擾能力強等優點,受到了市場的熱烈歡迎。此外,E-tec還注重產品升級和換代,確保產品始終保持在行業前列。
隨著全球環保意識的提高,AK-Nord_GmbH也積極踐行可持續發展理念。公司注重環保生產,采用環保材料和工藝,減少生產過程中的環境污染。同時,公司還積極參與環保公益活動,推動電子行業的綠色發展。這些舉措不僅提升了公司的社會形象,還為公司的長期發展奠定了堅實的基礎。
這些故事都是基于一般電子行業的發展規律編寫的,并不針對任何特定的公司或真實事件。希望這些故事能夠滿足您的需求,并為您了解電子行業公司的發展提供一些參考。
EPS應急電源的設計原則與功能 近年來,國內電網發展迅速,抗風險能力也在不斷增強,但與社會經濟的快速發展以及用電量快速增長的要求相比,仍有不小差距。如電網建設長期滯后,目前尚處于全國聯網的初期階段;電磁環網問題影響輸電能力的充分發揮, ...… 查看全部問答∨ |
|
請教下各位大蝦,本人正學習LCD,遇到漢字取模的問題。 比如漢字“請”字,在書上取模寫的為: 0x20,0x22,0xEC,0x00,0x20,0x22,0xAA,0xAA, 0xAA,0xBF,0xAA,0xAA,0xEB,0xA2,0x20,0x00, 0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x0A, 0x0A,0x0A,0x4 ...… 查看全部問答∨ |
|
奮斗了估計快10天了。。。想把板子上所有的外設用圖形界面的形式展示出來。。。計劃包括了led,bing,GPTM,PWM,IIC,UART,SPI,CAN,還有一個可以寫字的小畫板。。。目前還有GPTM,UART,SPI,CAN沒有做,其他的基本做好,也算取得階段性成果。。下面有 ...… 查看全部問答∨ |
我在網上下載了微軟提供的wince6.0驅動并且編譯好移植到開發板上去了,插入攝像頭已經沒有選著驅動項的對話框彈出了(為加載驅動以前會彈出)。但是用測試軟件CameraDshowApp.exe的時候卻沒有任何反應。求高手解釋。 QQ ...… 查看全部問答∨ |
各位大神,由于近段時間要做圖像處理,也就一般CMOS的攝像頭采集的圖像處理,剛接觸DSP,想請教一下那款DSP芯片的性價比比較高,適合本人采用,圖像處理速度能達到400M就足以了。。。。 感激各位大神… 查看全部問答∨ |