
本文由介方技術(shù)團隊成員"咸魚(yú)看到貓”原創(chuàng ),后續將陸續推出更多嵌入式技術(shù)、工程實(shí)踐類(lèi)文章。為增強代碼可讀性,本文涉及代碼部分均采用截圖。
1、本文簡(jiǎn)介
本文主要介紹P2020芯片中vxWorks中斷初始化過(guò)程(部分講解是以linux為例)。P2020屬于PPC85XX系列,內核為e500v2,它是PowerPC體系結構中主要應用于通信領(lǐng)域的片子,PowerPC體系結構規范發(fā)布于1993年,它是一個(gè)64位規范(也包含32位子集)。但幾乎所有常規的PowerPC的芯片都是32位的,除了部分新型高端芯片(eg:IBM RS/6000等)。
本文主要章節如下:
2 參考書(shū)籍介紹
3 OEA相關(guān)寄存器(中斷相關(guān))
4 PowerPC架構異常處理機制(P2020為代表)
5 vxWorks中斷初始化過(guò)程
2.參考書(shū)籍
(1) IBM官方文檔,關(guān)于PowerPC Architecture Boook I II III ,其中Book III 主要講解與操作系統相關(guān)的寄存器。
下載鏈接: https://www.ibm.com/developerworks/systems/library/es-archguide-v2.html.

(2) <<E500CORERM.pdf>> 該手冊描述的是e500核的工作過(guò)程以及Reg詳細描述,包括電源管理,中斷處理,Cache,MMU.
(3) <<P2020RM.pdf>> 該手冊主要描述的是芯片與外設相關(guān)的控制器,但很少介紹到CPU通用寄存器,特殊寄存器等.
(4) <<821INSTSET.pdf>> PowerPC 匯編指令集介紹
(5) PowerPC 匯編指令簡(jiǎn)單介紹
(2.3.4)都可以在NXP官網(wǎng)中下載
3 OEA相關(guān)寄存器(中斷相關(guān))
PowerPC 處理器有 32 個(gè)(32 位或 64 位)GPR(通用寄存器)以及諸如 PC(程序計數器,也稱(chēng)為 IAR/指令地址寄存器 或 NIP/下一指令指針)、LR(鏈接寄存器)、CR(條件寄存器)等各種其它寄存器。有些 PowerPC CPU 還有32個(gè)64位的FPR(浮點(diǎn)寄存器). 下圖展示了Power ISA2.04寄存器模式,且值得注意的是 PowerPC有兩種執行模式,分別為用戶(hù)模式(UserMode) 和特權模式(SupervisorMode),MSR[PR]=0 表示特權模式。Linux內核運行在特權模式,而普通程序運行在用戶(hù)模式。VxWorks全部運行在特權模式。


3.1 OEA寄存器集包括四類(lèi)寄存器(具體介紹只涉及中斷相關(guān)的,其它請參考下來(lái)的鏈接)
本小章節參考:32位PowerPC構架通用寄存器分析及總結
(1)配置寄存器(Configuration Registers)
MSR寄存器:(與中斷息息相關(guān))
定義處理器的狀態(tài),它可以被mtmsr, sc, rfi指令修改;可以被mfmsr讀??;
詳細說(shuō)明:基于603E內核的PowerPC處理器,中斷向量為一個(gè)固定的地址,可以通過(guò)設置MSR[IP]位來(lái)決定這個(gè)固定地址是0x0,還是0xfff0_0000;而E500內核在進(jìn)入中斷和異常處理程序時(shí),不能關(guān)閉MMU,因此不能使用物理地址作為中斷向量,而應使用IVPR和IVOR寄存器保存相應的中斷向量(在下面中斷機制章節詳細介紹),下面為e500核的MSR:

中斷的開(kāi)關(guān)由寄存器MSR來(lái)控制的
CE:if set 1,Critical input and watchdog timer interrupts are enabled.
EE:if set 1,External input, decrementer, fixed-interval timer and performance monitor interrupts are enabled
ME:if set 1, Machine check interrupts are enabled.
DE:if set 1,Debug interrputs are enabled if DBCR0[IDM] = 1.
MSR[EE]這個(gè)bit很重要,中斷的使能要靠它。
注意:當發(fā)生中斷后,MSR[EE]會(huì )自動(dòng)置0屏蔽所有其他的中。
如果在MSR[EE]置1前,又來(lái)了一個(gè)中斷
1.此中斷是邊沿觸發(fā)的,那么此中斷丟失。此種中斷就是電平變化,一次就沒(méi)了
2.此中斷時(shí)水平觸發(fā)的,此中斷不會(huì )丟失。此種中斷的電平會(huì )一直active,直到硬件處理它
PVR寄存器:
定義寄存器模型的版本和處理器的版

(2)內存管理寄存器(Memory Management Registers)
BAT寄存器:
OEA定義了四組BAT指令寄存器(IBAT0U-IBAT3U和IBAT0L-IBAT3L),也定義了四組BAT數據寄存器(DBAT0U-DBAT3U和DBAT0U-DBAT3U)
SDR1寄存器:
該寄存器定義了用于虛擬地址轉換為物理地址所需要的頁(yè)表基地址

SR寄存器:
OEA定義了16個(gè)32位的SR寄存器(SR0-SR15)
(3)中斷處理寄存器(Interrupt Handing Register)
詳細介紹請看《E500CORE.pdf》2.7 Interrupt Registers

(4)多功能寄存器(Miscellaneous Registers)
TB(time base)寄存器:CPU時(shí)間片基準
DEC寄存器:這是一個(gè)32位的遞減計數器
EAR(External Access Register)寄存器:用于訪(fǎng)問(wèn)外部設備
DABR(Data address breakpoint register):用來(lái)控制數據地址斷點(diǎn)功能
PIR(Processor identification register):在多處理器的芯片上用來(lái)標識一個(gè)核,例如在MPC8641d芯片上有兩個(gè)E600的core,就用PIR來(lái)定位其中的core。
3.3 通用寄存器與專(zhuān)用寄存器的用途
本小章節參考:PowerPC匯編指令以及通用與專(zhuān)用寄存器介紹
r3,r4-r10經(jīng)常用于C,匯編的混合編程中

在target\h\arch\ppc\toolPpc.h中有對以上寄存器的重定義

4 PowerPC架構異常處理機制(P2020為代表)
4.1 PowerPC中斷系統(P2020)
從CPU的角度來(lái)講,中斷源可以分為自己內核產(chǎn)生的異常和PIC提供的中斷。
異常:是e500核產(chǎn)生的,它是同步產(chǎn)生(可以預知的),如非法指令,或訪(fǎng)問(wèn)存儲器時(shí)出現TLB Miss(Data | Instruction )等.
<<E500CORERM.pdf>>5.11.1描述了PowerPC架構可能出現的全部異常(這里描述包括中斷)
中斷:是e500核外部引腳產(chǎn)生的,由PIC送到內核處理,它是異步產(chǎn)生的(無(wú)法預知的).大致分為一般中斷(int)(包括內外部等),關(guān)鍵中斷(cint)和機器檢查中斷(machine check). 下圖為中斷源架構圖,其中Message數量應該是寫(xiě)錯了(理論為4).
從圖中可以看出PowerPC處理器中斷系統由內核中斷以及異常處理系統和PIC中斷控制器構成.

4.2 中斷向量
在E500內核中,使用IVPR和IVORx寄存器共同確定中斷或者異常程序的入口地址。其中,IVPR寄存器提供中斷程序入口地址的第0~15位,IVORx提供中斷程序入口地址的第16~27位,而中斷程序的入口地址的第28~31位為0。IVORx與異常的對應關(guān)系如下圖所示:


每類(lèi)中斷都有自己的中斷向量,通過(guò)它能計算出中斷handler的指令地址。
指令地址的計算方法:
IVPR[32-47] || IVORn[48-59] || 0b0000
這樣就得到一個(gè)32個(gè)bit地址
有2個(gè)中斷向量對程序員來(lái)說(shuō)比較親切:
一個(gè)是 IVOR4 用來(lái)處理外部中斷和內部SOC中斷
一個(gè)是 IVOR8 用來(lái)處理系統調用
隨便找一個(gè)Start.S進(jìn)行簡(jiǎn)單的分析
185 /* Setup interrupt vectors 設置IVPR寄存器*/
186 lis r1,TEXT_BASE@h /* load value to r1 */
187 mtspr IVPR, r1 /* write r1 to IVPR */
197 li r1,0x0500
198 mtspr IVOR4,r1 /* 4: External interrupt */
.......
205 li r1,0x0900
206 mtspr IVOR8,r1 /* 8: System call */
207 /* 9: Auxiliary processor unavailable(unsupported) */
208 li r1,0x0a00
209 mtspr IVOR10,r1 /* 10: Decrementer */
......
看board/pq37pc/pq37pc_8560/config.mk 里有
TEXT_BASE = 0xFF800000
所以 IVPR = 0xFFF80000
IVOR10 = 0x00000a00
計算 IVPR[32-47] || IVPOR10[48-59] || 0b0000 得 0xFFF80a00
4.3 中斷源寄存器
中斷向量只能確定類(lèi)型,里面保存了interrupt handler的地址。
在interrupt handler里,需要根據中斷源寄存器來(lái)進(jìn)一步確定到底是哪里發(fā)生了中斷
E500內部中斷源有64個(gè)(部分reserve),來(lái)自TSEC,LBC,DMA,CPM等
寄存器組 PIC_IIVPRn 與 P2020內部SOC中斷一一對應(n取值 0~63)


E500外部中斷源有12個(gè),來(lái)自外部引腳 IRQ[0:11]
寄存器組 EIVPRn 與 MPC8560 外部中斷一一對應(n取值 0~11)

下面具體介紹外部源寄存器


MSK: 若置1,此中斷源的中斷被無(wú)視.
A: 若置1,此中斷源有中斷發(fā)生
P: 若置1, active-high; 若置0, active-low.
S: 若置1,此中斷是水平觸發(fā)。若置0,此中斷是邊界觸發(fā)
PRIORITY: 優(yōu)先級0-15。15是最高優(yōu)先級,0時(shí)相當于無(wú)視此中斷。
VECTOR: 硬件中斷號。中斷發(fā)生后處于pengding時(shí),此字段被寫(xiě)在寄存器IACK中

總結:處理內,外中斷的handle都是同一個(gè)functions(流程),EntInt-->Handle-->ExitInt,在處理函數中讀取IACK,就知道是哪個(gè)中斷源觸發(fā)了中斷,然后做對應的處理
知道中斷向量 和 中斷源,系統處理中斷的大致流程就能理出來(lái)了,以外部中斷eg:


4.4 外部中斷處理流程
1.首先E500內核清除在指令完成隊列CQ中所有的執行,然后把正在執行的指令序列下一條指令地址保存到中斷寄存器 SRR0(Save/RestoreRegiser 0)
2.把當前 MSR 的內容保存到 SRR1
3.把 MSR 某些比特置為 0,如MSR[SPE,WE,EE,PR,FP,FE0,FE1,IS,DS]are 0 by all interrupts.
(E500內核將MSR寄存器的CE、ME、DE位保留,其他位全部清零。因此E500內核在進(jìn)行外部中斷處理程序時(shí),仍然可以被Critical中斷,Machine check中斷和調試中斷程序重入,但是不能被外部中斷立即重入。在Linux PowerPC中,外部中斷處理程序會(huì )選擇合適時(shí)機使能MSR寄存器的EE位,以支持外部中斷的重入)
4.在新的 MSR 狀態(tài)下, E500內核將根據IVPR,IVOR4寄存器確定中斷向量,從中斷向量偏移處開(kāi)始指令讀取和執行
5. 在中斷處理程序執行完畢后,使用rfi指令進(jìn)行中斷返回。rfi指令將從SRR1寄存器中恢復MSR寄存器的值,并從SRR0寄存器中獲得程序返回地址。rfi指令在進(jìn)行程序正文切換之前還會(huì )進(jìn)行指令和數據的同步,還給被中斷的程序一個(gè)“干凈”的空間,之后E500內核進(jìn)行中斷返回。
5.vxWorks中斷初始化過(guò)程(跳過(guò)bootrom過(guò)程)
usrInit(prjConfig.c)--> {sysStart(startType)-->intVecBaseSet ((FUNCPTR *) VEC_BASE_ADRS)}
-->excVecInit()
(1)sysStart (first C code executed from usrInit) 主要作用是清除BSS,以及設置中斷向量的基地址

(2) intVecBaseSet


(3)excVecInit



下面按excVecInit里面函數的初始化順序講解:






存根代碼表:

系統起來(lái)后在vxWorks shell 中輸入d 0x500 (外部中斷的內存地址),可以看到數據和excConnectCode存根一致

中斷向量?jì)却鎴D分析:

本文由介方技術(shù)團隊成員原創(chuàng ),未經(jīng)原作者本人同意,不得轉載
聯(lián)系客服