資料介紹
描述
Xilinx 的 Zynq-7000 系列 FPGA 芯片組是 FPGA 市場上最受歡迎的片上系統 (SoC) 選項之一。由于 Xilinx 的集成開發環境 (IDE) Vivado,這是我在 FPGA 領域工作的個人偏好之一(盡管有時這是一種愛恨交織的關系)。Xilinx 的任何 SoC 芯片組(Zynq-7000 或 UltraScale+)的主要特性之一是嵌入到 FPGA 的可編程邏輯中的多個物理處理器。Zynq-7000 系列 FPGA 專門配備了雙核 ARM Cortex-A9 處理器。Zynq 處理器的內核能夠共享芯片上的資源,例如片上存儲器 (OCM)、DDR、UART、通過中斷控制分配器 (ICD) 的中斷和全局定時器等等。
雖然我已經很快適應了 Xilinx 的新 SDK 工具/平臺 Vitis,但我注意到目前還沒有大量關于如何在其 SoC FPGA 上同時運行多個處理器的文檔。幸運的是,經過幾天的探索,我發現這是一個相當簡單的過程。
在過去的項目中,我已經介紹了如何在 Vitis 中為僅在 ARM 核心 0 上運行的 Zynq 上的裸機應用程序創建一個新項目,因此我將直接介紹如何為第二個 ARM 核心創建裸機應用程序( ARM 內核 1) 以及如何為其創建單個引導映像。我在這個項目中使用了 Zynqberry,但這個項目中的任何步驟都不一定特定于Zynqberry ,并且適用于任何 Zynq-7000 系列開發板。

在 Vitis 中,就像在其前身 XSDK 中一樣,軟件設計基于硬件平臺。這就是為什么必須在創建應用程序項目之前在 Vitis 中創建平臺項目的原因。該平臺將硬件設計從從 Vivado 導出的 XSA 文件導入 Vitis,然后有助于創建板級支持包 (BSP)、第一階段引導加載程序 (FSBL) 等引導組件,最終是裸機應用程序或操作系統。
每個 BSP 只能支持一個裸機應用程序或操作系統。BSP 與裸機應用程序/OS 的這種層次關系在 Vitis 中稱為域。因此,由于 ARM 內核 0 的域已經存在于它的 Hello World 裸機應用程序中,因此需要為第二個 ARM 內核 (ARM 1) 創建一個新域。
要創建新域,請打開 platform.xpr,然后在打開的窗口中右鍵單擊帶有綠色符號的平臺項目名稱(不在資源管理器菜單中 - 將出現的唯一選項是“添加領域'):

為新域指定一個所需的名稱,然后為操作系統選擇獨立選項,因為我們將創建一個裸機應用程序。最后,選擇第二個 ARM 內核(ps7_cortexa9_1)作為處理器。

這為創建新應用程序項目時選擇 ARM 內核 1 作為目標處理器提供了掛鉤。

要創建一個在第二個 ARM 內核上運行的新應用程序,請選擇 File > New... > Application Project 并為新應用程序指定您想要的名稱,然后單擊“Next”。

請務必選擇從 Vivado 導出的自定義硬件平臺(.XSA 文件):

選擇為第二個 ARM 內核創建的第二個域。如果您不小心選擇了 ARM 內核 0 的域,“下一步”按鈕將灰顯,并彈出一條警告消息,指出該域已存在應用程序。

現在,我將 Hello World 應用程序模板用于第二個 ARM 內核 (ARM1)。

在 Zynq 芯片中運行兩個雙核時很容易錯過的關鍵步驟之一是鏈接描述文件中的 DDR 內存地址不會被修改以將每個應用程序保留在它們自己的內存部分中。
默認情況下,在創建應用程序時,鏈接器腳本會為應用程序分配相同的基地址,并且其大小由硬件平臺表示,板卡上有多少 DDR 可用。如果保持不變,ARM0 和 ARM1 的應用程序都將嘗試從 DDR 中的空間地址空間進行操作。這當然不好。
要修改尋址的 DDR,將一個部分分配給 ARM0,另一個分配給 ARM1,請打開每個應用程序的鏈接描述文件(位于 Explorer > application > src > lscript.ld)并更改頂部 ps7_ddr_0 的值。

為簡單起見,我決定將 Zynqberry DDR 的下半部分分配給 ARM0,將上半部分分配給 ARM1(不過請注意,因為這些是裸機應用程序,除了向 UART 打印一條線外幾乎什么都不做,它們絕對不需要這么多 DDR 附近的任何地方來操作)。
為了實現這一點,我將 ARM0 的基地址保留為其默認值 (0x100000),但將大小減半為 0xFF800000。我將 ARM1 的基地址設置為 ARM0 的基地址加上 0xFF800000(0x10080000),它的大小也設置為 0xFF800000。
盡管兩個 ARM 內核具有相同的處理能力,但仍有一些操作符,例如啟動過程,需要其中一個內核作為主內核,另一個內核作為從內核。在 Zynq 中,ARM0 是主機,因此只有它可以訪問某些操作和外圍設備。ARM0 還將負責在適當的時間點啟動從屬 ARM1。
為了讓 ARM1 上的應用程序知道它在從屬處理器上運行并提供適當的掛鉤,必須在其 BSP 中設置非對稱多處理 (AMP) 編譯器標志。
為此,再次打開 platform.xpr 窗口,選擇 Modify BSP settings... 并導航到 ps7_cortexa9_1 > extra_compiler_flags,然后將以下內容添加到已經存在的參數的末尾:
-DUSE_AMP=1

現在所有硬件和 BSP 設置都已配置,可以編寫實際的應用程序代碼。正如我之前提到的,ARM0 負責啟動 ARM1。ARM0 必須遵循兩個主要步驟才能成功啟動 ARM1(如 UG585 中的第 6.1.10 節所述):
- 將 ARM 內核 1 的 Zynq 的 DDR(PS7 DDR)中的內存空間基地址寫入 0xFFFFFFF0(本項目中為 0x10080000)。
- 執行 SEV 指令(向多處理器系統中的所有內核發出警報)以喚醒 ARM 內核 1 并使其跳轉到其應用程序中。
同時運行多個處理器時禁用 OCM 中的緩存也很重要,因為它不是處理器之間的可共享資源。
為安全起見,在將 ARM1 的基地址寫入 0xFFFFFFF0 后立即執行 ARM 數據內存屏障指令是一種很好的做法,因為在寫入指令完成并且內存空間顯示為已更新之前,它不允許處理器繼續運行。
最后,可以執行 SEV 指令,該指令就像系統中的信標警報一樣,告訴所有在場的處理器喚醒并跳轉到它們的應用程序。
另一個快速功能:我希望 UART 控制臺以交替模式顯示來自 ARM0 和 ARM1 的“Hello World”打印輸出。因此,我沒有嘗試硬核睡眠時間來實現這一點,而是使用了一個變量,我將其類型轉換到 0xFFFF0000 的共享內存空間中,作為每個 ARM 可以輪詢的值,以了解另一個何時完成其打印語句。
ARM0 代碼:
#include
#include
#include "xil_io.h"
#include "xil_mmu.h"
#include "platform.h"
#include "xil_printf.h"
#include "xpseudo_asm.h"
#include "xil_exception.h"
#define sev() __asm__("sev")
#define ARM1_STARTADR 0xFFFFFFF0
#define ARM1_BASEADDR 0x10080000
#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))
int main()
{
init_platform();
COMM_VAL = 0;
//Disable cache on OCM
// S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
print("ARM0: writing startaddress for ARM1\n\r");
Xil_Out32(ARM1_STARTADR, ARM1_BASEADDR);
dmb(); //waits until write has finished
print("ARM0: sending the SEV to wake up ARM1\n\r");
sev();
while(1){
print("Hello World - ARM0\n\r");
sleep(1);
COMM_VAL = 1;
while(COMM_VAL == 1){
}
}
cleanup_platform();
return 0;
}
ARM1代碼:
#include
#include
#include "xil_io.h"
#include "xil_mmu.h"
#include "platform.h"
#include "xil_cache.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xpseudo_asm.h"
#include "xil_exception.h"
#define COMM_VAL (*(volatile unsigned long *)(0xFFFF0000))
extern u32 MMUTable;
int main()
{
init_platform();
print("CPU1: init_platform\n\r");
//Disable cache on OCM
// S=b1 TEX=b100 AP=b11, Domain=b1111, C=b0, B=b0
Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
while(1){
while(COMM_VAL == 0){
};
print("Hello World - ARM1\n\r");
sleep(1);
COMM_VAL = 0;
}
cleanup_platform();
return 0;
}
函數 init_platform() 需要保留在兩個應用程序中,它負責為每個應用程序初始化 UART 控制臺。
構建包含 ARM0 和 ARM1 應用程序的項目系統,然后從 Xilinx 菜單選項中選擇“Create Boot Image”。
默認情況下,引導映像寫入器將具有 ARM0 的比特流、FSBL 和 ELF 文件的路徑。要為 ARM1 添加 ELF 文件,請單擊“編輯”并瀏覽到 ARM1 的 ELF 文件的位置。將類型保留為數據文件,然后單擊“確定”。
在“創建引導映像”窗口中,單擊“創建映像”。將彈出一個警告,指出以前的版本即將被覆蓋。還行吧。

最后,我將 Zynqberry 插入我的計算機并選擇 Xilinx 菜單選項下的“Program Flash”選項。Vitis 填寫了 FSBL 的位置,并為我填寫了啟動映像。

正如我的意圖,兩個內核輪詢共享內存值以交替它們的串行輸出:

希望這個項目能夠幫助您為充分利用您的 Zynq 設計提供一個起點!
- 在Windows IoT(WinIoT)和GrovePi上運行Hello World
- 使用Swift語言在16x2 LCD上顯示Hello World
- ZYNQ學習筆記_ZYNQ簡介和Hello World
- STM32開發入門(二)——Hello World
- HELLO WORLD!
- 基于Nios 的 hello world
- 從單片機開發轉向Linux開發系列博客二:運行Hello World
- ZYNQ嵌入式系統-Hello World 實驗
- ZYNQ OpenAMP雙核ARM通信案例開發手冊 32次下載
- Vitis使用教程
- 【ZYNQ Ultrascale+ MPSOC FPGA教程】第十八章Hello World(上)
- 讓Qt Creator顯示Hello World字符串的課件免費下載 11次下載
- Qt圖形編程基礎之使用Qt編寫“Hello,World”程序實驗 1次下載
- Hello_World.Constraint 0次下載
- NB3000_Hello_World 0次下載
- 使用MCUXpresso for VS Code插件開發Zephyr的hello world 562次閱讀
- 在Windows 10上創建并運行AMD Vitis?視覺庫示例 825次閱讀
- 如何在Zynq SoC上開始使用FreeRTOS 2309次閱讀
- 如何獲取和使用Github上的Vitis開放資源 1129次閱讀
- Vitis 庫流程:視覺 L1 重映射函數 Zynq baremetal 設計實例 602次閱讀
- ZYNQ雙核ARM分別運行不同的操作系統(基于OpenAMP) 4867次閱讀
- 在Vitis中調試ARM可信固件和U-boot 3722次閱讀
- 如何編寫第一個hello world程序 8448次閱讀
- 探索鴻蒙OS應用開發的hello world代碼 2007次閱讀
- 米爾科技HELLO WORLD主板介紹 2532次閱讀
- 米爾科技Linux簡單Hello World應用程序的教程 1415次閱讀
- Xilinx基于ARM的Zynq-7000和Zynq UltraScale+ MPSoC及RFSoC器件是否存在安全漏洞 2686次閱讀
- 在Zynq SoC上實現雙核非對稱的多進程處理模式 2412次閱讀
- 將Zynq SoC上的兩個ARM Cortex 2428次閱讀
- 談談Zynq SoC里ARM NEON SIMD架構擴展集的使用 2759次閱讀
下載排行
本周
- 1DD3118電路圖紙資料
- 0.08 MB | 1次下載 | 免費
- 2AD庫封裝庫安裝教程
- 0.49 MB | 1次下載 | 免費
- 3PC6206 300mA低功耗低壓差線性穩壓器中文資料
- 1.12 MB | 1次下載 | 免費
- 4網絡安全從業者入門指南
- 2.91 MB | 1次下載 | 免費
- 5DS-CS3A P00-CN-V3
- 618.05 KB | 1次下載 | 免費
- 6海川SM5701規格書
- 1.48 MB | 次下載 | 免費
- 7H20PR5電磁爐IGBT功率管規格書
- 1.68 MB | 次下載 | 1 積分
- 8IP防護等級說明
- 0.08 MB | 次下載 | 免費
本月
- 1貼片三極管上的印字與真實名稱的對照表詳細說明
- 0.50 MB | 103次下載 | 1 積分
- 2涂鴉各WiFi模塊原理圖加PCB封裝
- 11.75 MB | 89次下載 | 1 積分
- 3錦銳科技CA51F2 SDK開發包
- 24.06 MB | 43次下載 | 1 積分
- 4錦銳CA51F005 SDK開發包
- 19.47 MB | 19次下載 | 1 積分
- 5PCB的EMC設計指南
- 2.47 MB | 16次下載 | 1 積分
- 6HC05藍牙原理圖加PCB
- 15.76 MB | 13次下載 | 1 積分
- 7802.11_Wireless_Networks
- 4.17 MB | 12次下載 | 免費
- 8蘋果iphone 11電路原理圖
- 4.98 MB | 6次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191390次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183342次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81588次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65989次下載 | 10 積分
評論