1 處理器間的通信
為AMP 設計創建應用之前,您需要考慮應用如何進行通信(如有需要)。最簡單的方法是使用片上存儲器。Zynq SoC 配備256KB 的片上SRAM,可從以下四個源地址進行訪問:
• 利用偵測控制單元(SCU)從任意內核進行訪問;
• 利用SCU 通過AXI 加速器一致性端口(ACP)從可編程邏輯進行訪問;
• 利用片上存儲器(OCM)互聯通過高性能AXI 端口從可編程邏輯進行訪問;
• 也是利用OCM 從中央互聯進行訪問。
由於這些不同的訪問源都能對片上存儲器進行讀寫,因此尤為重要的一點是,在使用OCM 之前一定要首先詳細了解其的運行方式。
既然OCM 有多個訪問源,那么顯然應該定義一個仲裁和優先級形式。由於偵測控制單元需要最低時延(SCU 既可以是處理器內核也可以是AXI ACP 接口),因此SCU 從這些訪問源的讀操作就具有最高優先級,緊接着是SCU 寫操作,然后是OCM 互聯讀/ 寫操作。用戶可通過將片上存儲器控制寄存器中的SCU 寫操作的優先級設置為低來顛倒SCU 寫操作和OCM 互聯訪問的優先級。
OCM 本身結構為128 位字,分成四個64KB 分區,並位於PS 地址空間的不同位置。初始配置下,前三個64KB 區塊布置在地址空間的起始位置,最后一個64KB 區塊置於地址空間的末尾。
1.1 簡單的片上存儲器實例
您可使用賽靈思I/O 函數訪問OCM, 以便從所選的存儲器地址讀取和寫入數據。這些函數包含在Xil_IO.h 中, 可支持在CPU 地址空間內存儲和訪問8 位、16 位或32 位字符型、短整型或整型數據。使用這些函數時,只需知道您希望訪問的地址以及想要在此存儲的值即可。如果是寫操作,方法如下:
Xil_Out8(0xFFFF0000,0x55);
read_char = Xil_In8(0xFFFF0000);
使用該技術時要確保兩個地址指向片上存儲器中的相同位置,尤其是當不同人編寫不同內核程序時更應如此,為此更好的方法是使用共同的頭文件。該文件將包含針對特定傳輸的相關操作地址的宏定義,例如:
#define LED_PAT 0xFFFF0000
另一種備選方法是讓兩個程序都使用指示器來訪問存儲單元。您可以通過使用宏命令定義指向恆定地址的指示器(一般用C 語言)來實現這一點:
#define LED_OP (*(volatile unsigned int *)(0xFFFF0000))
此外,您還可以對地址再次進行宏定義,以確保該地址為兩個應用程序的共用地址。這種方法無需使用賽靈思I/O 庫,而是通過指示器實現簡單訪問。
2、雙核運行和啟動完整工程創建過程記錄
我們利用wiki提供的文件創建硬件工程和軟件工程,並創建基於QSPI Flash的固化文件mcs文件。
2.1 創建硬件工程
下載文件earlyaccess_xapp1079_2014.2.zip。網址如下:
http://www.wiki.xilinx.com/XAPP1079+Latest+Information
然后解壓earlyaccess_xapp1079_2014.2.zip,把design文件夾下的src文件夾拷貝到C:\Users\Administrator\AppData\Roaming\Xilinx文件夾下面,然后打開軟件Vivado 2014.2,然后點擊ToolsàRun Tcl Script,打開路徑C:\Users\Administrator\AppData\Roaming\Xilinx選擇create_proj_ zedBoard.tcl,然后點擊OK。就會自動運行創建Project_1的硬件工程,生成bit文件,打開implement,Export Hardware,launch SDK。硬件工程模塊圖如下圖1所示:
圖1
工程放在C盤復雜目錄下尋找起來不方便,我們把他拷貝到目錄E:\Zed7020_lab\2014.2\zed_amp_bare_metal_cortex_a9文件夾下面,然后打開vivadio,打開SDK。
2.2 創建軟件工程
在SDK軟件中選擇Xilinx_Tools->Repositories,選擇New,瀏覽文件夾選擇路徑E:\Zed7020_lab\2014.2\zed_amp_bare_metal_cortex_a9\src\sdk_repo,然后點擊OK。如下圖2所示:
圖2
創建FSBL工程,選擇File->New->Application_Project,工程命名為fsbl,然后點擊Next,選擇模板‘Zynq FSBL’,然后點擊Finish。
重新啟動CPU1依靠FSBL BSP文件修改的向量表。所以需要驗證FSBL BSP使用的standalone來自local repository。
選擇fsbl_bsp,然后右鍵選擇'Board Support Package Settings',觀察界面,驗證OS Version是4.91,然后點擊Cancle。如下圖3所示:
圖3
創建應用工程運行在CPU0,選擇File->New->Application_Project,工程命名為'app_cpu0',然后選擇next。選擇模板'Empty Application'然后點擊Finish。然后下解壓包的路徑…\earlyaccess_xapp1079_2014.2\design\src\apps\app_cpu0下拷貝文件app_cpu0.c和lscript.ld粘貼到SDK工程app_cpu0->src下面。如圖4所示:
圖4
創建板級支持包為CPU1,選擇File->New->Board_Support_Package,然后將工程命名為app_cpu1_bsp,改變處理器為’ ps7_cortexa9_1’。然后點擊Finish。在 'Board Support Package Settings' 里選擇Overview->drivers->ps7_cortexa9_1 和改變the extra_compiler_flags 值 為 '-g -DUSE_AMP=1',然后點擊OK。如下圖5所示:
圖5
創建應用程序運行在CPU1上,選擇File->New->Application_Project,然后工程命名為'app_cpu1',改變處理器為‘ps7_cortexa9_1’,選擇板級支持包,使用已存在的板級支持包'app_cpu1_bsp',然后點擊Next,選擇模板'Empty Application',然后點擊Finish。如下圖6所示:
圖6
然后下解壓包的路徑…\earlyaccess_xapp1079_2014.2\design\src\apps\ app_cpu1下拷貝文件app_cpu1.c和lscript.ld粘貼到SDK工程app_cpu1->src下面。
2 生成mcs文件和燒寫mcs文件到QSPI Flash
下面將生成燒寫到QSPI里面的mcs文件和燒寫的步驟。
2.1 生成mcs文件
單擊‘app_cpu1’,選擇Xilinx Tools –> Create zynq boot image,選擇Add,選擇文件…/app_cp0/Debug/ app_cpu0.elf,點擊打開。然后選擇app_cpu0.elf,點擊UP。把文件app_cpu0.elf移動到app_cpu1.elf上面。然后在Output pach后面把boot.bin修改為Boot.mcs。然后點擊 Create Image。如下圖7所示:
圖7
2.2 燒寫Boot.mcs到QSPI Flash
選擇Xilinx Tools –> Program Flash,在Image File后面選擇剛才生成的Boot.mcs文件,Offset為0x0,Flash Type為qsip_single。勾選Blank check after erase和Verify after flash。檢查開發板上電和連線狀況,然后點擊Program。如下圖8所示:
圖8