www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]異常和中斷處理過程是每個(gè)體系結(jié)構(gòu)和OS都要面對的重要問題,本文從硬件角度以及軟件角度來分析PowerPc這個(gè)過程,文字水平有限,將就著看。PowerPC定義了十幾種異常,其中常

異常和中斷處理過程是每個(gè)體系結(jié)構(gòu)和OS都要面對的重要問題,本文從硬件角度以及軟件角度來分析PowerPc這個(gè)過程,文字水平有限,將就著看。

PowerPC定義了十幾種異常,其中常見的如DataTLB miss, Instruction TLB miss, external input....每一個(gè)都有固定的地址(ivorn),從物理地址0x100開始.0x500是中斷入口,0xe00是DTLBmiss,0xf00是itlbmiss入口.首先整體了解一下中斷發(fā)生時(shí)硬件/軟件處理流程,硬件會做什么,OS軟件要做什么。

PowerPC 中斷的硬件處理流程:(ePAPR第四章)

1. 把正在執(zhí)行的指令序列下一條指令地址保存到中斷寄存器SRR0(Save/RestoreRegiser 0)。

2. 把當(dāng)前 MSR 的內(nèi)容保存到 SRR1。

3. 把 MSR 某些比特置為 0,如MSR[SPE,WE,EE,PR,FP,FE0,FE1,IS,DS]are 0 by all interrupts.

【注】:PowerPC有兩種執(zhí)行模式,分別為用戶模式(UserMode) 和特權(quán)模式(SupervisorMode), MSR[PR]=0 表示特權(quán)模式。Linux內(nèi)核運(yùn)行在特權(quán)模式,而普通程序運(yùn)行在用戶模式。vxWorks全部運(yùn)行在特權(quán)模式。

1. 在新的 MSR 狀態(tài)下,從中斷向量偏移處開始指令讀取和執(zhí)行。

2. 外部中斷處理結(jié)束時(shí),必須通過 rfi 指令返回。

3. rfi 的執(zhí)行,會把 SRR1 的內(nèi)容恢復(fù)到 MSR, 并從 SRR0 所保存的地址處繼續(xù)執(zhí)行。

PowerPC Linux (軟件)中斷處理程序

異常向量ExternalInput處的處理程序主要分為以下幾個(gè)步驟:

1. NORMAL_EXCEPTION_PROLOG宏

建立用戶中斷處理程序的棧幀,并把一些寄存器的值保存在棧幀中,它們在棧幀中布局由structpt_regs 定義。

2. 執(zhí)行 do_IRQ

在irq_enter()函數(shù)中更新preempt_count。 讀MPIC的IACK寄存器,通知MPIC開始處理該中斷,同時(shí)獲取MPIC中斷號,映射為軟件中斷號,找到并運(yùn)行注冊在該軟件中斷號上的用戶中斷處理程序,最后寫MPIC的EOI寄存器,通知MPIC中斷處理結(jié)束。

在irq_exit()中更新preempt_count,調(diào)用invoke_softirq()處理pending的軟中斷。

3. ret_from_except

某些條件滿足時(shí),進(jìn)行進(jìn)程調(diào)度和信號處理,最后調(diào)用rfi指令返回。

PowerPC vxWorks(軟件)中斷處理程序

VxWorks的處理流程大體上與linux一樣,只是在代碼實(shí)現(xiàn)細(xì)節(jié)上存在些區(qū)別。

代碼的調(diào)用路徑:usrInit ->excVecInit ->excVecConnectCommon

代碼實(shí)現(xiàn)過程:

把一段機(jī)器碼excConnectCode[]拷貝到每個(gè)異常vector的入口地址處(excVecConnectCommon里實(shí)現(xiàn)),再重新計(jì)算異常處理函數(shù)的地址并覆蓋通用處理函數(shù)地址。

[cpp] view plain copyLOCAL INSTR excConnectCode[]=

{

/* data word byte opcode operands */

0x7c7343a6, /* 0 0x00 mtspr SPRG3, p0 */

0x7c6000a6, /* 1 0x04 mfmsr p0 */

0x546303da, /* 2 0x08 rlwinm p0,p0,0,15,13 clear MSR[CE] */

0x7c600124, /* 3 0x0c mtmsr p0 */

0x60000000, /* 4 0x10 nop */

/* If either ofthe above, add 4 words/0x10bytes to following offsets */

0x7c6802a6, /* 1 0x04 mflr p0 */

0x48000001, /* 2(6) 0x08/18 bl xxxEnt */

0x38610000, /* 3 0x0c addi r3, sp, 0 */

0x9421fff0, /* 4 0x10 stwu sp, -FRAMEBASESZ(sp) */

0x48000001, /* 5(9) 0x14/24 bl xxxHandler */

0x38210010, /* 6 0x18 addi sp, sp, FRAMEBASESZ */

0x48000001 /* 7(11) 0x1c/2c bl xxxExit */

};

整個(gè)過程中最關(guān)鍵的就是這段機(jī)器碼數(shù)組,一共12條指令。

[cpp] view plain copy0x7c7343a6, /* 0 0x00 mtspr SPRG3, p0 */

0x7c6000a6, /* 1 0x04 mfmsr p0 */

0x546303da, /* 2 0x08 rlwinm p0,p0,0,15,13 clear MSR[CE] */

0x7c600124, /* 3 0x0c mtmsr p0 */

0x60000000, /* 4 0x10 nop

首先清MSR[CE],防止在保存中斷context時(shí)被CE中斷打斷

[cpp] view plain copy0x7c6802a6, /* 1 0x04 mflr p0 */

0x48000001, /* 2(6) 0x08/18 bl xxxEnt */

0x38610000, /* 3 0x0c addi r3, sp, 0 */

0x9421fff0, /* 4 0x10 stwu sp, -FRAMEBASESZ(sp) */

0x48000001, /* 5(9) 0x14/24 bl xxxHandler */

0x38210010, /* 6 0x18 addi sp, sp, FRAMEBASESZ */

0x48000001 /* 7(11) 0x1c/2c bl xxxExit */

xxxEnt是intEntorexcEnt.

xxxHandler是 excIntHandle or excExcHandle

xxxExit是intExitor excExit.

其中intEnt/intExit,excEnt/excExit是通用中斷/異常入口和出口函數(shù),中斷進(jìn)前者,異常進(jìn)后者,主要作用是保存context以及恢復(fù)context,設(shè)置中斷棧,保存易失的寄存器變量。。。。。

excIntHandle/excExcHandle也是通用處理函數(shù),主要作用是打印下異常信息,對于關(guān)鍵異?;蛘咧袛嗟脑?,都有自己單獨(dú)的處理函數(shù),會在接下來的初始化過程中逐個(gè)把xxxHandler換成專用的處理函數(shù),實(shí)現(xiàn)的方法是直接修改機(jī)器碼后16bit。

MMU初始化的時(shí)候替換excExcHandle為mmuPpcDataTlbMissHandler/mmuPpcInstTlbMissHandler

MPIC初始化的時(shí)候會用vxbMpicIntHandler替換excIntHandle來調(diào)用ISR

WD/Timer初始化的時(shí)候也會替換成自己的Handler

至此,真正中斷/異常來的時(shí)候會執(zhí)行intEnt->vxbMpicIntHandler->intExit

下面的代碼實(shí)現(xiàn)是intEnt,可以看看里面都做了哪些事情

[cpp] view plain copy864 /*

865 *ThePowerPC Family doesn't support the notion of an interrupt

866 * stackinhardware. To avoid having to allowspacefor interrupt

867 *handlingin each task stack, this stub switches from the task

868 * stacktothe interrupt stack by changing the value of the SP(R1).

869 * Iftheinterrupt is nested, we don't need to switch stacks but

870 * wedoneed to check for overflow.[!--empirenews.page--]

871 */

893 _PPC_PER_CPU_VALUE_GET(p0,vxIntStackBase)

894 stwu sp, -_PPC_ESF_STK_SIZE(p0) /* carve stack */

895 mr sp, p0 /* switch tointerruptstack */

/*

1251 * The critical status are saved atthisstage. The interrupt should

1252 *beenabled as soon as possible to reduce the interrupt latency.

1253 *However,there is only one mask bit on PowerPC. It is at the

1254 *interruptcontroller level to set mask for each individual

1255 *interrupt.

1256 * Thus,wesave task's register first, then call interrupt controller

1257 *routineto decide if the interrupt should be re-enabled or not.

1258 */

mfspr p0, XER /* load XER to P0 */

1261 stw p0, _PPC_ESF_XER(sp) /* save XER to the stack */

1262

1263 mfspr p0, CTR /* load CTR to P0 */

1264 stw p0, _PPC_ESF_CTR(sp) /* save CTR to the stack */

1265

1266#if (CPU==PPC601)

1267 mfspr p0, MQ /* load MQ to P0 */

1268 stw p0, _PPC_ESF_MQ(sp) /* save MQ to the stack */

1269#endif /*(CPU==PPC601)*/

1270#if (defined(_WRS_CONFIG_PPC_E500))

1271#ifdef _WRS_SPE_SUPPORT

1272 mfspr p0, SPEFSCR /* load SPEFSCR to P0 */

1273 stw p0, _PPC_ESF_SPEFSCR(sp) /* save SPEFSCR to the stack */

1274#endif /*_WRS_SPE_SUPPORT */

1275#endif /*(defined(_WRS_CONFIG_PPC_E500)) */

1276

1277 stw r0, _PPC_ESF_R0(sp) /* save general register 0 */

1278 stw r2, _PPC_ESF_R2(sp) /* save general register 2 */

1279

1280 stw p2, _PPC_ESF_P2(sp) /* save general register 5 */

1281 stw p3, _PPC_ESF_P3(sp) /* save general register 6 */

1282 stw p4, _PPC_ESF_P4(sp) /* save general register 7 */

1283 stw p5, _PPC_ESF_P5(sp) /* save general register 8 */

1284 stw p6, _PPC_ESF_P6(sp) /* save general register 9 */

1285 stw p7, _PPC_ESF_P7(sp) /* save general register 10 */

1286

1287 stw r11,_PPC_ESF_R11(sp) /* savegeneral register 11 */

1288 stw r12, _PPC_ESF_R12(sp) /* save general register 12 */

1289 stw r13, _PPC_ESF_R13(sp) /* save general register 13 */

1290 beqlr+ cr4 /* return to vector unlessstackoverflow */

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

單片機(jī)將是下述內(nèi)容的主要介紹對象,通過這篇文章,小編希望大家可以對它的相關(guān)情況以及信息有所認(rèn)識和了解,詳細(xì)內(nèi)容如下。

關(guān)鍵字: 單片機(jī) 中斷 boot

在嵌入式系統(tǒng)的開發(fā)中,中斷機(jī)制扮演著至關(guān)重要的角色。它允許系統(tǒng)在執(zhí)行正常程序流程時(shí),響應(yīng)外部或內(nèi)部事件,從而確保系統(tǒng)能夠及時(shí)響應(yīng)并處理緊急事件。本文將深入探討嵌入式系統(tǒng)中中斷的概念、如何在系統(tǒng)中設(shè)置和處理多個(gè)中斷的優(yōu)先級...

關(guān)鍵字: 嵌入式系統(tǒng) 中斷

VxWorks是一款廣泛應(yīng)用于嵌入式系統(tǒng)的實(shí)時(shí)操作系統(tǒng)(RTOS)。作為實(shí)時(shí)操作系統(tǒng)領(lǐng)域的領(lǐng)導(dǎo)者,VxWorks以其強(qiáng)大的功能和可靠性,在多個(gè)行業(yè)領(lǐng)域得到了廣泛應(yīng)用。本文將向讀者簡要介紹VxWorks系統(tǒng),包括其定義、特...

關(guān)鍵字: VxWorks 操作系統(tǒng) 嵌入式

中斷機(jī)制在單片機(jī)及嵌入式系統(tǒng)中是重中之重,我們必須深入理解。首先我們要明白一點(diǎn):CPU執(zhí)行指令代碼,并非一直順序地逐條執(zhí)行,而是可能突然跳到某段代碼上去的。因?yàn)檫@段代碼的優(yōu)先級更高,或者說它更加緊迫,CPU必須暫時(shí)放下手...

關(guān)鍵字: 中斷 單片機(jī) 嵌入式系統(tǒng)

PIC單片機(jī)是基于RISC系統(tǒng)結(jié)構(gòu)的單片機(jī),最初的設(shè)計(jì)是支持PDP(編程數(shù)據(jù)處理器)計(jì)算機(jī)。大量的操作可以用來控制外圍設(shè)備。PIC單片機(jī)比微控制器具有更快的程序執(zhí)行能力。它是由微芯片技術(shù)公司于1889年發(fā)明的,是一種8位...

關(guān)鍵字: PIC單片機(jī) 定時(shí)器 中斷

STC單片機(jī)是一款增強(qiáng)型51單片機(jī),完全兼容MCS-51,還增加了新的功能,比如新增兩級中斷優(yōu)先級,多一個(gè)外中斷,內(nèi)置EEPROM,硬件看門狗,具有掉電模式,512B內(nèi)存等。還支持ISP下載,不用編程器,只要一個(gè)MAX2...

關(guān)鍵字: 單片機(jī) 看門狗 中斷

什么是PIC中斷程序呢?形象的生活比喻就比如你現(xiàn)在這在看我的文章,突然你的朋友喊你一起去烤地瓜,這時(shí)候你就中斷了看文章和朋友烤地瓜去了,烤完地瓜之后你又回來看文章??镜毓线@件事就好比中斷程序,他中斷了你看文章這件事。在程...

關(guān)鍵字: PIC 中斷 標(biāo)志位

MCS—51系列單片機(jī)內(nèi)部只需兩個(gè)外部接中斷連源輸入端,當(dāng)外部接連源多于兩個(gè)時(shí),就必須進(jìn)行拓寬,下面介紹幾種簡略的拓寬辦法:

關(guān)鍵字: 單片機(jī) 軟件 中斷

最近在瀏覽星球主題的時(shí)候,發(fā)現(xiàn)一位球友打卡中斷了,就去關(guān)心了一下他(瞧我這該死的責(zé)任心??),結(jié)果被他反手就問了下面這個(gè)問題。

關(guān)鍵字: 中斷 Spring Boot 實(shí)戰(zhàn)項(xiàng)目

實(shí)質(zhì)上是加一的計(jì)數(shù)器。外部脈沖讓他不斷加一,當(dāng)計(jì)數(shù)器溢出時(shí),計(jì)數(shù)器的溢出相應(yīng)的中斷標(biāo)志位置1,并向CPU發(fā)出中斷請求。如果定時(shí)器/計(jì)數(shù)器工作為定時(shí)模式,則表示時(shí)間以到;如果工作于計(jì)數(shù)模式,則表示計(jì)數(shù)器、則表示計(jì)數(shù)值已滿。

關(guān)鍵字: 周期 中斷
關(guān)閉