μC/OSII下的ARM7中斷過程分析及優(yōu)化方法

相關(guān)專題: 芯片

引言

目前,在嵌入式處理器芯片中,以ARM7為核心的處理器是應(yīng)用較多的一種。它具有多種工作模式,并且支持兩種不同的指令集(標(biāo)準(zhǔn)32位ARM指令集和16位Thumb指令集)。μC/OSII是專為嵌入式應(yīng)用設(shè)計(jì)的搶占式、多任務(wù)實(shí)時(shí)操作系統(tǒng),可用于各類8位、16位和32位單片機(jī)或DSP。μC/OSII向ARM7移植具有得天獨(dú)厚的優(yōu)點(diǎn),所以“μC/OSII+ARM7”成為廣泛應(yīng)用的一款平臺(tái)。

不管是哪種型號(hào)的ARM處理器,也無(wú)論該嵌入式系統(tǒng)中是否有操作系統(tǒng),在計(jì)算機(jī)與外界實(shí)時(shí)交互的過程中,中斷技術(shù)都是一項(xiàng)關(guān)鍵的技術(shù)。當(dāng)外部事件發(fā)生時(shí),CPU必須及時(shí)響應(yīng)中斷以實(shí)現(xiàn)對(duì)相應(yīng)事件的處理,因此能否中斷嵌套是影響嵌入式系統(tǒng)實(shí)時(shí)性能的主要因素。

1  ARM7的中斷處理

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

2  Handler宏分析

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

中斷服務(wù)程序流程如圖1所示。在進(jìn)入Handler宏中,首先保存LR、SPSR以及相關(guān)寄存器的值于中斷模式下的堆棧中,以便于斷點(diǎn)恢復(fù)。然后使記錄系統(tǒng)中斷次數(shù)的全局變量OSIntNeSTing加1并關(guān)中斷切換到系統(tǒng)模式,調(diào)用C語(yǔ)言中斷處理程序。在執(zhí)行完中斷處理程序后,調(diào)用出中斷函數(shù),以獲取最高優(yōu)先級(jí)就緒任務(wù)的任務(wù)控制塊指針和任務(wù)優(yōu)先級(jí)。返回中斷模式后,通過比較當(dāng)前任務(wù)與待切換任務(wù)的優(yōu)先級(jí),判斷是否進(jìn)行任務(wù)切換,最后返回?cái)帱c(diǎn)。

圖1  中斷服務(wù)程序流程

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

MACRO

$IRQ_Label HANDLER $IRQ_ExcepTION_Function

EXPORT $IRQ_Label;輸出的標(biāo)號(hào)

IMPORT $IRQ_Exception_Function;引用的外部標(biāo)號(hào)

$IRQ_Label

SUB LR, LR, #4;計(jì)算返回地址

STMFD SP!, {R0R3, R12, LR};保存任務(wù)環(huán)境

MRS R3, SPSR;保存狀態(tài)

STMFD SP, {R3,SP,LR}^;保存用戶狀態(tài)的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)

;切換到系統(tǒng)模式以便對(duì)相關(guān)寄存器進(jìn)行操作

 

   來(lái)源:維庫(kù)開發(fā)網(wǎng)
微信掃描分享本文到朋友圈
掃碼關(guān)注5G通信官方公眾號(hào),免費(fèi)領(lǐng)取以下5G精品資料
  • 1、回復(fù)“YD5GAI”免費(fèi)領(lǐng)取《中國(guó)移動(dòng):5G網(wǎng)絡(luò)AI應(yīng)用典型場(chǎng)景技術(shù)解決方案白皮書
  • 2、回復(fù)“5G6G”免費(fèi)領(lǐng)取《5G_6G毫米波測(cè)試技術(shù)白皮書-2022_03-21
  • 3、回復(fù)“YD6G”免費(fèi)領(lǐng)取《中國(guó)移動(dòng):6G至簡(jiǎn)無(wú)線接入網(wǎng)白皮書
  • 4、回復(fù)“LTBPS”免費(fèi)領(lǐng)取《《中國(guó)聯(lián)通5G終端白皮書》
  • 5、回復(fù)“ZGDX”免費(fèi)領(lǐng)取《中國(guó)電信5GNTN技術(shù)白皮書
  • 6、回復(fù)“TXSB”免費(fèi)領(lǐng)取《通信設(shè)備安裝工程施工工藝圖解
  • 7、回復(fù)“YDSL”免費(fèi)領(lǐng)取《中國(guó)移動(dòng)算力并網(wǎng)白皮書
  • 8、回復(fù)“5GX3”免費(fèi)領(lǐng)取《R1623501-g605G的系統(tǒng)架構(gòu)1
  • 本周熱點(diǎn)本月熱點(diǎn)

     

      最熱通信招聘

    業(yè)界最新資訊


      最新招聘信息