溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

S5PV210-arm裸機(jī)-異常中的中斷實(shí)現(xiàn)過(guò)程

發(fā)布時(shí)間:2020-07-23 05:41:13 來(lái)源:網(wǎng)絡(luò) 閱讀:601 作者:小溢 欄目:開(kāi)發(fā)技術(shù)

210中的異常中的中斷實(shí)現(xiàn)過(guò)程:

首先異常分為很多種,異常中包含了中斷異常,有一個(gè)東西叫做異常向量表,在異常向量表中有很多相應(yīng)異常的的地址。異常向量表中的所有異常中斷的地址是不會(huì)變化的。地址都是固定的,但這些地址都是一個(gè)基于基地址的一個(gè)地址。不同的CPU中,基地址是不同的。

在210中,CPU內(nèi)部給了一個(gè)發(fā)生異常時(shí)的異常向量的基地址,查閱官方資料知道,這個(gè)基地址為0XD0037400,所以我們需要自己把異常向量表中的地址加在210給的發(fā)生異常時(shí)的異常向量的基地址上。比如:reset(復(fù)位異常)在異常向量表中的地址是0x00,中斷(IRQ)在異常向量表中的地址是0x18,所以我們需要把這兩個(gè)異常向量表的地址加在210給的異常時(shí)的基地址上,也就是210對(duì)應(yīng)的真正發(fā)生復(fù)位異常時(shí)地址為0XD0037400+0x00,210對(duì)應(yīng)的真正發(fā)生中斷(IRQ)普通中斷時(shí)對(duì)應(yīng)的地址為0xD0037400+0X18?,F(xiàn)在舉例說(shuō)明,比如如果210發(fā)生了中斷,CPU的硬件會(huì)自動(dòng)的幫我們跳轉(zhuǎn)到中斷異常的地址中去執(zhí)行0xD0037400+0X18,但是這個(gè)地址中只有四個(gè)字節(jié)的空間給我們用,所以我們會(huì)在這個(gè)地址中,用軟件寫(xiě)一個(gè)函數(shù)將函數(shù)名(函數(shù)名就是一段代碼的首地址,這里可以把函數(shù)名理解成一個(gè)函數(shù)指針,因?yàn)槎际欠?hào),所以這個(gè)函數(shù)名只有四個(gè)字節(jié))(irq),寫(xiě)入到這個(gè)地址中去,這時(shí)當(dāng)CPU發(fā)生中斷硬件自動(dòng)跳轉(zhuǎn)到這個(gè)地址執(zhí)行時(shí),會(huì)發(fā)現(xiàn)這里是一個(gè)函數(shù)名(可以理解為函數(shù)指針),所以就會(huì)去這個(gè)函數(shù)對(duì)應(yīng)的地址去執(zhí)行那段函數(shù)體。這個(gè)函數(shù)真正的位置可能在內(nèi)存中的其他地方,所以就解決了那個(gè)地方為四個(gè)字節(jié)的問(wèn)題,用函數(shù)指針解決的。以上這個(gè)階段可以稱為第一個(gè)階段。但是這一個(gè)階段中,當(dāng)CPU跳轉(zhuǎn)到這里這個(gè)函數(shù)irq時(shí),我們要保護(hù)現(xiàn)場(chǎng),首先要設(shè)置IRQ模式下的棧,再將r0~r12中的內(nèi)容保存到SPSR中,同時(shí)保存lr-4的地址(為什么是lr-4呢,因?yàn)閏pu在工作時(shí),因?yàn)榱魉€的原因,所以 PC的值會(huì)超前當(dāng)前的值,這個(gè)值時(shí)多少取決于流水線,詳細(xì)的并不清楚還待了解),這個(gè)地址用于從中斷處理完時(shí),在IRQ模式下回復(fù)到SVC模式,因?yàn)?10裸機(jī)中上電默認(rèn)的就是SVC模式。這一切做完以后,我們?cè)谔D(zhuǎn)到irq這個(gè)函數(shù)中去。這些就稱異常中的中斷處理的第一個(gè)階段(也叫異常向量表階段)。

第二個(gè)階段:當(dāng)我們進(jìn)入到這個(gè)irq函數(shù)時(shí),我們要去看是哪一個(gè)中斷發(fā)生了,要去哪一個(gè)中斷處理函數(shù)去執(zhí)行處理,所以這里有很多中斷寄存器,在這一階段,210里面有四個(gè)寄存器,每個(gè)寄存器32位,一位對(duì)應(yīng)一個(gè)中斷,有的位沒(méi)有中斷,是閑置的。同時(shí)處了這些含有中斷源的寄存器外,210為我們提供了很多寄存器去解決中斷源對(duì)應(yīng)哪一個(gè)中斷處理程序(isr)的問(wèn)題。硬件會(huì)自動(dòng)把相應(yīng)的中斷源的編號(hào)去對(duì)應(yīng)上相應(yīng)的中斷處理函數(shù)(isr)的寄存器中,我們只需要把相應(yīng)的中斷處理函數(shù)寫(xiě)到這個(gè)寄存器中就行。CPU自動(dòng)的把相應(yīng)的中斷源對(duì)應(yīng)的isr對(duì)應(yīng)的寄存器中的值設(shè)定。

總結(jié): 對(duì)于所有CPU而言第一階段基本上都是相同的,不同的地方是在第二個(gè)階段。因?yàn)椴煌腃PU支持的中斷多少不同,對(duì)實(shí)時(shí)性的要求不同所以會(huì)有不同方法去解決第二階段查詢是哪個(gè)中斷源觸發(fā)了哪一個(gè)中斷處理函數(shù)的問(wèn)題。對(duì)于SC2440而言,因?yàn)?440支持的中斷較少只有30多個(gè),中斷源中只有一個(gè)32位的寄存器去存放,并且寄存器有的一位中對(duì)應(yīng)了兩個(gè)中斷源,當(dāng)這一位置1后,會(huì)有一個(gè)子中斷源寄存器去讓我們判斷到底是這兩個(gè)中斷源的中的哪一個(gè)中斷觸發(fā)了,并且給一個(gè)編號(hào),我們需要在事先用一個(gè)數(shù)組去編寫(xiě)每一個(gè)編號(hào)對(duì)應(yīng)的相應(yīng)的中斷處理函數(shù),將中斷源的編號(hào),在數(shù)組去查詢這個(gè)編號(hào)所對(duì)應(yīng)的中斷處理函數(shù)名(也就是函數(shù)指針)。相比之下2440在實(shí)時(shí)性上面沒(méi)有210好,并且中斷支持的量也沒(méi)有210的多。

210的主要的中斷處理寄存器:

VICnINTENABLE(n:0,1,2,3)和VICnINTENCLEAN : 這兩個(gè)寄存器一個(gè)interrupt enable 一個(gè)是interrupt enable clean,使能和禁止,這兩個(gè)寄存器沒(méi)個(gè)有四個(gè)寄存器,對(duì)應(yīng)的都是一樣的。根據(jù)中斷編號(hào),找到屬于四個(gè)寄存器中的哪一個(gè)寄存器中的哪一位,我們要將相應(yīng)的去給他寫(xiě)1才能表示使能中斷,這樣當(dāng)CPU發(fā)生中斷時(shí),在這里就可以通過(guò),如果你寫(xiě)0,則CPU發(fā)生中斷時(shí),到了這里這道門(mén),因?yàn)檫@里是禁止的,所以CPU就會(huì)不做處理。這個(gè)這個(gè)寄存器只能寫(xiě)1,寫(xiě)0是沒(méi)有反應(yīng)的,方便我們直接32位直接操作。想使能哪一個(gè)中斷,就使能哪一個(gè)中斷。

VICnINTSELECT: 設(shè)置中斷模式的,是IRQ模式(普通中斷)還是FRQ模式(快速中斷),一共四組,沒(méi)一組32位,每一位對(duì)應(yīng)一個(gè)中斷源的編號(hào),可以設(shè)置這個(gè)中斷源觸發(fā)的中斷為兩種方式的哪種方式。FRQ模式非??欤瑢?shí)時(shí)性非常好,但是只能有一個(gè)中斷源可以設(shè)置為FRQ。 因?yàn)?10支持的中斷很多,所以有四個(gè)寄存器,沒(méi)個(gè)寄存器的32對(duì)應(yīng)相應(yīng)的中斷源,所以配置控制相應(yīng)的中斷處理寄存器就有4組,每一組中的相應(yīng)為對(duì)應(yīng)相應(yīng)的中斷源編號(hào)。

為什么FRQ比IRQ快:原因主要有兩個(gè):一個(gè)就是因?yàn)镕RQ模式下下,F(xiàn)RQ有專用的r8~r12寄存器,而IRQ模式下用的是供用的r1~r12.所以可以不用保存r1~r12,F(xiàn)RQ直接使用自己專用的r8~r12.第二個(gè)原因:異常向量表的原因,因?yàn)樵诋惓O蛄勘碇蠪RQ在最后一個(gè)地方0x1c處,而他的后面就沒(méi)有東西了,不想reset等異常,他在0x00,但他的后面還緊挨著其他的異常向量。所以在FRQ模式下,我們可以直接把中斷處理函數(shù)寫(xiě)在0x1c處,而不用將函數(shù)指針?lè)旁谶@里去跳轉(zhuǎn),所以更省時(shí)間。

VICnIRQSTATUS和VICnFRQSTATUS: 中斷狀態(tài)寄存器,看中斷是否發(fā)生。只讀的。當(dāng)發(fā)生中斷時(shí),硬件會(huì)自動(dòng)的將相對(duì)應(yīng)的寄存器位置1,表示中斷發(fā)生了,我們軟件就可以讀取這個(gè)寄存器中的某一位。查詢中斷得到中斷編號(hào)就是靠這個(gè)得到的。

VICnVECTPRIORITY0~VICnVECTPRIORITY31:

中斷優(yōu)先級(jí)設(shè)置寄存器,設(shè)置多個(gè)中斷同時(shí)發(fā)生時(shí)先處理誰(shuí)后處理誰(shuí)的問(wèn)題。一般來(lái)說(shuō)高優(yōu)先級(jí)的中斷可以打斷低優(yōu)先級(jí)的中斷,從而嵌套處理中斷。當(dāng)然了有些硬件/軟件可以設(shè)置不支持中斷嵌套。

VICnVECTADDR0~VICnVECTADDR31、VICnADDR:

(1)這三個(gè)寄存器和210中斷處理第二階段的第二階段有關(guān)。

(2)VICnVECTADDR0到31這32個(gè)寄存器分別用來(lái)存放真正的各個(gè)中斷對(duì)應(yīng)的isr的函數(shù)地址。相當(dāng)于每一個(gè)中斷源都有一個(gè)VECTADDR寄存器,程序員在設(shè)置中斷的時(shí)候,把這個(gè)中斷的isr地址直接放入這個(gè)中斷對(duì)應(yīng)的VECTADDR寄存器即可。

(3)VICnADDR這個(gè)寄存器是只需要讀的,它里面的內(nèi)容是由硬件自動(dòng)設(shè)置的。當(dāng)發(fā)生了相應(yīng)中斷時(shí),硬件會(huì)自動(dòng)識(shí)別中斷編號(hào),并且會(huì)自動(dòng)找到這個(gè)中斷的VECTADDR寄存器,然后將其讀出復(fù)制到VICnADDR中,供我們使用。這樣的設(shè)計(jì)避免了軟件查找中斷源和isr,節(jié)省了時(shí)間,提高了210的中斷響應(yīng)速度。

210中中斷實(shí)現(xiàn)的過(guò)程:

首先在開(kāi)始執(zhí)行的函數(shù)中初始化中斷控制器,包括將異常向量表與我們自己寫(xiě)的異常向量處理進(jìn)行綁定,如IRQ/FIQ函數(shù)進(jìn)行綁定。使能或者禁止相應(yīng)的中斷源,將我們自己寫(xiě)的中斷處理程序跟相應(yīng)的VICnVECTEADDR進(jìn)行綁定(也就是將函數(shù)指針綁定到相應(yīng)中斷源的編號(hào)處),以便發(fā)生中斷時(shí),硬件自動(dòng)的將相應(yīng)VICnVECTEADDR中的函數(shù)指針推向VICnADDR中,方便我們?nèi)ICnADDR中讀。

其次在匯編中要寫(xiě)一個(gè)IRQ或FIQ等函數(shù),在其中進(jìn)行現(xiàn)場(chǎng)的保護(hù),包括保護(hù)r1~r12的寄存器,保存現(xiàn)在的地址到lr-4中,還有CPSR到SPSR中,以便中斷返回。當(dāng)這些寫(xiě)完后,在寫(xiě)一個(gè)正真的中斷處理程序函數(shù)。當(dāng)發(fā)生中斷時(shí),硬件會(huì)首先找到異常向量表去執(zhí)行,但是異常向量表那個(gè)位置,我們綁定了一個(gè)我們自己寫(xiě)的異常處理函數(shù),所以就會(huì)到這個(gè)異常處理函數(shù)去執(zhí)行IRQ,F(xiàn)IQ,因?yàn)檫@個(gè)函數(shù)在匯編中,所以就會(huì)到匯編中去逐步執(zhí)行,首先保護(hù)現(xiàn)場(chǎng)等,直到執(zhí)行到調(diào)用這個(gè)函數(shù)isr,轉(zhuǎn)去這個(gè)函數(shù)中執(zhí)行真正的中斷處理程序,到了這個(gè)程序中就會(huì)去在VICnADDR中找相應(yīng)的函數(shù)指針去觸發(fā)中斷處理程序。













向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI