SkyEye硬件模擬平臺,第三部分: 硬件仿真實現之二CPU/開發板仿真 |
| |||||||||||
未顯示需要 JavaScript 的文檔選項 |
級別: 初級
陳渝 ([email protected])清華大學
2004 年 10 月 01 日
本系列文章的第三部分主要介紹了SkyEye硬件模擬平臺的實現細節。主要內容包括SkyEye的總體設計、SkyEye的可擴展框架、SkyEye的關鍵數據結構、SkyEye對各種CPU的模擬實現、SkyEye對各種外設的模擬實現、如何安裝使用SkyEye以及如何擴展SkyEye的仿真模塊等。對SkyEye的深入瞭解,有助於對嵌入式硬件系統有更深入的認識,特別是對操作系統、驅動程序如何與嵌入式硬件系統進行交互有更深刻的瞭解。
|
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核心的模擬工作基本就算完成了。
|
三級流水線的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中的後大半部分實現。
|
異常是指在程序運行時發生的異步意外事件,如外設產生中斷,硬件故障等,在邏輯上它發生在指令執行中。對應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函數後半部分實現的源碼,這是整個函數的主體。
|
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等內核執行的協處理器指令,保證內核能夠正常運行。
|
由於大部分基於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和開發板的模擬進行介紹。
|
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上運行。
|
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上運行。
|
目前基於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上運行。
|
支持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上運行。
- 本文節自 《源碼開放的嵌入式系統軟件分析與實踐——基於SkyEye和ARM開發平臺》一書的第三章,對 SkyEye 開源項目感興趣的可以閱讀本書。
- SkyEye硬件模擬平臺, 第一部分: SkyEye 介紹
- SkyEye硬件模擬平臺,第二部分: 安裝與使用
- SkyEye硬件模擬平臺,第三部分: 硬件仿真實現之一
- 在 developerWorks Linux 專區 可以找到更多爲 Linux 開發者準備的參考資料。
陳渝, 清華大學,通過 [email protected] 可以和他聯繫。 |