資料介紹
描述
Xilinx 的 Zynq-7000 系列 FPGA 芯片組是 FPGA 市場(chǎng)上最受歡迎的片上系統(tǒng) (SoC) 選項(xiàng)之一。由于 Xilinx 的集成開發(fā)環(huán)境 (IDE) Vivado,這是我在 FPGA 領(lǐng)域工作的個(gè)人偏好之一(盡管有時(shí)這是一種愛恨交織的關(guān)系)。Xilinx 的任何 SoC 芯片組(Zynq-7000 或 UltraScale+)的主要特性之一是嵌入到 FPGA 的可編程邏輯中的多個(gè)物理處理器。Zynq-7000 系列 FPGA 專門配備了雙核 ARM Cortex-A9 處理器。Zynq 處理器的內(nèi)核能夠共享芯片上的資源,例如片上存儲(chǔ)器 (OCM)、DDR、UART、通過中斷控制分配器 (ICD) 的中斷和全局定時(shí)器等等。
雖然我已經(jīng)很快適應(yīng)了 Xilinx 的新 SDK 工具/平臺(tái) Vitis,但我注意到目前還沒有大量關(guān)于如何在其 SoC FPGA 上同時(shí)運(yùn)行多個(gè)處理器的文檔。幸運(yùn)的是,經(jīng)過幾天的探索,我發(fā)現(xiàn)這是一個(gè)相當(dāng)簡(jiǎn)單的過程。
在過去的項(xiàng)目中,我已經(jīng)介紹了如何在 Vitis 中為僅在 ARM 核心 0 上運(yùn)行的 Zynq 上的裸機(jī)應(yīng)用程序創(chuàng)建一個(gè)新項(xiàng)目,因此我將直接介紹如何為第二個(gè) ARM 核心創(chuàng)建裸機(jī)應(yīng)用程序( ARM 內(nèi)核 1) 以及如何為其創(chuàng)建單個(gè)引導(dǎo)映像。我在這個(gè)項(xiàng)目中使用了 Zynqberry,但這個(gè)項(xiàng)目中的任何步驟都不一定特定于Zynqberry ,并且適用于任何 Zynq-7000 系列開發(fā)板。
在 Vitis 中,就像在其前身 XSDK 中一樣,軟件設(shè)計(jì)基于硬件平臺(tái)。這就是為什么必須在創(chuàng)建應(yīng)用程序項(xiàng)目之前在 Vitis 中創(chuàng)建平臺(tái)項(xiàng)目的原因。該平臺(tái)將硬件設(shè)計(jì)從從 Vivado 導(dǎo)出的 XSA 文件導(dǎo)入 Vitis,然后有助于創(chuàng)建板級(jí)支持包 (BSP)、第一階段引導(dǎo)加載程序 (FSBL) 等引導(dǎo)組件,最終是裸機(jī)應(yīng)用程序或操作系統(tǒng)。
每個(gè) BSP 只能支持一個(gè)裸機(jī)應(yīng)用程序或操作系統(tǒng)。BSP 與裸機(jī)應(yīng)用程序/OS 的這種層次關(guān)系在 Vitis 中稱為域。因此,由于 ARM 內(nèi)核 0 的域已經(jīng)存在于它的 Hello World 裸機(jī)應(yīng)用程序中,因此需要為第二個(gè) ARM 內(nèi)核 (ARM 1) 創(chuàng)建一個(gè)新域。
要?jiǎng)?chuàng)建新域,請(qǐng)打開 platform.xpr,然后在打開的窗口中右鍵單擊帶有綠色符號(hào)的平臺(tái)項(xiàng)目名稱(不在資源管理器菜單中 - 將出現(xiàn)的唯一選項(xiàng)是“添加領(lǐng)域'):
為新域指定一個(gè)所需的名稱,然后為操作系統(tǒng)選擇獨(dú)立選項(xiàng),因?yàn)槲覀儗?chuàng)建一個(gè)裸機(jī)應(yīng)用程序。最后,選擇第二個(gè) ARM 內(nèi)核(ps7_cortexa9_1)作為處理器。
這為創(chuàng)建新應(yīng)用程序項(xiàng)目時(shí)選擇 ARM 內(nèi)核 1 作為目標(biāo)處理器提供了掛鉤。
要?jiǎng)?chuàng)建一個(gè)在第二個(gè) ARM 內(nèi)核上運(yùn)行的新應(yīng)用程序,請(qǐng)選擇 File > New... > Application Project 并為新應(yīng)用程序指定您想要的名稱,然后單擊“Next”。
請(qǐng)務(wù)必選擇從 Vivado 導(dǎo)出的自定義硬件平臺(tái)(.XSA 文件):
選擇為第二個(gè) ARM 內(nèi)核創(chuàng)建的第二個(gè)域。如果您不小心選擇了 ARM 內(nèi)核 0 的域,“下一步”按鈕將灰顯,并彈出一條警告消息,指出該域已存在應(yīng)用程序。
現(xiàn)在,我將 Hello World 應(yīng)用程序模板用于第二個(gè) ARM 內(nèi)核 (ARM1)。
在 Zynq 芯片中運(yùn)行兩個(gè)雙核時(shí)很容易錯(cuò)過的關(guān)鍵步驟之一是鏈接描述文件中的 DDR 內(nèi)存地址不會(huì)被修改以將每個(gè)應(yīng)用程序保留在它們自己的內(nèi)存部分中。
默認(rèn)情況下,在創(chuàng)建應(yīng)用程序時(shí),鏈接器腳本會(huì)為應(yīng)用程序分配相同的基地址,并且其大小由硬件平臺(tái)表示,板卡上有多少 DDR 可用。如果保持不變,ARM0 和 ARM1 的應(yīng)用程序都將嘗試從 DDR 中的空間地址空間進(jìn)行操作。這當(dāng)然不好。
要修改尋址的 DDR,將一個(gè)部分分配給 ARM0,另一個(gè)分配給 ARM1,請(qǐng)打開每個(gè)應(yīng)用程序的鏈接描述文件(位于 Explorer > application > src > lscript.ld)并更改頂部 ps7_ddr_0 的值。
為簡(jiǎn)單起見,我決定將 Zynqberry DDR 的下半部分分配給 ARM0,將上半部分分配給 ARM1(不過請(qǐng)注意,因?yàn)檫@些是裸機(jī)應(yīng)用程序,除了向 UART 打印一條線外幾乎什么都不做,它們絕對(duì)不需要這么多 DDR 附近的任何地方來操作)。
為了實(shí)現(xiàn)這一點(diǎn),我將 ARM0 的基地址保留為其默認(rèn)值 (0x100000),但將大小減半為 0xFF800000。我將 ARM1 的基地址設(shè)置為 ARM0 的基地址加上 0xFF800000(0x10080000),它的大小也設(shè)置為 0xFF800000。
盡管兩個(gè) ARM 內(nèi)核具有相同的處理能力,但仍有一些操作符,例如啟動(dòng)過程,需要其中一個(gè)內(nèi)核作為主內(nèi)核,另一個(gè)內(nèi)核作為從內(nèi)核。在 Zynq 中,ARM0 是主機(jī),因此只有它可以訪問某些操作和外圍設(shè)備。ARM0 還將負(fù)責(zé)在適當(dāng)?shù)臅r(shí)間點(diǎn)啟動(dòng)從屬 ARM1。
為了讓 ARM1 上的應(yīng)用程序知道它在從屬處理器上運(yùn)行并提供適當(dāng)?shù)膾煦^,必須在其 BSP 中設(shè)置非對(duì)稱多處理 (AMP) 編譯器標(biāo)志。
為此,再次打開 platform.xpr 窗口,選擇 Modify BSP settings... 并導(dǎo)航到 ps7_cortexa9_1 > extra_compiler_flags,然后將以下內(nèi)容添加到已經(jīng)存在的參數(shù)的末尾:
-DUSE_AMP=1
現(xiàn)在所有硬件和 BSP 設(shè)置都已配置,可以編寫實(shí)際的應(yīng)用程序代碼。正如我之前提到的,ARM0 負(fù)責(zé)啟動(dòng) ARM1。ARM0 必須遵循兩個(gè)主要步驟才能成功啟動(dòng) ARM1(如 UG585 中的第 6.1.10 節(jié)所述):
- 將 ARM 內(nèi)核 1 的 Zynq 的 DDR(PS7 DDR)中的內(nèi)存空間基地址寫入 0xFFFFFFF0(本項(xiàng)目中為 0x10080000)。
- 執(zhí)行 SEV 指令(向多處理器系統(tǒng)中的所有內(nèi)核發(fā)出警報(bào))以喚醒 ARM 內(nèi)核 1 并使其跳轉(zhuǎn)到其應(yīng)用程序中。
同時(shí)運(yùn)行多個(gè)處理器時(shí)禁用 OCM 中的緩存也很重要,因?yàn)樗皇翘幚砥髦g的可共享資源。
為安全起見,在將 ARM1 的基地址寫入 0xFFFFFFF0 后立即執(zhí)行 ARM 數(shù)據(jù)內(nèi)存屏障指令是一種很好的做法,因?yàn)樵趯懭胫噶钔瓿刹⑶覂?nèi)存空間顯示為已更新之前,它不允許處理器繼續(xù)運(yùn)行。
最后,可以執(zhí)行 SEV 指令,該指令就像系統(tǒng)中的信標(biāo)警報(bào)一樣,告訴所有在場(chǎng)的處理器喚醒并跳轉(zhuǎn)到它們的應(yīng)用程序。
另一個(gè)快速功能:我希望 UART 控制臺(tái)以交替模式顯示來自 ARM0 和 ARM1 的“Hello World”打印輸出。因此,我沒有嘗試硬核睡眠時(shí)間來實(shí)現(xiàn)這一點(diǎn),而是使用了一個(gè)變量,我將其類型轉(zhuǎn)換到 0xFFFF0000 的共享內(nèi)存空間中,作為每個(gè) ARM 可以輪詢的值,以了解另一個(gè)何時(shí)完成其打印語句。
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;
}
函數(shù) init_platform() 需要保留在兩個(gè)應(yīng)用程序中,它負(fù)責(zé)為每個(gè)應(yīng)用程序初始化 UART 控制臺(tái)。
構(gòu)建包含 ARM0 和 ARM1 應(yīng)用程序的項(xiàng)目系統(tǒng),然后從 Xilinx 菜單選項(xiàng)中選擇“Create Boot Image”。
默認(rèn)情況下,引導(dǎo)映像寫入器將具有 ARM0 的比特流、FSBL 和 ELF 文件的路徑。要為 ARM1 添加 ELF 文件,請(qǐng)單擊“編輯”并瀏覽到 ARM1 的 ELF 文件的位置。將類型保留為數(shù)據(jù)文件,然后單擊“確定”。
在“創(chuàng)建引導(dǎo)映像”窗口中,單擊“創(chuàng)建映像”。將彈出一個(gè)警告,指出以前的版本即將被覆蓋。還行吧。
最后,我將 Zynqberry 插入我的計(jì)算機(jī)并選擇 Xilinx 菜單選項(xiàng)下的“Program Flash”選項(xiàng)。Vitis 填寫了 FSBL 的位置,并為我填寫了啟動(dòng)映像。
正如我的意圖,兩個(gè)內(nèi)核輪詢共享內(nèi)存值以交替它們的串行輸出:
希望這個(gè)項(xiàng)目能夠幫助您為充分利用您的 Zynq 設(shè)計(jì)提供一個(gè)起點(diǎn)!
- 在Windows IoT(WinIoT)和GrovePi上運(yùn)行Hello World
- 使用Swift語言在16x2 LCD上顯示Hello World
- ZYNQ學(xué)習(xí)筆記_ZYNQ簡(jiǎn)介和Hello World
- STM32開發(fā)入門(二)——Hello World
- HELLO WORLD!
- 基于Nios 的 hello world
- 從單片機(jī)開發(fā)轉(zhuǎn)向Linux開發(fā)系列博客二:運(yùn)行Hello World
- ZYNQ嵌入式系統(tǒng)-Hello World 實(shí)驗(yàn)
- ZYNQ OpenAMP雙核ARM通信案例開發(fā)手冊(cè) 32次下載
- Vitis使用教程
- 【ZYNQ Ultrascale+ MPSOC FPGA教程】第十八章Hello World(上)
- 讓Qt Creator顯示Hello World字符串的課件免費(fèi)下載 11次下載
- Qt圖形編程基礎(chǔ)之使用Qt編寫“Hello,World”程序?qū)嶒?yàn) 1次下載
- Hello_World.Constraint 0次下載
- NB3000_Hello_World 0次下載
- 在Windows 10上創(chuàng)建并運(yùn)行AMD Vitis?視覺庫(kù)示例 434次閱讀
- 如何在Zynq SoC上開始使用FreeRTOS 1481次閱讀
- 如何獲取和使用Github上的Vitis開放資源 861次閱讀
- Vitis 庫(kù)流程:視覺 L1 重映射函數(shù) Zynq baremetal 設(shè)計(jì)實(shí)例 477次閱讀
- ZYNQ雙核ARM分別運(yùn)行不同的操作系統(tǒng)(基于OpenAMP) 4099次閱讀
- 在Vitis中調(diào)試ARM可信固件和U-boot 3260次閱讀
- Vitis HLS工具簡(jiǎn)介及設(shè)計(jì)流程 2206次閱讀
- 如何編寫第一個(gè)hello world程序 8142次閱讀
- 探索鴻蒙OS應(yīng)用開發(fā)的hello world代碼 1813次閱讀
- 米爾科技HELLO WORLD主板介紹 2325次閱讀
- 米爾科技Linux簡(jiǎn)單Hello World應(yīng)用程序的教程 1300次閱讀
- Xilinx基于ARM的Zynq-7000和Zynq UltraScale+ MPSoC及RFSoC器件是否存在安全漏洞 2620次閱讀
- 在Zynq SoC上實(shí)現(xiàn)雙核非對(duì)稱的多進(jìn)程處理模式 2212次閱讀
- 將Zynq SoC上的兩個(gè)ARM Cortex 2353次閱讀
- 談?wù)?b class="flag-6" style="color: red">Zynq SoC里ARM NEON SIMD架構(gòu)擴(kuò)展集的使用 2632次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多