a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > μC/OSII下的ARM7中斷過程分析及優化方法

μC/OSII下的ARM7中斷過程分析及優化方法

作者: 時間:2012-04-25 來源:網絡 收藏

引言

本文引用地址:http://www.j9360.com/article/171563.htm

目前,在嵌入式處理器芯片中,以為核心的處理器是應用較多的一種。它具有多種工作模式,并且支持兩種不同的指令集(標準32位ARM指令集和16位Thumb指令集)。μC/OSII是專為嵌入式應用設計的搶占式、多任務實時操作系統,可用于各類8位、16位和32位單片機或DSP。μ移植具有得天獨厚的優點,所以“μ+”成為廣泛應用的一款平臺。

不管是哪種型號的ARM處理器,也無論該嵌入式系統中是否有操作系統,在計算機與外界實時交互的中,技術都是一項關鍵的技術。當外部事件發生時,CPU必須及時響應以實現對相應事件的處理,因此能否嵌套是影響嵌入式系統實時性能的主要因素。

1 ARM7的中斷處理

ARM7處理器的中斷主要有兩種,本文主要討論IRQ中斷異常的響應機制。當中斷請求IRQ到來使CPU進入中斷響應時,CPU將會自動完成下列工作:首先,將PC、CPSR的當前值存入中斷模式的LR、SPSR中;然后,操作CPSR中的運行狀態位,使CPU進入中斷模式并關閉中斷;最后將PC的值改成0x00000018,從而使CPU的執行跳轉到IRQ中斷入口0x00000018處。異常向量表中的0x00000018處使用一條“LDR PC,[PC,#0xff0]”指令,在IRQ處使用的這條指令與其他向量不同。當CPU執行這條指令但還沒有跳轉時,PC的值為0x00000020(因為ARM7TDMI內核是三級流水結構),0x00000020減去0x00000FF0為0xFFFFF030,這是VIC的特殊寄存器VICVectAddr的地址單元。這個寄存器保存當前將要服務的IRQ的中斷服務程序的入口,故讀取VICVectAddr寄存器的值,然后放入PC程序指針,即跳轉到相應中斷服務程序,從而使CPU開始執行中斷服務程序。

2 Handler宏

“μ+ARM7”系統中,只使用了ARM7的IRQ中斷。由于不同的ARM芯片的中斷系統并不完全一樣,因此不可能編寫出對所有使用ARM核的處理器通用的中斷及時鐘節拍移植代碼。但是,為了使用戶用C語言編寫中斷服務程序時不必為處理器的硬件區別而困擾,這里根據μC/OSII對中斷服務程序的要求以及ARM7體系結構和ADS編譯器的特點,編寫了一個適用于所有基于ARM7核處理器的匯編宏--Handler。這個宏實現了“μC/OSII+ ARM7”中斷服務程序的匯編語言代碼與C語言函數代碼之間的通用接口。其作用是對用戶的C語言中斷處理程序進行包裝,只有通過這個包裝之后,系統才能執行用戶的中斷處理程序。

中斷服務程序流程如圖1所示。在進入Handler宏中,首先保存LR、SPSR以及相關寄存器的值于中斷模式下的堆棧中,以便于斷點恢復。然后使記錄系統中斷次數的全局變量OSIntNeSTing加1并關中斷切換到系統模式,調用C語言中斷處理程序。在執行完中斷處理程序后,調用出中斷函數,以獲取最高優先級就緒任務的任務控制塊指針和任務優先級。返回中斷模式后,通過比較當前任務與待切換任務的優先級,判斷是否進行任務切換,最后返回斷點。

10.gif
圖1 中斷服務程序流程

IRQ異常處理代碼的匯編部分--Handler宏:

MACRO

$IRQ_Label HANDLER $IRQ_ExcepTION_Function

EXPORT $IRQ_Label;輸出的標號

IMPORT $IRQ_Exception_Function;引用的外部標號

$IRQ_Label

SUB LR, LR, #4;計算返回地址

STMFD SP!, {R0R3, R12, LR};保存任務環境

MRS R3, SPSR;保存狀態

STMFD SP, {R3,SP,LR}^;保存用戶狀態的R3、SP、LR

;OSIntNesting++

LDR R2,=OSIntNesting

LDRB R1, [R2]

ADD R1, R1, #1

STRB R1, [R2]

SUB SP, SP, #4*3

MSR CPSR_c, #(NoInt | SYS32Mode)

;切換到系統模式以便對相關寄存器進行操作

CMP R1, #1

LDREQ SP, =StackUsr

;在第1次中斷時就重新開辟一個專門存儲中斷中用到的變量以避免存儲空間的沖突

BL $IRQ_Exception_Function ;調用C語言的中斷處理程序

MSR CPSR_c, #(NoInt | SYS32Mode);切換到系統模式

LDR R2, =OsEnterSum

;OsEnterSum,使OSIntExit退出時中斷關閉

MOV R1, #1

STR R1, [R2]

BL OSIntExit

;獲取最高優先級就緒任務的任務控制塊指針和優先級


上一頁 1 2 下一頁

評論


相關推薦

技術專區

關閉