您好,登錄后才能下訂單哦!
210中的異常中的中斷實現過程:
首先異常分為很多種,異常中包含了中斷異常,有一個東西叫做異常向量表,在異常向量表中有很多相應異常的的地址。異常向量表中的所有異常中斷的地址是不會變化的。地址都是固定的,但這些地址都是一個基于基地址的一個地址。不同的CPU中,基地址是不同的。
在210中,CPU內部給了一個發生異常時的異常向量的基地址,查閱官方資料知道,這個基地址為0XD0037400,所以我們需要自己把異常向量表中的地址加在210給的發生異常時的異常向量的基地址上。比如:reset(復位異常)在異常向量表中的地址是0x00,中斷(IRQ)在異常向量表中的地址是0x18,所以我們需要把這兩個異常向量表的地址加在210給的異常時的基地址上,也就是210對應的真正發生復位異常時地址為0XD0037400+0x00,210對應的真正發生中斷(IRQ)普通中斷時對應的地址為0xD0037400+0X18。現在舉例說明,比如如果210發生了中斷,CPU的硬件會自動的幫我們跳轉到中斷異常的地址中去執行0xD0037400+0X18,但是這個地址中只有四個字節的空間給我們用,所以我們會在這個地址中,用軟件寫一個函數將函數名(函數名就是一段代碼的首地址,這里可以把函數名理解成一個函數指針,因為都是符號,所以這個函數名只有四個字節)(irq),寫入到這個地址中去,這時當CPU發生中斷硬件自動跳轉到這個地址執行時,會發現這里是一個函數名(可以理解為函數指針),所以就會去這個函數對應的地址去執行那段函數體。這個函數真正的位置可能在內存中的其他地方,所以就解決了那個地方為四個字節的問題,用函數指針解決的。以上這個階段可以稱為第一個階段。但是這一個階段中,當CPU跳轉到這里這個函數irq時,我們要保護現場,首先要設置IRQ模式下的棧,再將r0~r12中的內容保存到SPSR中,同時保存lr-4的地址(為什么是lr-4呢,因為cpu在工作時,因為流水線的原因,所以 PC的值會超前當前的值,這個值時多少取決于流水線,詳細的并不清楚還待了解),這個地址用于從中斷處理完時,在IRQ模式下回復到SVC模式,因為210裸機中上電默認的就是SVC模式。這一切做完以后,我們在跳轉到irq這個函數中去。這些就稱異常中的中斷處理的第一個階段(也叫異常向量表階段)。
第二個階段:當我們進入到這個irq函數時,我們要去看是哪一個中斷發生了,要去哪一個中斷處理函數去執行處理,所以這里有很多中斷寄存器,在這一階段,210里面有四個寄存器,每個寄存器32位,一位對應一個中斷,有的位沒有中斷,是閑置的。同時處了這些含有中斷源的寄存器外,210為我們提供了很多寄存器去解決中斷源對應哪一個中斷處理程序(isr)的問題。硬件會自動把相應的中斷源的編號去對應上相應的中斷處理函數(isr)的寄存器中,我們只需要把相應的中斷處理函數寫到這個寄存器中就行。CPU自動的把相應的中斷源對應的isr對應的寄存器中的值設定。
總結: 對于所有CPU而言第一階段基本上都是相同的,不同的地方是在第二個階段。因為不同的CPU支持的中斷多少不同,對實時性的要求不同所以會有不同方法去解決第二階段查詢是哪個中斷源觸發了哪一個中斷處理函數的問題。對于SC2440而言,因為2440支持的中斷較少只有30多個,中斷源中只有一個32位的寄存器去存放,并且寄存器有的一位中對應了兩個中斷源,當這一位置1后,會有一個子中斷源寄存器去讓我們判斷到底是這兩個中斷源的中的哪一個中斷觸發了,并且給一個編號,我們需要在事先用一個數組去編寫每一個編號對應的相應的中斷處理函數,將中斷源的編號,在數組去查詢這個編號所對應的中斷處理函數名(也就是函數指針)。相比之下2440在實時性上面沒有210好,并且中斷支持的量也沒有210的多。
210的主要的中斷處理寄存器:
VICnINTENABLE(n:0,1,2,3)和VICnINTENCLEAN : 這兩個寄存器一個interrupt enable 一個是interrupt enable clean,使能和禁止,這兩個寄存器沒個有四個寄存器,對應的都是一樣的。根據中斷編號,找到屬于四個寄存器中的哪一個寄存器中的哪一位,我們要將相應的去給他寫1才能表示使能中斷,這樣當CPU發生中斷時,在這里就可以通過,如果你寫0,則CPU發生中斷時,到了這里這道門,因為這里是禁止的,所以CPU就會不做處理。這個這個寄存器只能寫1,寫0是沒有反應的,方便我們直接32位直接操作。想使能哪一個中斷,就使能哪一個中斷。
VICnINTSELECT: 設置中斷模式的,是IRQ模式(普通中斷)還是FRQ模式(快速中斷),一共四組,沒一組32位,每一位對應一個中斷源的編號,可以設置這個中斷源觸發的中斷為兩種方式的哪種方式。FRQ模式非常快,實時性非常好,但是只能有一個中斷源可以設置為FRQ。 因為210支持的中斷很多,所以有四個寄存器,沒個寄存器的32對應相應的中斷源,所以配置控制相應的中斷處理寄存器就有4組,每一組中的相應為對應相應的中斷源編號。
為什么FRQ比IRQ快:原因主要有兩個:一個就是因為FRQ模式下下,FRQ有專用的r8~r12寄存器,而IRQ模式下用的是供用的r1~r12.所以可以不用保存r1~r12,FRQ直接使用自己專用的r8~r12.第二個原因:異常向量表的原因,因為在異常向量表中FRQ在最后一個地方0x1c處,而他的后面就沒有東西了,不想reset等異常,他在0x00,但他的后面還緊挨著其他的異常向量。所以在FRQ模式下,我們可以直接把中斷處理函數寫在0x1c處,而不用將函數指針放在這里去跳轉,所以更省時間。
VICnIRQSTATUS和VICnFRQSTATUS: 中斷狀態寄存器,看中斷是否發生。只讀的。當發生中斷時,硬件會自動的將相對應的寄存器位置1,表示中斷發生了,我們軟件就可以讀取這個寄存器中的某一位。查詢中斷得到中斷編號就是靠這個得到的。
VICnVECTPRIORITY0~VICnVECTPRIORITY31:
中斷優先級設置寄存器,設置多個中斷同時發生時先處理誰后處理誰的問題。一般來說高優先級的中斷可以打斷低優先級的中斷,從而嵌套處理中斷。當然了有些硬件/軟件可以設置不支持中斷嵌套。
VICnVECTADDR0~VICnVECTADDR31、VICnADDR:
(1)這三個寄存器和210中斷處理第二階段的第二階段有關。
(2)VICnVECTADDR0到31這32個寄存器分別用來存放真正的各個中斷對應的isr的函數地址。相當于每一個中斷源都有一個VECTADDR寄存器,程序員在設置中斷的時候,把這個中斷的isr地址直接放入這個中斷對應的VECTADDR寄存器即可。
(3)VICnADDR這個寄存器是只需要讀的,它里面的內容是由硬件自動設置的。當發生了相應中斷時,硬件會自動識別中斷編號,并且會自動找到這個中斷的VECTADDR寄存器,然后將其讀出復制到VICnADDR中,供我們使用。這樣的設計避免了軟件查找中斷源和isr,節省了時間,提高了210的中斷響應速度。
210中中斷實現的過程:
首先在開始執行的函數中初始化中斷控制器,包括將異常向量表與我們自己寫的異常向量處理進行綁定,如IRQ/FIQ函數進行綁定。使能或者禁止相應的中斷源,將我們自己寫的中斷處理程序跟相應的VICnVECTEADDR進行綁定(也就是將函數指針綁定到相應中斷源的編號處),以便發生中斷時,硬件自動的將相應VICnVECTEADDR中的函數指針推向VICnADDR中,方便我們去VICnADDR中讀。
其次在匯編中要寫一個IRQ或FIQ等函數,在其中進行現場的保護,包括保護r1~r12的寄存器,保存現在的地址到lr-4中,還有CPSR到SPSR中,以便中斷返回。當這些寫完后,在寫一個正真的中斷處理程序函數。當發生中斷時,硬件會首先找到異常向量表去執行,但是異常向量表那個位置,我們綁定了一個我們自己寫的異常處理函數,所以就會到這個異常處理函數去執行IRQ,FIQ,因為這個函數在匯編中,所以就會到匯編中去逐步執行,首先保護現場等,直到執行到調用這個函數isr,轉去這個函數中執行真正的中斷處理程序,到了這個程序中就會去在VICnADDR中找相應的函數指針去觸發中斷處理程序。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。