[轉}SkyEye硬件模擬平臺,第三部分: 硬件仿真實現之二

SkyEye硬件模擬平臺,第三部分: 硬件仿真實現之二

CPU/開發板仿真

developerWorks
文檔選項
將打印機的版面設置成橫向打印模式

打印本頁

將此頁作爲電子郵件發送

將此頁作爲電子郵件發送

未顯示需要 JavaScript 的文檔選項


級別: 初級

陳渝 ([email protected])清華大學

2004 年 10 月 01 日

本系列文章的第三部分主要介紹了SkyEye硬件模擬平臺的實現細節。主要內容包括SkyEye的總體設計、SkyEye的可擴展框架、SkyEye的關鍵數據結構、SkyEye對各種CPU的模擬實現、SkyEye對各種外設的模擬實現、如何安裝使用SkyEye以及如何擴展SkyEye的仿真模塊等。對SkyEye的深入瞭解,有助於對嵌入式硬件系統有更深入的認識,特別是對操作系統、驅動程序如何與嵌入式硬件系統進行交互有更深刻的瞭解。

1.1.1 SkyEye的CPU和開發板模擬實現





回頁首


1. CPU總體模擬實現

CPU是計算機硬件的核心,目前的SkyEye模擬的是基於ARM CPU內核的CPU體系結構(將來會擴展到非ARM體系結構的其它CPU)。雖然存在數量衆多的基於ARM內核的CPU,但這些CPU的核心基本上是相同的,大部分基於ARM v3-v5體系結構,並加以擴展。從硬件實現上,ARM CPU內核已經發展到第五代,芯片設計也越來越複雜,但由於SkyEye的模擬級別是指令級的,所以在設計上可以從軟件實現角度進行各種模擬優化和簡化。

操作系統的任務是提供一個環境,使得上層的應用程序不用與底層的硬件直接打交道,且多個應用程序之間可以共同執行,共享硬件資源。實際上,操作系統是建立在硬件上的一個虛擬機環境,而應用程序是建立在操作系統之上的程序,這個程序感覺好像它獨佔了整個硬件資源,而這實際上是操作系統給應用程序提供的一個假象,就象電影"Matrix"中描述的那個虛幻的繁華世界一樣。而SkyEye的任務就是讓操作系統感覺在一個真實的硬件環境中運行,這是一個更低層次的虛擬機環境,操作系統"看到"的所有硬件都是SkyEye虛擬出來的。

爲了達到這個目標,首先需要分析操作系統可以看到什麼硬件。從操作系統的角度看,操作系統可以訪問到的ARM CPU內核硬件部分包括通用寄存器(R0-R15)、程序狀態寄存器(CPSR和SPSR)、基於ARM內核的特定CPU的IO寄存器等、基於ARM內核的特定CPU的協處理器等。如果需要深入瞭解ARM的體系結構,建議參考Steve Furber編寫的《ARM System-on-Chip Architecture》和ARM公司編寫的《ARM Architecture Reference Manual》。

爲了能夠支持ARM v1-v5的體系結構模擬,我們在設計CPU模擬時,必須完成如下工作:

  • 建立所有操作系統可以"看到"的硬件單元,這些建立在基於ARMul_State數據結構的全局變量state中;
  • 實現基於三級流水線硬件邏輯模擬,它們在armemu.c的函數ARMul_Emulate32/26中實現;
  • 識別並能夠執行所有的ARM指令集的硬件邏輯模擬,它們在armemu.c的函數ARMul_Emulate32/26中實現;
  • 完成異常處理的硬件邏輯模擬,armemu.c的函數ARMul_Emulate32/26中和arminit.c的函數ARMul_Abort中實現。

如果完成了這四部分工作,ARM CPU核心的模擬工作基本就算完成了。





回頁首


2. 三級流水線模擬實現

三級流水線的ARM體系結構的主要的組成包括:

  • 寄存器堆:各種CPU模式下的寄存器的集合,可對應於ARMul_State數據結構中的域ARMword RegBank[7][16];
  • 桶式移位器:用來把一個操作數移位任意位數;
  • 地址寄存器和增值器:用來選擇和保留存儲器地址,併產生順序遞增的地址;
  • 數據輸入/輸出寄存器:用來保存從存儲器輸入或向存儲器輸出的數據;
  • 指令譯碼和相關控制邏輯:完成指令譯碼並執行指令的控制邏輯,這由文件armemu.c中的函數ARMul_Emulate32/26來實現。

三級流水線的硬件邏輯描述如下:

1. 取指令:即從存儲器中取出指令,放入指令流水線。對應於SkyEye的實現是根據pc值取對應的存儲器內容到instr變量中;

2. 指令譯碼:指令被譯碼,佔用譯碼邏輯,併爲下一週期準備數據通路的控制信號。SkyEye沒有具體的對應實現,只是把譯碼階段的指令保存在一個變量中。

3. 指令執行:根據譯碼的情況,執行具體的指令控制邏輯,即指令佔用數據通路,讀取相關的寄存器,完成數據處理操作、地址轉移操作或執行存儲器數據訪問操作等。

前兩部分在armemu.c的函數ARMul_Emulate32/26中的前一小部分實現,第三部分在armemu.c的函數ARMul_Emulate32/26中的後大半部分實現。





回頁首


3. 異常處理模擬實現

異常是指在程序運行時發生的異步意外事件,如外設產生中斷,硬件故障等,在邏輯上它發生在指令執行中。對應ARM和其它一些CPU體系結構而言,異常也包括軟件產生的中斷(如除零操作)和未定義指令陷阱等,而這些是同步事件,在邏輯上它發生在指令執行前。

ARM體系結構的異常分爲三類:

  • 指令執行引起的直接異常:如軟件中斷異常、未定義指令異常和預取指令中止異常(因爲在取指過程中的存儲器故障導致的無效指令);
  • 指令執行引起的間接異常:數據中止異常(在數據訪問時的存儲器故障)
  • 外設產生的與指令無關的異常:包括reset、IRQ、FIQ

當異常發生時,ARM CPU內核儘量完成當前指令,然後改變當前的程序計數寄存器R15的值,使其指向異常向量地址。間接異常和外設引起的異常將打亂流水線的正常處理過程。如果發生異常,ARM CPU將執行如下操作:

1. CPU進入與特定異常相對應的CPU操作模式;

2. 將引起異常指令的下一條指令的地址保存到新模式的R14寄存器中;

3. 將原模式中的CPSR保存到新模式的SPSR中;

4. 如果是IRQ異常,則設置CPSR的第七位來禁止IRQ;如果是FIQ,則除了禁止IRQ,還要進一步設置CPSR的第六位來禁止FIQ;

5. 根據異常的種類,把R15寄存器設置爲相對應的異常向量地址,並執行對應的指令。

上述的處理過程在arminit.c的ARMul_Abort函數中和armemu.c的ARMul_Emulate32/26函數中的一部分實現。而與具體指令的執行相關的部分可直接參考armemu.c的ARMul_Emulate32/26函數後半部分實現的源碼,這是整個函數的主體。





回頁首


4. 協處理器模擬

ARM基本核心的功能並不能滿足各種各樣的應用需求(如浮點處理、信號處理等),所以爲了能夠提高ARM體系結構的擴展性,ARM通過增加硬件協處理器和協處理器接口在支持指令集擴展,也可以通過未定義指令異常來實現軟件擴展指令模擬(這樣性能差很多)。最常用的ARM協處理器是控制MMU/CACHE等的系統協處理器,如ARM720T的MMU/CACHE管理單元。

ARM的協處理器體系結構支持16個協處理器,每個協處理器可以有16個寄存器(位數不定),協處理器使用類RISC的Load/Store體系結構,主要有以下幾類指令:

  • 協處理器數據操作指令:用於控制數據在協處理器內部的操作。
  • 協處理器數據傳送指令:類似標準ARM的字/字節數據傳送指令,即把數據傳送到協處理器內的寄存器中,或把協處理器的寄存器中的數據存儲到內存單元。
  • 協處理器寄存器傳送指令:把協處理器中產生的整數直接傳送給ARM寄存器和ARM條件碼標誌位。

實際協處理器的硬件實現還要考慮協處理器的接口實現技術(即如果與ARM CPU核心進行通信)。SkyEye實現的協處理器模擬比較簡單,與協處理器模擬的關鍵數據保存在ARMul_State的如下域中:

  • 協處理器初始化/退出停止函數指針
    CPInit CPExit
  • 協處理器指令函數指針,對應各種協處理器指令
    LDC STC MRC MCR CDP CPRead CPWrite
  • 協處理器內部寄存器數據
    CPData

協處理器的模擬處理主要有如下幾個部分:

  • 協處理器初始化:主要由文件armcopro.c中的函數ARMul_CoProInit完成。如果是支持MMU/CACHE的CPU,則需要注意的是對系統協處理器(15號協處理器)的初始化,ARMul_CoProInit完成了CPInit、MRC、MCR這幾個協處理器指令函數指針的賦值。由於XScale體系結構的CPU存在第13號和第14號協處理器,所以如果要模擬這種類型的CPU,也會對這兩個處理器進行初始化。
  • 協處理器指令模擬:當在執行指令過程中,發現指令是協處理器指令,則把指令轉交特定的協處理器指針函數進行進一步處理。與15號協處理器相關的協處理指令主要是MRC和MCR,且與MMU/CACHE的設置有關。這兩個協處理器函數的具體實現與特定的CPU相關,目前包括:
    • ARM720T實現:位於文件arm7100_mmu.c的函數a71_mmu_mcr/mrc
    • ARM920T實現:位於文件arm920t_mmu.c的函數arm920t_mmu_mcr/mrc
    • StrongARM實現:位於文件sa_mmu.c的函數sa_mmu_mcr/mrc
    • XScale實現:位於文件xscale_copro.c的函數xscale_mmu_mcr/mrc

XScale體系結構的CPU存在第13號和第14號協處理器,且ARM Linux對它們也有邏輯控制,所以在文件xscale_copro.c的函數xscale_cp13/14/15_*完成了對應的協處理器指令的硬件邏輯模擬。

通過上述的協處理器模擬實現,SkyEye能夠完成ARM Linux for ep7312/SA1100/PXA25x等內核執行的協處理器指令,保證內核能夠正常運行。





回頁首


5. I/O硬件模擬

由於大部分基於ARM內核的各種CPU和開發板都有自己的擴展,而且一般各不相同。由於這一部分與硬件系統的I/O有很大的關係,因此SkyEye建立了一個I/O抽象層,把這一部分獨立出來,然後建立各個特定CPU和開發板的I/O處理模擬實現,這樣最大程度地減少了代碼冗餘,同時結構和模塊化更清晰,這也有利於開發者在此基礎上開發其它類型的CPU和開發板。SkyEye的I/O抽象層的實現在armio.c文件中,而與特定硬件相關的實現則分別在如下文件中:

  • skyeye_mach_at91.c:模擬Atmel AT91X40開發板
  • skyeye_mach_ep7312.c:模擬cirrus ep7312開發板
  • skyeye_mach_sa.c:模擬基於intel strongam的adsbitsy開發板
  • skyeye_mach_pxa.c:模擬intel xscale lubbock開發板
  • skyeye_mach_s3c4510b.c:模擬基於samsung s3c4510b的開發板
  • skyeye_mach_s3c44b0.c:模擬基於samsung s3c44b0的開發板
  • skyeye_mach_lpc.c:模擬基於philips lpc2249的開發板
  • skyeye_mach_cs89712.c:模擬基於cs89712的開發板
  • skyeye_mach_sharp.c:模擬基於sharp lh7a400的開發板
  • skyeye_mach_at91rm92.c:模擬基於at91rm9200的開發板

實際上,SkyEye如果實現clock的I/O模擬,再加上內存模擬(mem_bank的起始地址和大小由配置文件skyeye.conf定義),則可以運行支持分時操作的最基本操作系統(如μC/OS-II等)了。而爲了能夠支持字符的輸入輸出,則還需要進一步實現UART模擬。所以支持clock和UART兩部分的模擬是SkyEye能夠運行一個比較實際的操作系統的最基本要求。下面分別對主要幾個特定CPU和開發板的模擬進行介紹。





回頁首


6. 基於AT91X40的開發板

AT91X40爲ATMEL公司基於ARM7TDMI核的32位CPU,其核心爲高性能的32位RISC體系結構,並具有高密度的16位指令集和極低的功耗。AT91X40系列微控制器內部有一個8優先級、可單獨屏蔽的向量中斷控制器,稱爲先進中斷控制器AIC(Advanced Interrupt Controller)。AT91X40系列微控制器集成了兩個完全相同的全雙工通用同步/異步收發器(USART)。Time Clock共有3個通道,有16位定時器/計數器,支持捕獲和波形模式。每個TC都可以測量或產生不同的波形,並可以檢測及控制兩個I/O信號。TC還有3個外部時鐘信號。這些外設都可以通過相關的I/O寄存器進行設置和訪問。

μClinux包含對基於AT91X40的開發板的BSP(Board Support Package),通過分析AT91X40體系結構和μClinux內核源碼,SkyEye只需保存如下數據結構描述的寄存器、內部數據(這些寄存器的值和內部數據可能被操作系統或硬件改變)和一些只讀寄存器就基本可以支持μClinux內核和基本命令行用戶界面以及相關應用程序。查看at91_io_read/write_byte/halfword/word函數的實現可以看到所有操作系統需要訪問的寄存器。

typedef struct at91_io {
        ARMword         syscon;                 /* System control reg*/
        ARMword         sysflg;                  /* System status flags reg*/
        ARMword         intsr;                    /* Interrupt status reg */
        ARMword         intmr;                   /* Interrupt mask reg */
        ARMword         tcd[2];                  /* Timer/counter data */
        ARMword         tcd_reload[2];      /* Last value written */
        int                     tc_prescale;
        ARMword         uartdr;                 /* Receive data register */
        ARMword         lcdcon;                 /* LCD control */
        ARMword         lcd_limit;              /* 0xc0000000 <= LCD buffer < lcd_limit */
} at91_io_t;

下面的的字符串數組描述的是與UART相關的I/O寄存器的簡稱,它們會被μClinux訪問。

static char *uart_reg[] = {
	"CR",	"MR",	"IER",	"IDR",	"IMR",
	"CSR",	"RHR",	"THR",	"BRGR",	"RTOR",
	"TTGR",	"RES1",	"RPR",	"RCR",	"TPR",
	"TCR",
}; 

由於LCD模擬實現還在開發中,目前與LCD模擬實現相關的lcdcon和lcd_limit還沒有用到。下面對一些關鍵的I/O模擬函數進行介紹:

  • at91_io_reset:完成硬件執行reset後的寄存器狀態模擬。
  • at91_io_do_cycle:每個指令節拍中都會執行一次,模擬時鐘累加、讀取UART輸入和網絡數據包輸入(在"SkyEye的網絡模擬實現"一節中介紹)、產生中斷等硬件操作。
  • uart_read/uart_write:模擬讀寫uart寄存器的硬件操作。如寫AT91的TCR寄存器(映射地址爲0xfffd000f),實際上是執行UART輸出操作。
  • at91_io_read/write_byte/halfword/word:模擬CPU讀寫中斷處理、時鐘、UART等相關I/O寄存器的硬件操作。這裏需要注意兩點:CPU讀某些I/O寄存器(如Time Clock 1 Sr寄存器,映射地址爲0xfffe0060)可能會改變另外一些寄存器的值,而這種情況在正常的內存訪問中是不存在的;μClinux通過讀取IVR寄存器(映射地址爲0xfffff100)來查詢中斷源,但找到一箇中斷源後,IVR寄存器的相關位會清除。

這樣SkyEye就可以很好地模擬基於AT91X40的開發板,而且μClinux針對真實基於AT91X40的開發板的內核和文件系統可以很好地在SkyEye上運行。





回頁首


7. 基於ep7312的開發板

ep7312爲Cirrus Logic公司基於ARM720T核的32位CPU,其核心爲高性能的32位RISC體系結構,並具有高密度的16位指令集和極低的功耗,支持MMU/CACHE。ARM720覈實際上是ARM7TDMI核加上一個8KB的數據和指令混合的CACHE,外部存儲器和外圍硬件通過AMBA總線主控單元訪問,它還集成了MMU、寫緩衝器(write buffer)、LCD控制器、中斷控制器等。

ARM Linux包含對基於ep7312的開發板的BSP(Board Support Package)。通過分析ep7312體系結構和ARM Linux內核源碼,SkyEye只需保存如下數據結構描述的寄存器、內部數據(這些寄存器和內部數據的值可能被操作系統或硬件改變)和一些只讀寄存器就基本可以支持ARM Linux內核和基本命令行用戶界面和相關應用程序。查看ep7312_io_read/write_byte/halfword/word函數的實現可以看到所有操作系統需要訪問的寄存器。與MMU/CACHE相關的模擬實現可參考"SkyEye的MMU/CACHE和Memory模擬實現"一節。

typedef struct ep7312_io {
	ARMword		syscon;			/* System control */
	ARMword		sysflg;			/* System status flags */
	ARMword		intsr;			         /* Interrupt status reg */
	ARMword		intmr;			/* Interrupt mask reg */
	ARMword		tcd[2];			/* Timer/counter data */
	ARMword		tcd_reload[2];		/* Last value written */
	int		         tc_prescale;
	ARMword		uartdr;			/* Receive data register */
	ARMword		lcdcon;			/* LCD control */
	ARMword		lcd_limit; /* 0xc0000000 <= LCD buffer < lcd_limit */
} ep7312_io_t;

細心的讀者可能注意到這裏的結構與at91_io_t數據結構是一樣的。其實它們在中斷處理和UART處理上有所不同,但在時鐘處理上很類似。有關LCD的模擬實現可參考"SkyEye的LCD模擬實現"。下面對一些關鍵的I/O模擬函數進行介紹:

  • ep7312_io_reset:完成硬件執行reset後的寄存器狀態模擬,它與at91_io_reset的內容基本一樣。
  • ep7312_io_do_cycle:每個指令節拍中都會執行一次,模擬時鐘累加、讀取UART輸入、產生中斷等硬件操作。
  • ep7312_io_read/write_byte/halfword/word:模擬讀寫uart寄存器,LCD寄存器、中斷處理和其它相關I/O寄存器的硬件操作,寫UARTDR寄存器(映射地址爲0x80000480),實際上是執行UART輸出操作。

加上MMU/CACHE和內存模擬,SkyEye就可以很好地模擬基於ep7312的開發板,而且ARM Linux針對真實基於ep7312的開發板的內核和文件系統可以很好地在SkyEye上運行。





回頁首


8. 基於StrongARM的開發板

目前基於StrongARM CPU核的CPU有SA-110、SA1100和SA1110。StrongARM CPU核是基於ARM v4 體系結構,並進行了大量的擴展,採用了獨立的指令MMU/CACHE和數據MMU/CACHE,並增加了read buffer和write buffer。StrongARM體系結構的SA-1100/1110還包括LCD控制器、系統控制單元、DMA控制器、UART串口單元、定時器、實時時鐘、中斷控制器、電源管理控制器和28個通用I/O引腳等。用SA-1100組成的系統在PCB這一層次會比較簡單,且功能強大。雖然目前Intel公司已經停止了對StrongARM結構的開發,但基於StrongARM體系結構的PDA曾經稱雄一時,與Palm公司的PDA系列成兩足鼎立之勢。而且,理解StrongARM體系結構會有助於瞭解Intel公司新的XScale體系結構,二者有很多相近之處。

ARM Linux包含對基於StrongARM的開發板的BSP(Board Support Package)。通過分析基於StrongARM體系結構的SA1100內部細節和ARM Linux內核源碼,SkyEye只需保存如下數據結構描述的寄存器、內部數據(這些寄存器和內部數據的值可能被操作系統或硬件改變)和一些只讀寄存器就基本可以支持ARM Linux內核和基本命令行用戶界面以及相關應用程序。查看ep7312_io_read/write_byte/halfword/word函數的實現可以看到所有操作系統需要訪問的寄存器。與MMU/CACHE相關的模擬實現可參考錯誤!未找到引用源節。

typedef struct sa_io_t{
	/*interrupt controller*/
	u32 icpr;	u32 icip;	u32 icfp;	u32 icmr;	u32 iccr;	u32 iclr;
	/*real time clock(RTC)*/
	u32 rcnr;	u32 rtar;	u32 rtsr;	u32 rttr;     u32 rt_count;
	u32 rt_scale; /*core frequence to 32.768K*/
	/*os timer*/
	u32 oscr;	u32 osmr0, osmr1, osmr2, osmr3;	u32 ower;	u32 ossr;
	u32 oier;	u32 os_scale;
	/*uart3 controller*/
	u32 utcr0;	u32 utcr1;	u32 utcr2;	u32 utcr3;	u32 utdr;	u32 utsr0;
	u32 utsr1;
}sa_io_t;

在上述結構中,包括四部分的I/O寄存器組:與中斷控制相關的寄存器、與實時時鐘控制相關的寄存器、與OS timer相關的寄存器和與UART 3(UART0-2在內核中沒有使用,這裏就沒有模擬了)相關的寄存器。下面對一些關鍵的I/O模擬函數進行介紹:

  • sa_io_reset:完成硬件執行reset後的寄存器狀態模擬,這裏只是把sa_io_t結構的變量sa_io清零。
  • sa_io_do_cycle:每個指令節拍中都會執行一次,模擬實時時鐘和OS timer的累加、判斷UART 是否有輸入、根據外設的狀態產生中斷(由skyeye_mach_sa.c中的函數refresh_irq實現)等硬件操作。
  • sa_io_read/write_byte/halfword/word:模擬CPU讀寫中斷處理、實時時鐘、OS timer、UART3相關I/O寄存器的硬件操作,模擬讀/寫UTDR寄存器(映射地址爲0x80050014),實際上是執行UART輸入/輸出操作。

加上MMU/CACHE和內存模擬,SkyEye就可以很好地模擬基於StrongARM的開發板,而且ARM Linux針對真實基於StrongARM的adsbitsy開發板的內核和文件系統可以很好地在SkyEye上運行。





回頁首


9. 基於XScale的Lubbock開發板

支持XScale體系結構CPU的開發板目前已有數款,如代號爲lubbock、 cerf、 idp等的開發板,這裏分析的開發板是Intel推出的代號爲Lubbock的經典開發板,它目前支持PXA25x系列CPU,有64MBytes SDRAM、32MBytes Boot ROM、32MBytes Flash ROM、USB插槽、PCMICA插槽、CF卡插槽、帶有640x480的LCD顯示器,可以稱之爲一個小型的全功能計算機。

ARM Linux對XScale體系結構的支持已經放到Linux-2.6.x內核中,目前由R.King維護,且已經支持多款基於XScale體系結構的開發板,而lubbock開發板是ARM Linux最早支持且支持得很全面的開發板之一。通過分析基於XScale體系結構的PXA250內部細節和ARM Linux內核源碼,SkyEye只需保存如下數據結構描述的寄存器、內部數據(這些寄存器和內部數據的值可能被操作系統或硬件改變)和一些只讀寄存器就基本可以支持ARM Linux內核和基本命令行用戶界面以及相關應用程序。查看pxa_io_read/write_byte/halfword/word函數的實現可以看到所有操作系統需要訪問的寄存器。與MMU/CACHE相關的模擬實現可參考"SkyEye的MMU/CACHE和Memory模擬實現"一節。

typedef struct pxa_io_t{
	/*interrupt controller*/
	u32 icpr;	u32 icip;	u32 icfp;	u32 icmr;	u32 iccr;	u32 iclr;
	/*real time clock(RTC)*/
	u32 rcnr;	u32 rtar;	u32 rtsr;	u32 rttr;
	u32 rt_count;     u32 rt_scale; 
	/*os timer*/
	u32 oscr;	u32 osmr0, osmr1, osmr2, osmr3;	u32 ower;	u32 ossr;
	u32 oier;	u32 os_scale; 	
	/*full function uart controller*/
	u32 ffrbr;	u32 ffthr;	u32 ffier;	u32 ffiir;	u32 fffcr;	u32 fflcr;
	u32 ffmcr;	u32 fflsr;	u32 ffmsr;	u32 ffspr;	u32 ffisr;	u32 ffdll;
	u32 ffdlh;
	/*bluetooth function uart controller*/
	u32 btrbr;	u32 btthr;	u32 btier;	u32 btiir;	u32 btfcr;	u32 btlcr;
	u32 btmcr;	u32 btlsr;	u32 btmsr;	u32 btspr;	u32 btisr;	u32 btdll;
	u32 btdlh;
	/*standard uart controller*/
	u32 strbr;	u32 stthr;	u32 stier;	u32 stiir;	u32 stfcr;	u32 stlcr;
	u32 stmcr;	u32 stlsr;	u32 stmsr;	u32 stspr;	u32 stisr;	u32 stdll;
	u32 stdlh;
	/*core clock*/
	u32 cccr;	u32 cken;	u32 oscc;
}pxa_io_t;

下面對一些關鍵的I/O模擬函數進行介紹:

  • pxa_io_reset:完成硬件執行reset後的寄存器狀態模擬。這裏除了把sa_io_t結構的變量sa_io清零,還有執行如下指令 pxa_io.cccr = 0x121; // 1 0010 0001 pxa_io.cken = 0x17def; 這是PXA25x CPU在重啓(reset)時,與Core Clock控制器相關的兩個寄存器的初始值。
  • pxa_io_do_cycle:每個指令節拍中都會執行一次,模擬實時時鐘和OS timer的累加、判斷Full Function UART是否有輸入、根據外設的狀態產生中斷(由skyeye_mach_pxa.c中的函數refresh_irq實現)等硬件操作。
  • pxa_io_read/write_byte/halfword/word:模擬CPU讀寫中斷處理、實時時鐘、OS timer、Full Function UART、Core Clock控制器相關I/O寄存器的硬件操作,模擬讀FFRBR寄存器(映射地址爲0x40100000)/寫FFTHR寄存器(映射地址爲0x40100000),實際上是執行UART輸入/輸出操作。

加上MMU/CACHE和內存模擬,SkyEye就可以很好地模擬基於XScale體系結構的開發板,而且ARM Linux針對真實基於XScale體系結構的lubbock開發板的內核和文件系統可以很好地在SkyEye上運行。



參考資料



關於作者

陳渝, 清華大學,通過 [email protected] 可以和他聯繫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章