本發(fā)明涉及虛擬驗(yàn)證系統(tǒng),尤其涉及實(shí)現(xiàn)中斷控制器組件的方法及系統(tǒng)。
背景技術(shù):
::虛擬驗(yàn)證系統(tǒng)是能夠?qū)η度胧接布到y(tǒng)進(jìn)行完整模擬的軟件系統(tǒng)。用戶可以在該系統(tǒng)上模擬運(yùn)行嵌入式軟件,無需相應(yīng)的硬件即可對(duì)嵌入式軟件進(jìn)行測(cè)試與調(diào)試。通過使用本系統(tǒng),用戶不僅可以極大地縮短嵌入式軟件研制周期,而且能夠避免高昂的輔助測(cè)試硬件研制費(fèi)用、極大地降低系統(tǒng)成本。虛擬驗(yàn)證系統(tǒng)的一個(gè)核心特點(diǎn)是通用性,即系統(tǒng)可以根據(jù)測(cè)試所需硬件環(huán)境的不同,進(jìn)行通用配置以滿足需求,系統(tǒng)提供了兩個(gè)組件庫(kù):1)虛擬處理器組件庫(kù);2)虛擬設(shè)備組件庫(kù)。用戶可以根據(jù)硬件需求,自主在組件庫(kù)中選取虛擬組件,軟定制板級(jí)硬件仿真環(huán)境。如圖1所示,各虛擬設(shè)備組件組成設(shè)備組件庫(kù),供用戶挑選、配置并最終生成虛擬驗(yàn)證平臺(tái)實(shí)例。在虛擬設(shè)備組件庫(kù)中,為了涵蓋所有需仿真設(shè)備的特性,虛擬設(shè)備組件可分為4個(gè)類別:1)同步虛擬設(shè)備(如ram/rom、timer虛擬組件等);2)異步虛擬通信設(shè)備組件(如rs422、sja-1000虛擬組件等);3)中斷控制器組件;4)具有數(shù)據(jù)信號(hào)連接關(guān)系的虛擬設(shè)備組件(如gpio、ad/da虛擬組件等)。上述每種組件均有其特定的虛擬仿真實(shí)現(xiàn)方法,每種組件對(duì)虛擬驗(yàn)證系統(tǒng)相關(guān)模塊的依賴也不同。技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供了一種實(shí)現(xiàn)中斷控制器組件的方法,包括先進(jìn)中斷控制器初始化接口的實(shí)現(xiàn):先進(jìn)中斷控制器初始接口的功能是為aic設(shè)備申請(qǐng)內(nèi)存空間,用來保存設(shè)備的狀態(tài)信息,并初始化aic設(shè)備的狀態(tài)信息。作為本發(fā)明的進(jìn)一步改進(jìn),aic設(shè)備所需要申請(qǐng)的內(nèi)存空間的大小為568個(gè)字節(jié),其中前304個(gè)字節(jié)用于模擬各個(gè)寄存器,后面的字節(jié)用來模擬aic設(shè)備的硬件棧。作為本發(fā)明的進(jìn)一步改進(jìn),包括aic復(fù)位接口的實(shí)現(xiàn):aic設(shè)備的復(fù)位接口的功能是將aic設(shè)備的所有寄存器信息復(fù)位為默認(rèn)值,并將中斷棧的棧頂指向棧底。作為本發(fā)明的進(jìn)一步改進(jìn),中斷控制器組件讀接口的實(shí)現(xiàn):獲取偏移地址;若addr在0到252中,表明其是中斷源模式寄存器或中斷源向量寄存器,對(duì)他們的進(jìn)行寫操作不會(huì)引起中斷控制器狀態(tài)的改變,因此直接將數(shù)據(jù)總線上的數(shù)據(jù)寫入相應(yīng)的寄存器即可;若addr在256到284中,則表明其要訪問的寄存器為irq向量寄存器,fiq向量寄存器,中斷狀態(tài),掛起,屏蔽和內(nèi)核中斷狀態(tài)寄存器,以及兩個(gè)保留的地址,由此這些寄存器是只讀的,因此不能夠?qū)λ麄冞M(jìn)行些操作,因此直接返回0即可,表明寫失??;若addr為270則表明其要訪問的寄存器為fiq向量寄存器,則首先判斷中斷掛起寄存器是否有中斷未激活,若無,則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線,否則將中斷源向量寄存器1的值寫入數(shù)據(jù)總線;若addr在274到286中,則表明他們是中斷狀態(tài),中斷掛起,中斷屏蔽,內(nèi)核中斷狀態(tài)寄存器,對(duì)他們的讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將這些寄存器的值寫入數(shù)據(jù)總線即可;若addr在290到300之間,則表明他們是中斷使能,中斷禁止,中斷標(biāo)志設(shè)置,中斷標(biāo)志清除以及中斷結(jié)束命令寄存器,這些寄存器都是只寫寄存器,不能對(duì)他們進(jìn)行讀操作,因此只寫返回0表明讀失敗即可;若addr為304,則表明他是未向量寄存器,對(duì)此寄存器進(jìn)行讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將此寄存器的值寫入數(shù)據(jù)總線即可。作為本發(fā)明的進(jìn)一步改進(jìn),中斷控制器組件寫接口的實(shí)現(xiàn):獲取偏移地址;若addr在0到252中,表明其是中斷源模式寄存器或中斷源向量寄存器,對(duì)他們的讀操作不會(huì)引發(fā)狀態(tài)的改變,因此直接返回相應(yīng)寄存器的內(nèi)容即可;若addr為256則表明其要訪問的寄存器為irq向量寄存器,首先檢查中斷掛起寄存器是否有中斷,若沒有則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線并返回,否則檢查中斷掛起寄存器,找出比當(dāng)前中斷優(yōu)先級(jí)高的且未被屏蔽的中斷號(hào),將其優(yōu)先級(jí)壓入中斷棧,修改中斷狀態(tài)寄存器,并將對(duì)應(yīng)此中斷號(hào)的中斷源向量寄存器的值寫入數(shù)據(jù)總線;若addr為270則表明其要訪問的寄存器為fiq向量寄存器,則首先判斷中斷掛起寄存器是否有中斷未激活,若無,則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線,否則將中斷源向量寄存器1的值寫入數(shù)據(jù)總線;若addr在274到284中,則表明他們是中斷狀態(tài),中斷掛起,中斷屏蔽,內(nèi)核中斷狀態(tài)寄存器,對(duì)他們的讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將這些寄存器的值寫入數(shù)據(jù)總線即可;若addr為288,則表明他是中斷使能寄存器,對(duì)此寄存器的操作只會(huì)改變中斷屏蔽寄存器的狀態(tài),只需將中斷屏蔽寄存器和總線上的數(shù)據(jù)進(jìn)行或操作即可,并將結(jié)果存入中斷屏蔽寄存器;若addr為292,則表明他是中斷禁止寄存器,對(duì)此寄存器的操作同樣只會(huì)改變中斷屏蔽寄存器的狀態(tài),只需將中斷屏蔽寄存器和總線上的數(shù)據(jù)進(jìn)行與操作即可,并將結(jié)果存入中斷屏蔽寄存器;若addr為296,則表明他是中斷標(biāo)志設(shè)置寄存器,對(duì)此寄存器的操作只會(huì)改變中斷掛起寄存器的狀態(tài),即若中斷標(biāo)志設(shè)置寄存器的響應(yīng)位為被屏蔽時(shí),且其為1,則將中斷掛起寄存器的相應(yīng)位置為1;在將中斷掛起寄存器更新后,若中斷掛起寄存器的0位為1,則發(fā)出fiq中斷,否則遍歷中斷掛起寄存器,獲取優(yōu)先級(jí)最高的中斷的中斷號(hào),若其優(yōu)先級(jí)比棧頂?shù)漠?dāng)前優(yōu)先級(jí)高,則此優(yōu)先級(jí)壓棧,并向cpu發(fā)出irq中斷請(qǐng)求;若addr為300,則表明他是中斷標(biāo)志清除寄存器,對(duì)此寄存器的操作只會(huì)改變中斷掛起寄存器的狀態(tài),即若中斷標(biāo)志清除寄存器的相應(yīng)位未被屏蔽時(shí),且其為1,則將中斷掛起寄存器的相應(yīng)位置為0;若addr為304,則表明他是中斷結(jié)束命令寄存器,對(duì)此寄存器的操作只會(huì)影響到中斷棧的狀態(tài),即將棧頂?shù)膬?yōu)先級(jí)彈出,將中斷狀態(tài)恢復(fù)到上一個(gè)狀態(tài);若addr為308,則表明他是偽向量寄存器,對(duì)他的寫操作不會(huì)更改中斷控制器的狀態(tài)。本發(fā)明還提供了一種實(shí)現(xiàn)中斷控制器組件的系統(tǒng),包括先進(jìn)中斷控制器初始化接口的實(shí)現(xiàn)模塊:先進(jìn)中斷控制器初始接口的功能是為aic設(shè)備申請(qǐng)內(nèi)存空間,用來保存設(shè)備的狀態(tài)信息,并初始化aic設(shè)備的狀態(tài)信息。作為本發(fā)明的進(jìn)一步改進(jìn),aic設(shè)備所需要申請(qǐng)的內(nèi)存空間的大小為568個(gè)字節(jié),其中前304個(gè)字節(jié)用于模擬各個(gè)寄存器,后面的字節(jié)用來模擬aic設(shè)備的硬件棧。作為本發(fā)明的進(jìn)一步改進(jìn),包括aic復(fù)位接口的實(shí)現(xiàn)模塊:aic設(shè)備的復(fù)位接口的功能是將aic設(shè)備的所有寄存器信息復(fù)位為默認(rèn)值,并將中斷棧的棧頂指向棧底。作為本發(fā)明的進(jìn)一步改進(jìn),中斷控制器組件讀接口的實(shí)現(xiàn)模塊:獲取偏移地址;若addr在0到252中,表明其是中斷源模式寄存器或中斷源向量寄存器,對(duì)他們的進(jìn)行寫操作不會(huì)引起中斷控制器狀態(tài)的改變,因此直接將數(shù)據(jù)總線上的數(shù)據(jù)寫入相應(yīng)的寄存器即可;若addr在256到284中,則表明其要訪問的寄存器為irq向量寄存器,fiq向量寄存器,中斷狀態(tài),掛起,屏蔽和內(nèi)核中斷狀態(tài)寄存器,以及兩個(gè)保留的地址,由此這些寄存器是只讀的,因此不能夠?qū)λ麄冞M(jìn)行些操作,因此直接返回0即可,表明寫失??;若addr為270則表明其要訪問的寄存器為fiq向量寄存器,則首先判斷中斷掛起寄存器是否有中斷未激活,若無,則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線,否則將中斷源向量寄存器1的值寫入數(shù)據(jù)總線;若addr在274到286中,則表明他們是中斷狀態(tài),中斷掛起,中斷屏蔽,內(nèi)核中斷狀態(tài)寄存器,對(duì)他們的讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將這些寄存器的值寫入數(shù)據(jù)總線即可;若addr在290到300之間,則表明他們是中斷使能,中斷禁止,中斷標(biāo)志設(shè)置,中斷標(biāo)志清除以及中斷結(jié)束命令寄存器,這些寄存器都是只寫寄存器,不能對(duì)他們進(jìn)行讀操作,因此只寫返回0表明讀失敗即可;若addr為304,則表明他是未向量寄存器,對(duì)此寄存器進(jìn)行讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將此寄存器的值寫入數(shù)據(jù)總線即可。作為本發(fā)明的進(jìn)一步改進(jìn),中斷控制器組件寫接口的實(shí)現(xiàn)模塊:獲取偏移地址;若addr在0到252中,表明其是中斷源模式寄存器或中斷源向量寄存器,對(duì)他們的讀操作不會(huì)引發(fā)狀態(tài)的改變,因此直接返回相應(yīng)寄存器的內(nèi)容即可;若addr為256則表明其要訪問的寄存器為irq向量寄存器,首先檢查中斷掛起寄存器是否有中斷,若沒有則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線并返回,否則檢查中斷掛起寄存器,找出比當(dāng)前中斷優(yōu)先級(jí)高的且未被屏蔽的中斷號(hào),將其優(yōu)先級(jí)壓入中斷棧,修改中斷狀態(tài)寄存器,并將對(duì)應(yīng)此中斷號(hào)的中斷源向量寄存器的值寫入數(shù)據(jù)總線;若addr為270則表明其要訪問的寄存器為fiq向量寄存器,則首先判斷中斷掛起寄存器是否有中斷未激活,若無,則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線,否則將中斷源向量寄存器1的值寫入數(shù)據(jù)總線;若addr在274到284中,則表明他們是中斷狀態(tài),中斷掛起,中斷屏蔽,內(nèi)核中斷狀態(tài)寄存器,對(duì)他們的讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將這些寄存器的值寫入數(shù)據(jù)總線即可;若addr在274到284中,則表明他們是中斷狀態(tài),中斷掛起,中斷屏蔽,內(nèi)核中斷狀態(tài)寄存器,對(duì)他們的讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將這些寄存器的值寫入數(shù)據(jù)總線即可;若addr為292,則表明他是中斷禁止寄存器,對(duì)此寄存器的操作同樣只會(huì)改變中斷屏蔽寄存器的狀態(tài),只需將中斷屏蔽寄存器和總線上的數(shù)據(jù)進(jìn)行與操作即可,并將結(jié)果存入中斷屏蔽寄存器;若addr為296,則表明他是中斷標(biāo)志設(shè)置寄存器,對(duì)此寄存器的操作只會(huì)改變中斷掛起寄存器的狀態(tài),即若中斷標(biāo)志設(shè)置寄存器的響應(yīng)位為被屏蔽時(shí),且其為1,則將中斷掛起寄存器的相應(yīng)位置為1;在將中斷掛起寄存器更新后,若中斷掛起寄存器的0位為1,則發(fā)出fiq中斷,否則遍歷中斷掛起寄存器,獲取優(yōu)先級(jí)最高的中斷的中斷號(hào),若其優(yōu)先級(jí)比棧頂?shù)漠?dāng)前優(yōu)先級(jí)高,則此優(yōu)先級(jí)壓棧,并向cpu發(fā)出irq中斷請(qǐng)求;若addr為300,則表明他是中斷標(biāo)志清除寄存器,對(duì)此寄存器的操作只會(huì)改變中斷掛起寄存器的狀態(tài),即若中斷標(biāo)志清除寄存器的相應(yīng)位未被屏蔽時(shí),且其為1,則將中斷掛起寄存器的相應(yīng)位置為0;若addr為304,則表明他是中斷結(jié)束命令寄存器,對(duì)此寄存器的操作只會(huì)影響到中斷棧的狀態(tài),即將棧頂?shù)膬?yōu)先級(jí)彈出,將中斷狀態(tài)恢復(fù)到上一個(gè)狀態(tài);若addr為308,則表明他是偽向量寄存器,對(duì)他的寫操作不會(huì)更改中斷控制器的狀態(tài)。本發(fā)明的有益效果是:本發(fā)明可以廣泛應(yīng)用于航空、航天、武器裝備、汽車、機(jī)器人、工業(yè)控制等嵌入式系統(tǒng)開發(fā)領(lǐng)域,提升這些行業(yè)的勞動(dòng)生產(chǎn)效率、降低成本、增強(qiáng)產(chǎn)品的競(jìng)爭(zhēng)能力。附圖說明圖1是各類型組件組成的組件庫(kù)。圖2是中斷設(shè)備級(jí)聯(lián)管理圖。圖3是中斷控制器的設(shè)備驅(qū)動(dòng)塊鏈表。圖4是中斷控制器設(shè)備組件結(jié)構(gòu)圖。具體實(shí)施方式下面對(duì)本發(fā)明的技術(shù)內(nèi)容進(jìn)行詳細(xì)介紹和說明:一.中斷控制器組件的特征與系統(tǒng)交互:中斷控制器在真實(shí)硬件環(huán)境中存在廣泛,基本每種需求都需要中斷控制器。在虛擬驗(yàn)證系統(tǒng)中,虛擬中斷控制器設(shè)備組件也是十分重要的。它與同步/異步虛擬設(shè)備組件不同,雖然都是靠著虛擬處理驅(qū)動(dòng)執(zhí)行,并接受處理器讀寫訪問,但是中斷控制器同時(shí)管理著所有其他設(shè)備組件的中斷信息,一方面與虛擬處理器交互,一方面采集管理所有的設(shè)備中斷信息,它的自身結(jié)構(gòu)與虛擬驗(yàn)證系統(tǒng)是緊耦合關(guān)系。因此它不屬于哪一類設(shè)備,而是具有獨(dú)立特征的一種設(shè)備組件。在虛擬驗(yàn)證系統(tǒng)中,所有的組件設(shè)備在向系統(tǒng)進(jìn)行注冊(cè)的過程匯總,系統(tǒng)會(huì)為每個(gè)帶有中斷源的設(shè)備建立一個(gè)設(shè)備驅(qū)動(dòng)塊,對(duì)其進(jìn)行中斷相關(guān)的管理,整個(gè)系統(tǒng)的中斷管理則是在系統(tǒng)維護(hù)的設(shè)備驅(qū)動(dòng)塊鏈表與虛擬中斷控制器設(shè)備組件的配合下完成的。在系統(tǒng)實(shí)例配置生成過程中,系統(tǒng)會(huì)根據(jù)每個(gè)設(shè)備的中斷源信息與中斷連接信息為其初始化設(shè)備驅(qū)動(dòng)塊,設(shè)備驅(qū)動(dòng)塊的連接關(guān)系則代表著設(shè)備與中斷控制器之間的連接關(guān)系。一個(gè)中斷級(jí)聯(lián)的例子如下圖2所示。如圖2所示,虛擬設(shè)備5的中斷信號(hào)連接至中斷控制器2,中斷控制器2作為設(shè)備,與虛擬設(shè)備3和4一同連接至中斷控制器1,中斷控制器1與處理器直接相連。在每個(gè)虛擬中斷控制器設(shè)備的實(shí)現(xiàn)中,均需要維護(hù)自己的中斷向量表,為連接到自身的虛擬設(shè)備維護(hù)中斷源信息,在每次驅(qū)動(dòng)設(shè)備執(zhí)行時(shí),則查詢所屬設(shè)備的中斷產(chǎn)生情況,實(shí)時(shí)的更新中斷向量表,并且一級(jí)一級(jí)的向上匯報(bào)中斷信息。最后由直接與處理器連接的中斷控制器向處理器產(chǎn)生中斷信號(hào),虛擬處理器則根據(jù)自身的異常向量表來響應(yīng)中斷消息。這種情況下,對(duì)于每一個(gè)虛擬中斷控制器設(shè)備組件,它并不能完成系統(tǒng)整體的中斷管理,因此需要由系統(tǒng)的設(shè)備驅(qū)動(dòng)塊鏈表,并對(duì)中斷信號(hào)產(chǎn)生與響應(yīng)進(jìn)行控制。系統(tǒng)維護(hù)的設(shè)備驅(qū)動(dòng)塊鏈表如圖3所示。在圖3中drivelstintctridev為中斷控制器的設(shè)備驅(qū)動(dòng)塊,driveistdev為各中斷源設(shè)備的設(shè)備驅(qū)動(dòng)塊,gdbintsvec為每個(gè)中斷控制器的中斷向量表。通過對(duì)這三種數(shù)據(jù)結(jié)構(gòu)的維護(hù),即可對(duì)系統(tǒng)全局的中斷信息進(jìn)行管理。并且,在這種機(jī)制的支持下,對(duì)虛擬處理器組件的實(shí)現(xiàn)提供了統(tǒng)一的中斷支持,每種體系結(jié)構(gòu)的處理器均可采取這種方式完成對(duì)中斷的響應(yīng)。涉及的數(shù)據(jù)結(jié)構(gòu)定義如下:二.滿足虛擬驗(yàn)證系統(tǒng)約束的中斷控制器結(jié)構(gòu)前面介紹了在虛擬驗(yàn)證系統(tǒng)中,為什么中斷控制器組件不同于其他的設(shè)備組件,因?yàn)橹袛嗫刂破鹘M件與系統(tǒng)之間通過相關(guān)數(shù)據(jù)結(jié)構(gòu)緊耦合,共同管理著所有的中斷源設(shè)備組件的中斷信息,并擔(dān)當(dāng)著采集中斷信息、傳遞中斷信息的責(zé)任,因此虛擬中斷控制器設(shè)備組件的實(shí)現(xiàn)方法與其他設(shè)備組件是不同的。下面將詳細(xì)介紹滿足虛擬驗(yàn)證系統(tǒng)通用結(jié)構(gòu)的中斷控制器設(shè)備組件結(jié)構(gòu),此處的中斷控制器設(shè)備組件可描述為一個(gè)具有8優(yōu)先級(jí),可單獨(dú)屏蔽的向量中斷控制器,也可稱為先進(jìn)中斷控制器aic(advancedinterruptcontroller)。其接口方框圖如圖4所示。aic中斷源:中斷控制器aic與虛擬處理器核的nfiq和nirq相連。nfiq為快速中斷請(qǐng)求,而nirq則可以由片內(nèi)外圍及外部中斷請(qǐng)求線irq0~irq2產(chǎn)生。8優(yōu)先級(jí)中斷編碼器允許用戶定義不同nirq中斷源的優(yōu)先級(jí)。內(nèi)部中斷源可編程為電平敏感中斷或邊沿觸發(fā)中斷。外部中斷則可以編程為上升沿、下降沿觸發(fā)和高電平、低電平中斷敏感。aic用戶編程接口:中斷控制器aic的用戶編程接口如下表1所示:表1aic用戶編程接口1)aic_ivr:irq向量寄存器,irqv的內(nèi)容為當(dāng)前中斷對(duì)應(yīng)的aic_svr的值。中斷源向量寄存器(1~31)使用讀中斷向量寄存器時(shí)的當(dāng)前中斷序號(hào)索引。如果沒有中斷,則irqv的值為0。當(dāng)前中斷值的是在讀取aic_ivr時(shí)具有最高優(yōu)先級(jí)別的已發(fā)生中斷。從aic_ivr讀到的值就是當(dāng)前中斷保存于中斷源向量寄存器(aic_svr)的入口地址。每個(gè)中斷源都有自己aic_svr。為了利用系統(tǒng)的硬件中斷向量功能,用戶在系統(tǒng)初始化的時(shí)候必須將各個(gè)中斷處理入口地址保存到對(duì)應(yīng)的aic_svr之中。2)aic_svr:中斷源向量寄存器,此寄存器用于保存中斷程序入口址。3)aic_eoicr:中斷結(jié)束命令寄存器,中斷服務(wù)程序用此寄存器指示中斷處理結(jié)束。可以對(duì)其寫入任何值,只要有寫操作就可以。4)aic_iecr:中斷使能命令寄存器,控制中斷是否使能。5)aic_idcr:中斷禁止命令寄存器。其他寄存器不再贅述。中斷優(yōu)先級(jí)控制:nirq由8優(yōu)先級(jí)編碼器控制。每個(gè)中斷源都有一個(gè)軟件可編程的中斷級(jí)別,級(jí)別7為最高,級(jí)別0為最低。如果aic同時(shí)接受多個(gè)中斷,則具有最高優(yōu)先級(jí)的中斷首先得到服務(wù)。如果中斷級(jí)別相同,則中斷源編號(hào)低的先得到服務(wù)。當(dāng)中斷優(yōu)先級(jí)指的是讀取aic_ivr時(shí)的當(dāng)前中斷的優(yōu)先級(jí)。當(dāng)一個(gè)中斷存在時(shí),是否有更高優(yōu)先級(jí)的中斷發(fā)生,取決于處理器是否已經(jīng)讀取了aic_ivr。系統(tǒng)有兩種應(yīng)對(duì)方法:1)如果已經(jīng)施加了nirq,而aic_ivr還沒有被處理器讀取,則處理器將讀取aic_ivr中的新的更高優(yōu)先級(jí)中斷的處理程序入口地址,并更新當(dāng)前中斷級(jí)別;2)如果處理器已經(jīng)讀取了aic_ivr,之后才再施加nirq,則處理器可以處理中斷嵌套,并將再一次讀取aic_ivr,讀出新的,更高優(yōu)先級(jí)中斷處理程序入口地址,然后處理這個(gè)新的,更高優(yōu)先級(jí)的中斷。同時(shí)當(dāng)前中斷級(jí)別壓入先入后出棧,更新為更高優(yōu)先級(jí)中斷的中斷級(jí)別。中斷結(jié)束后,應(yīng)寫中斷結(jié)束命令寄存器(aic_eoicr),當(dāng)前中斷級(jí)別被存儲(chǔ)于堆棧內(nèi)前中斷級(jí)別所更新。因此,當(dāng)更高優(yōu)先級(jí)中斷結(jié)束后,aic回到前的狀態(tài),此狀態(tài)對(duì)應(yīng)被更高優(yōu)先級(jí)中斷所中斷的低優(yōu)先級(jí)中斷。三.虛擬驗(yàn)證系統(tǒng)的中斷控制器設(shè)備組件實(shí)現(xiàn)方法:aic共有78個(gè)寄存器,每個(gè)寄存器占有4個(gè)字節(jié)。因此aic設(shè)備的內(nèi)存所指向的地址空間至少要有312個(gè)字節(jié)大小。另外加上一個(gè)中斷棧,其大小為256個(gè)字節(jié),加上棧頂標(biāo)識(shí),共257個(gè)字節(jié),因此aic的mm所需的內(nèi)存空間大小為312+257共569個(gè)字節(jié)。其映射如表2所示。表2aic設(shè)備內(nèi)存空間映射表aic初始化接口的實(shí)現(xiàn):aic設(shè)備初始接口的功能主要是為aic設(shè)備申請(qǐng)內(nèi)存空間,用來保存設(shè)備的狀態(tài)信息,并初始化aic設(shè)備的狀態(tài)信息。由上一節(jié)可知,aic設(shè)備所需要申請(qǐng)的內(nèi)存空間的大小為568個(gè)字節(jié),其中前304個(gè)字節(jié)用于模擬各個(gè)寄存器,后面的字節(jié)用來模擬aic設(shè)備的硬件棧。aic設(shè)備的初始化接口內(nèi)部邏輯如下:aic復(fù)位接口的實(shí)現(xiàn):aic設(shè)備的復(fù)位接口的功能主要是將aic設(shè)備的所有寄存器信息復(fù)位為默認(rèn)值,并將中斷棧的棧頂指向棧底,其內(nèi)部邏輯如下:intaic_reset(bus*bus_ctr,unsignedchari){將所有寄存器置為默認(rèn)值;將棧頂標(biāo)志置為0,使其指向棧底;返回;}設(shè)備組件讀接口的實(shí)現(xiàn):設(shè)備組件讀接口定義如下:intaic_read_word(bus*bus_ctr,unsignedchari)內(nèi)部邏輯如下:1)獲取偏移地址addr=bus_ctr->addr-bus_ctr->device_table[i].start_addr;2)若addr在0到252中,表明其是中斷源模式寄存器或中斷源向量寄存器,對(duì)他們的進(jìn)行寫操作不會(huì)引起中斷控制器狀態(tài)的改變,因此直接將數(shù)據(jù)總線上的數(shù)據(jù)寫入相應(yīng)的寄存器即可bus_ctr->data=((unsignedlong*)&(bus_ctr->device_table[i].mm[address]));3)若addr在256到284中,則表明其要訪問的寄存器為irq向量寄存器,fiq向量寄存器,中斷狀態(tài),掛起,屏蔽和內(nèi)核中斷狀態(tài)寄存器,以及兩個(gè)保留的地址,由此這些寄存器是只讀的,因此不能夠?qū)λ麄冞M(jìn)行些操作,因此直接返回0即可,表明寫失敗。4)若addr為270則表明其要訪問的寄存器為fiq向量寄存器,則首先判斷中斷掛起寄存器是否有中斷未激活,若無,則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線。否則將中斷源向量寄存器1的值寫入數(shù)據(jù)總線。5)若addr在274到286中,則表明他們是中斷狀態(tài),中斷掛起,中斷屏蔽,內(nèi)核中斷狀態(tài)寄存器,對(duì)他們的讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將這些寄存器的值寫入數(shù)據(jù)總線即可。bus_ctr->data=((unsignedlong*)&(bus_ctr->device_table[i].mm[address]));6)若addr在290到300之間,則表明他們是中斷使能,中斷禁止,中斷標(biāo)志設(shè)置,中斷標(biāo)志清除以及中斷結(jié)束命令寄存器。這些寄存器都是只寫寄存器,不能對(duì)他們進(jìn)行讀操作,因此只寫返回0表明讀失敗即可。7)若addr為304,則表明他是未向量寄存器,對(duì)此寄存器進(jìn)行讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將此寄存器的值寫入數(shù)據(jù)總線即可。bus_ctr->data=((unsignedlong*)&(bus_ctr->device_table[i].mm[address]));8)返回。設(shè)備組件寫接口的實(shí)現(xiàn):設(shè)備組件讀接口定義如下:intaic_write_word(bus*bus_ctr,unsignedchari)內(nèi)部邏輯如下:獲取偏移地址addr=bus_ctr->addr-bus_ctr->device_table[i].start_addr;2)若addr在0到252中,表明其是中斷源模式寄存器或中斷源向量寄存器,對(duì)他們的讀操作不會(huì)引發(fā)狀態(tài)的改變,因此直接返回相應(yīng)寄存器的內(nèi)容即可。*((unsignedlong*)&(bus_ctr->device_table[i].mm[address]))=bus_ctr->data;3)若addr為256則表明其要訪問的寄存器為irq向量寄存器,首先檢查中斷掛起寄存器是否有中斷,若沒有則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線并返回,否則檢查中斷掛起寄存器,找出比當(dāng)前中斷優(yōu)先級(jí)高的且未被屏蔽的中斷號(hào),將其優(yōu)先級(jí)壓入中斷棧,修改中斷狀態(tài)寄存器,并將對(duì)應(yīng)此中斷號(hào)的中斷源向量寄存器的值寫入數(shù)據(jù)總線。4)若addr為270則表明其要訪問的寄存器為fiq向量寄存器,則首先判斷中斷掛起寄存器是否有中斷未激活,若無,則表明發(fā)生了偽中斷,將偽中斷向量寄存器的值寫入數(shù)據(jù)總線。否則將中斷源向量寄存器1的值寫入數(shù)據(jù)總線。5)若addr在274到284中,則表明他們是中斷狀態(tài),中斷掛起,中斷屏蔽,內(nèi)核中斷狀態(tài)寄存器,對(duì)他們的讀操作不會(huì)改變中斷控制器的狀態(tài),因此直接將這些寄存器的值寫入數(shù)據(jù)總線即可。*((unsignedlong*)&(bus_ctr->device_table[i].mm[address]))=bus_ctr->data;6)若addr為288,則表明他是中斷使能寄存器,對(duì)此寄存器的操作只會(huì)改變中斷屏蔽寄存器的狀態(tài),只需將中斷屏蔽寄存器和總線上的數(shù)據(jù)進(jìn)行或操作即可,并將結(jié)果存入中斷屏蔽寄存器。*(unsignedlong*)(&bus_ctr->devic_table[i].mm[0x110])=*(unsignedlong*)(&bus_ctr->devic_table[i].mm[0x110])|bus_ctr->data。7)若addr為292,則表明他是中斷禁止寄存器,對(duì)此寄存器的操作同樣只會(huì)改變中斷屏蔽寄存器的狀態(tài),只需將中斷屏蔽寄存器和總線上的數(shù)據(jù)進(jìn)行與操作即可,并將結(jié)果存入中斷屏蔽寄存器。*(unsignedlong*)(&bus_ctr->devic_table[i].mm[0x110])=*(unsignedlong*)(&bus_ctr->devic_table[i].mm[0x110])&(!bus_ctr->data)。8)若addr為296,則表明他是中斷標(biāo)志設(shè)置寄存器。對(duì)此寄存器的操作只會(huì)改變中斷掛起寄存器的狀態(tài),即若中斷標(biāo)志設(shè)置寄存器的響應(yīng)位為被屏蔽時(shí),且其為1,則將中斷掛起寄存器的相應(yīng)位置為1。9)在將中斷掛起寄存器更新后。若中斷掛起寄存器的0位為1,則發(fā)出fiq中斷,否則遍歷中斷掛起寄存器,獲取優(yōu)先級(jí)最高的中斷的中斷號(hào),若其優(yōu)先級(jí)比棧頂?shù)漠?dāng)前優(yōu)先級(jí)高,則此優(yōu)先級(jí)壓棧,并向cpu發(fā)出irq中斷請(qǐng)求。10)若addr為300,則表明他是中斷標(biāo)志清除寄存器。對(duì)此寄存器的操作只會(huì)改變中斷掛起寄存器的狀態(tài),即若中斷標(biāo)志清除寄存器的相應(yīng)位未被屏蔽時(shí),且其為1,則將中斷掛起寄存器的相應(yīng)位置為011)若addr為304,則表明他是中斷結(jié)束命令寄存器,對(duì)此寄存器的操作只會(huì)影響到中斷棧的狀態(tài),即將棧頂?shù)膬?yōu)先級(jí)彈出,將中斷狀態(tài)恢復(fù)到上一個(gè)狀態(tài)。if(bus_ctr->devic_table[i].mm[0x13d]?。?)//若棧不空bus_ctr->devic_table[i].mm[0x13d]--;//將棧標(biāo)志減112)若addr為308,則表明他是偽向量寄存器,對(duì)他的寫操作不會(huì)更改中斷控制器的狀態(tài)。*((unsignedlong*)&(bus_ctr->device_table[i].mm[address]))=bus_ctr->data;13)返回。本發(fā)明可以廣泛應(yīng)用于航空、航天、武器裝備、汽車、機(jī)器人、工業(yè)控制等嵌入式系統(tǒng)開發(fā)領(lǐng)域,提升這些行業(yè)的勞動(dòng)生產(chǎn)效率、降低成本、增強(qiáng)產(chǎn)品的競(jìng)爭(zhēng)能力。以上內(nèi)容是結(jié)合具體的優(yōu)選實(shí)施方式對(duì)本發(fā)明所作的進(jìn)一步詳細(xì)說明,不能認(rèn)定本發(fā)明的具體實(shí)施只局限于這些說明。對(duì)于本發(fā)明所屬
技術(shù)領(lǐng)域:
:的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干簡(jiǎn)單推演或替換,都應(yīng)當(dāng)視為屬于本發(fā)明的保護(hù)范圍。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12