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

傳統ARM中IRQ是作為一種系統異常出現的。對于ARM核來說,有且僅有一個稱為IRQ的系統異常。而ARM對于IRQ的處理一般通過異常向量找到IRQ的中斷處理程序。當進入IRQ中斷處理程序之后,ARM自動屏蔽IRQ,也就是說在中斷響應過程中是忽略之后到來的中斷請求的。即使使用了VIC,VIC也僅僅是懸起后來的中斷請求。也就是說,傳統ARM的中斷是不可嵌套、不可搶占的。


不過,ARM給了我們一種權利,那就是在中斷處理程序中可以手動打開IRQ,這樣在前一個IRQ響應的過程中,就可以被后來的中斷所打斷。就給我們提供了一種用軟件解決中斷嵌套的途徑。


中斷的過程我們都十分清楚:保護現場à響應中斷à恢復現場。ARM對于每一種異常都有相應的堆棧寄存器,且會自動切換,互不影響。所以自然而然地,在嵌套中,我們可以用SP_irq來保護現場和恢復現場。流程如下所示:

 

1.      第一次進入中斷

2.      ARM自動保存CPSR到SPSR_irq

3.      ARM自動保存PC到LR_irq

4.      ARM自動關閉IRQ使能

5.      保存通用寄存器、LR_irq、SPSR_irq到SP_irq所指示的堆棧中

6.      打開IRQ使能位

7.      根據中斷號進行中斷服務

7.1    第二次進入中斷,開始嵌套

7.2    ARM自動保存CPSR到SPS_irq

7.3    ARM自動保存PC到LR_irq

7.4    ARM自動關閉IRQ使能

7.5    保存通用寄存器、LR_irq、SPSR_irq到SP_irq所指示的堆棧中

7.6    打開IRQ使能位

7.7    根據中斷號進行中斷服務

7.8    關閉IRQ使能位

7.9    從SP_irq堆棧中恢復通用寄存器、LR_irq、SPSR_irq

7.10通過LR_irq跳轉回到7

7.11ARM自動從SPSR_irq恢復CPSR

8.      關閉IRQ使能位

9.      從SP_irq堆棧中恢復通用寄存器、LR_irq、SPSR_irq

10.  通過LR_irq跳轉回到到任務程序

11.  ARM自動從SPSR_irq恢復CPSR

 

這樣就實現了嵌套,而且只要堆棧夠大,可以嵌套很多層。不考慮優先級,或者把優先級教給中斷控制器管理,這樣已經不錯了吧,雖然不愿意這么說,但是問題還是來了。


在上面的流程中,有一步是根據中斷號進行中斷服務。對于不同的中斷源,我們一般都會用不同函數來寫中斷服務,這樣不僅清晰,也利于將不同功能的模塊分割開。這樣我們就需要將這步變為:根據中斷號進入服務子程序。這步中,我們會牽涉到函數調用。在函數調用過程中,一般都會先將PC保存在LR_irq中,在返回時,再將LR_irq恢復到PC。這也正是LR的作用所在。


正是這個事實,導致了問題的發生。想象這種情況:當我們進入服務子程序后,此時LR_irq正是我們程序的返回地址。這時,第二個中斷到來了,回憶一下中斷發生時ARM自動做了什么,ARM將PC保存到了LR_irq中!就這樣,LR_irq被篡改了,因為我們無法預料到中斷什么時候到來,我們也就根本無法保存這個被篡改的LR_irq。程序響應好第二個中斷后,一路返回到這個LR_irq,毫無意外的,就跑飛了。


很掃興吧,不過我們自然有辦法解決這個問題。辦法就是在進入服務子程序之前,先將系統轉換到SVC狀態,這樣,子程序被調用時返回地址就會被保存在LR_svc中,也就不會再被第二個中斷所篡改。流程如下,和第一次不同的地方都用紅色標注。


為什么要保存r0-r3, 保存lr_svc不就夠了嗎?


1.      第一次進入中斷

2.      ARM自動保存CPSR到SPSR_irq

3.      ARM自動保存PC到LR_irq

4.      ARM自動關閉IRQ使能

5.      保存通用寄存器、LR_irq、SPSR_irq到SP_irq所指示的堆棧中

6.      更改系統狀態為SVC

7.      保存R0-R3,LR_svc到SP_svc所指示的堆棧中

8.      打開IRQ使能位

9.      根據中斷號進入中斷服務子程序

9.1    第二次進入中斷,開始嵌套

9.2    ARM自動保存CPSR到SPS_irq

9.3    ARM自動保存PC到LR_irq

9.4    ARM自動關閉IRQ使能

9.5    保存通用寄存器、LR_irq、SPSR_irq到SP_irq所指示的堆棧中

9.6    更改系統狀態為SVC

9.7    保存R0-R3,LR_svc到SP_svc所指示的堆棧中

9.8    打開IRQ使能位

9.9    根據中斷號進入中斷服務子程序

9.10關閉IRQ使能位

9.11從SP_svc所指示的堆棧中恢復R0-R3,LR_svc

9.12更改系統狀態為IRQ

9.13從SP_irq堆棧中恢復通用寄存器、LR_irq、SPSR_irq

9.14通過LR_irq跳轉回到9

9.15ARM自動從SPSR_irq恢復CPSR

10.  關閉IRQ使能位

11.  從SP_svc所指示的堆棧中恢復R0-R3,LR_svc

12.  更改系統狀態為IRQ

13.  從SP_irq堆棧中恢復通用寄存器、LR_irq、SPSR_irq

14.  通過LR_irq跳轉回到到任務程序

15.  ARM自動從SPSR_irq恢復CPSR

 

這樣我們既可以用中斷服務子程序,也不怕LR被篡改了。我們再來看一下嵌套過程中的堆棧使用情況。在進入SVC狀態之前,使用IRQ的堆棧,保存嵌套所需的通用寄存器、LR_irq和SPSR_irq。進入SVC狀態之后,使用SVC堆棧,需要保存調用函數規定的R0-R3,LR_svc。當然在中斷服務例程中,也是使用SVC堆棧。可見兩個狀態的堆棧都被使用了。當然,因為中斷服務例程使用SVC堆棧,我們也可以考慮將嵌套所需的堆棧也放到SVC中,這樣就不需要IRQ堆棧了。流程上和前面這種方法很相似,只不過要將保存LR_irq和SPSR_irq的時間放到進入SVC態之后,方法可以是通過通用寄存器拷貝。最后也不必再返回IRQ態,可以直接通過SPSR_svc和LR_svc來推出中斷處理程序。


程序貼在下面,用的是堆棧分開的方法,只是示例。

  1. __asm void IRQ_Handler(void){  

  2.       PRESERVE8  

  3.       IMPORT handler1      

  4.        

  5.       // STORE LR_irq & SPSR_irq  

  6.       SUB             LR, LR, #4  

  7.       MRS             R0, SPSR  

  8.       STMFD           SP!, {R0, LR}  

  9.    

  10.       // INTO SVC MODE  

  11.       MRS             R0, CPSR  

  12.       BIC             R0, #0x1f  

  13.       ORR             R0, #0x13  

  14.       MSR             CPSR_C, R0  

  15.        

  16.       // STORE REGISTORS OF SVC MODE  

  17.       STMFD           SP!, {R0-R3,LR}  

  18.        

  19.       // ENABLE IRQ  

  20.       MRS             R0, CPSR  

  21.       BIC             R0, #0x80  

  22.       MSR             CPSR_C, R0  

  23.        

  24.       // GO TO HANDLER  

  25.       BL              handler1  

  26.        

  27.       // RESTORE REGISTORS OF SVC MODE  

  28.       LDMFD           SP!, {R0-R3,LR}  

  29.        

  30.       // DISABLE IRQ  

  31.       MRS             R0, CPSR  

  32.       ORR             R0, #0x80  

  33.       MSR             CPSR_C, R0        

  34.        

  35.       // INTO IRQ MODE  

  36.       MRS             R0, CPSR  

  37.       BIC             R0, #0x1f  

  38.       ORR             R0, #0x12  

  39.       MSR             CPSR_C, R0  

  40.        

  41.       // RESTORE LR_irq & SPSR_irq  

  42.       LDMFD           SP!, {R0, LR}  

  43.       MSR             SPSR_CFX, R0  

  44.        

  45.   // EXIT IRQ  

  46.       MOVS            PC, LR   

  47. }  


關鍵字:ARM  處理器架構 引用地址:ARM處理器架構------可嵌套中斷的實現

上一篇:mini2440裸機編程--------觸摸屏驅動
下一篇:ARM處理器架構-----異常/中斷處理

推薦閱讀

集微網消息,關于比特大陸終止IPO的傳言熱度還未消退,9月26日晚間,港交所正式公開披露了比特大陸IPO招股書,此事最終迎來實錘。從比特大陸招股書發現:公司近三年又一期內的營收持續保持高速增長,從2015年約1.37億美元飆升到2017年約25.18億美元。截至2018年上半年,比特大陸收入28.45億美元,比上年同期的2.74億美元增長了936.6%,本期內凈利潤7.43億...
互聯網、、人工智能等技術與機器人產業加速融合,促使機器人技術及其產品也發生天翻地覆的變化。大象機器人以全新邏輯,持續在機器人算法、控制器、及產品開發方面創新和投入,布局安全機器人細分市場,以滿足市場多元化的需求。 伴隨智能化、信息化、網絡化的不斷發展,機器人技術及其產品也發生著天翻地覆的變化。在汽車行業,工業機器人一改以往固定...
天風國際證券分析師郭明錤在其今日發布的研究報告中表示,因Apple核心粉絲初期偏好高端機型、受益于中國強勁需求與即將來臨的歐美市場旺季需求,iPhone 12 Pro預購優于預期。郭明錤預計iPhone 12與12 Pro開賣后首周末銷售量為700–900萬部 (vs. iPhone 11系列的1000–1200萬部 & iPhone 6S系列的1300萬部 & iPhone 6系列的1000萬部)。iPhone...
1 配置負載自動切換開關的必要性當今的市場經濟和社會活動對信息網絡(互聯網、電信網、工業自動化控制網、政府的電子政務網站等)的依賴程度是如此之高,那怕是僅幾分鐘的“網絡癱瘓”就可能會給公司,企業及行政管理機構的銷售,經營管理、社會生活的正常運行、聲譽、及公眾形象帶來難以估量的損失。鑒于公眾對“信息網絡”的正常運營服務所期望的高度...

史海拾趣

問答坊 | AI 解惑

歡迎加入電子工程世界交流群26394388

各位同仁:            原電子專家溫暖小窩qq群被人惡意取消,請大家進新群:電子工程世界交流群 26394388…

查看全部問答∨

關于IP網絡相關問題,請在此頂貼提問

范圍包括但不限于Ethernet, IP, MPLS, TCP/UDP協議,交換機/路由器/防火墻等。 如果我不懂的會盡量幫忙找到答案。 大家共同提高:)…

查看全部問答∨

問個關于電磁輻射對人體是否有影響的事 !

當時上大學時跟老師做實驗,我們把低頻和高頻信號加在線圈上,用他們產生的磁場作用到兔子和老鼠的頭部,大概是2個星期后,把兔子和老鼠的腦子做切片時,發現腦細胞有明顯的變化,有些已經萎縮,有些就是畸形,總是肯定是有影響的,建議遠離。…

查看全部問答∨

PIC1667功耗如何?電池供電能工作多長時間?

PIC1667功耗如何?9V(萬用表用的電池)電池供電能工作多長時間?推薦一款功耗低的單片機,要帶AD,RS232接口。…

查看全部問答∨

SD卡怪問題

各位兄臺有沒有碰到這樣的問題:我用的wince5.0 CUP是at91sam9261 在SD卡 在寫過一次后 第二次開機加載就識別不了卡。第三次開機有可以識別了/ 反正是寫一次隔一次才能識別。。問一下問題出在哪里?我的sd 跟SPI 共用總線的,要用SD卡時切換到MCI模 ...…

查看全部問答∨

Vxworks如何移植snmp管理端程序

1.WindRiver有Wind SNMPManager開發包嗎? 2.是用net-snmp移植到vxworks6.1還是用snmp++了? 我現在需要在vxworks6.1實現管理端程序,不知道這個怎么著手?希望大家指導,謝謝。…

查看全部問答∨

大家談談PocketPC在局域網內WIFI性能情況

比方說在一個大的無線局域網內, 1,兩臺PocketPC通過Wifi及時通訊性能怎么樣? 2,在兩個移動的車子里(當然車子一直在這個局域網內)兩臺PocketPC通過Wifi及時通訊性能怎么樣? 3,當兩臺PocketPC正在通訊時,突然有大的物體靠近時,Wifi及 ...…

查看全部問答∨

evc中文顯示問題

目前的evc4.0仿真模擬器怎么不支持中文呢?怎樣解決這個問題…

查看全部問答∨

菜鳥問題,單選按鈕按上之后如何取消

一個單選按鈕控件,我用它來做選擇的功能,想實現當用戶點擊后可以通過點擊其他按鈕將單選按鈕圈圈里的黑點取消掉,怎么實現? 對MFC的控件不是太熟悉,望大家多幫忙咯,謝謝嗯!…

查看全部問答∨

靜態CMOS:static CMOS的特性?

有哪位大俠知道 static CMOS有何特性啊?告知一聲,謝謝! The DM350 is designed in full static CMOS, so when you stop a module clock, it retains the module\'s state.…

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

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 平遥县| 宽甸| 九台市| 政和县| 藁城市| 河北省| 呼图壁县| 米易县| 防城港市| 称多县| 峨眉山市| 舞钢市| 那曲县| 丘北县| 汝阳县| 敦煌市| 象山县| 齐齐哈尔市| 西昌市| 玉田县| 新安县| 龙里县| 喀喇沁旗| 连州市| 元谋县| 无锡市| 珠海市| 内丘县| 盖州市| 涿鹿县| 海城市| 青田县| 怀远县| 县级市| 陆丰市| 巧家县| 博乐市| 陵川县| 新闻| 邮箱| 靖州|