娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

中斷是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< INTPND = (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  異常  中斷處理 引用地址:ARM異常與中斷處理

上一篇:ARM 處理器 ~ 中斷與異常
下一篇:ARM9 mini2451裸機學習——NAND flash驅動學習 2

推薦閱讀

  我擔心人會變成機器,而機器又會具有人的頭腦。下面就隨工業控制小編一起來了解一下相關內容吧。  ——卡雷爾·恰佩克  如今,“機器人”(Robot)一詞對我們來講已不陌生,并正在逐漸成為使用高頻詞。掃地機器人、寵物玩偶機器人、仿生機器人……還有軍事領域的探測機器人、掃雷機器人,甚至“殺人機器人”……無論是工廠流水線上的機械臂、還是戰...
隨著電子商務的快速興起,倉庫行業需求持續增長,而勞動力市場的緊張使得倉庫運營商壓力越來越大,尤其在季節性購物高峰下,想要找到合格的勞動力更是難上加難。因此,倉庫管理者極需要一種靈活的,具有低成本效益的方式來滿足日益增長和變化不均的訂單需求。移動機器人的出現為倉庫升級自動化帶來了新的希望,具有自主導航和避障的新一代物流機器人,能夠...
導 ?讀隨著外骨骼機器人技術的進步,配送行業也迎來了利好!近日一則餓了么外賣小哥身著外骨骼機甲送餐的照片登上了熱搜。從照片上看,這位小哥一身機甲裝扮,下半身腳蹬機甲,后腰間絲毫不費力氣的背負起三個外賣箱子,像極了來自未來的“機甲騎士”。為了挽救一條餓到垂死掙扎的生命,他可以接過大廚手中的鍋鏟,加急炒出一份香氣四溢的蛋炒飯;為了一...
蘋果首席執行官蒂姆·庫克表示,盡管去年 11 月才發布,但搭載 M1 處理器的 MacBook Air、MacBook Pro 和 Mac mini 的銷量現在占據了 Mac 銷量的大部分,超過了搭載英特爾處理器的 Mac 電腦。庫克是在昨天舉行的發布會上透露上述信息的。在發布會上,庫克介紹了一款完全重新設計的 24 英寸 iMac,這款 iMac 搭載了蘋果的 M1 芯片。...

史海拾趣

問答坊 | AI 解惑

EPS應急電源的設計原則與功能

EPS應急電源的設計原則與功能 近年來,國內電網發展迅速,抗風險能力也在不斷增強,但與社會經濟的快速發展以及用電量快速增長的要求相比,仍有不小差距。如電網建設長期滯后,目前尚處于全國聯網的初期階段;電磁環網問題影響輸電能力的充分發揮, ...…

查看全部問答∨

電子理論基礎知識2

電子理論基礎知識…

查看全部問答∨

LCD取模問題——菜鳥

請教下各位大蝦,本人正學習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 ...…

查看全部問答∨

信號調理電路設計

關于信號調理電路設計的資料…

查看全部問答∨

困惑困惑,絕對困惑

本人前幾天在使用PC時,遇到絕對難題,如下描述: 1)運行時,出現“0xXXXXXXXX”內存出錯(這我就郁悶了,從沒在我機器上出現過) 2)機器自動重啟,問題出現 3)不能正常進入Windows,進入磁盤檢查,可是問題是即使是磁盤checking   &nb ...…

查看全部問答∨

用ti的圖形驅動庫做顯示階段性成果(視頻)+源代碼共享

奮斗了估計快10天了。。。想把板子上所有的外設用圖形界面的形式展示出來。。。計劃包括了led,bing,GPTM,PWM,IIC,UART,SPI,CAN,還有一個可以寫字的小畫板。。。目前還有GPTM,UART,SPI,CAN沒有做,其他的基本做好,也算取得階段性成果。。下面有 ...…

查看全部問答∨

wince6.0中的視頻測試程序沒有任何反應

     我在網上下載了微軟提供的wince6.0驅動并且編譯好移植到開發板上去了,插入攝像頭已經沒有選著驅動項的對話框彈出了(為加載驅動以前會彈出)。但是用測試軟件CameraDshowApp.exe的時候卻沒有任何反應。求高手解釋。 QQ ...…

查看全部問答∨

STM8S208S6的IO口輸出電流

通過STM8的IO口矩陣掃描法點亮16盞LED,不知道輸出電流夠不夠…

查看全部問答∨

基本圖像處理的DSP芯片選擇

各位大神,由于近段時間要做圖像處理,也就一般CMOS的攝像頭采集的圖像處理,剛接觸DSP,想請教一下那款DSP芯片的性價比比較高,適合本人采用,圖像處理速度能達到400M就足以了。。。。 感激各位大神…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 韶关市| 达州市| 和平区| 上高县| 乡宁县| 博客| 荔浦县| 西吉县| 个旧市| 怀仁县| 崇阳县| 临湘市| 垫江县| 天柱县| 东乌| 柏乡县| 赤峰市| 巴彦淖尔市| 和硕县| 吉木萨尔县| 五大连池市| 昌邑市| 三亚市| 郧西县| 南川市| 凤凰县| 慈利县| 龙游县| 靖江市| 太仆寺旗| 垣曲县| 出国| 涿鹿县| 咸阳市| 平果县| 微山县| 鄱阳县| 苏尼特左旗| 高阳县| 雅江县| 济南市|