電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>Zynq上使用Vitis的雙ARM Hello World

Zynq上使用Vitis的雙ARM Hello World

2022-12-14 | zip | 16.93 MB | 次下載 | 免費(fèi)

資料介紹

描述

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ā)板。

pYYBAGOYRsCAFodRAARe1E2CsUM328.png
Zynqberry FPGA 開發(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)域'):

poYBAGOYRsOAF7GCAAJ4CaaYIbM002.png
右鍵單擊平臺(tái)項(xiàng)目名稱以添加新域。
?

為新域指定一個(gè)所需的名稱,然后為操作系統(tǒng)選擇獨(dú)立選項(xiàng),因?yàn)槲覀儗?chuàng)建一個(gè)裸機(jī)應(yīng)用程序。最后,選擇第二個(gè) ARM 內(nèi)核(ps7_cortexa9_1)作為處理器。

pYYBAGOYRsmASEv-AAIgalRd8ic933.png
新域的目標(biāo) ARM 內(nèi)核 1。
?

這為創(chuàng)建新應(yīng)用程序項(xiàng)目時(shí)選擇 ARM 內(nèi)核 1 作為目標(biāo)處理器提供了掛鉤。

pYYBAGOYRtGAUzBHAAMYq24Bxz0973.png
創(chuàng)建新域后 Vitis 中的整體項(xiàng)目視圖。
?

要?jiǎng)?chuàng)建一個(gè)在第二個(gè) ARM 內(nèi)核上運(yùn)行的新應(yīng)用程序,請(qǐng)選擇 File > New... > Application Project 并為新應(yīng)用程序指定您想要的名稱,然后單擊“Next”。

poYBAGOYRtiAG5WnAAKM-MsYg6M931.png
創(chuàng)建新應(yīng)用程序以在 ARM 內(nèi)核 1 上運(yùn)行。
?

請(qǐng)務(wù)必選擇從 Vivado 導(dǎo)出的自定義硬件平臺(tái)(.XSA 文件):

pYYBAGOYRtqACd-RAABI4Auy3-Q405.png
如果您不選擇從 Vivado 導(dǎo)出的自定義 XSA,應(yīng)用程序?qū)⒖床坏接布?/font>
?

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

poYBAGOYRuCAS3lUAAIL4sN5wRE210.png
選擇 ARM 內(nèi)核 1 域。
?

現(xiàn)在,我將 Hello World 應(yīng)用程序模板用于第二個(gè) ARM 內(nèi)核 (ARM1)。

poYBAGOYRuaAd5SHAABPjz4daKE301.png
選擇申請(qǐng)模板
?

在 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 的值。

pYYBAGOYRu6AZ7k0AALDCgA-b4o938.png
修改了 ARM0 的 DDR 地址空間,這也必須對(duì) ARM1 的鏈接描述文件進(jìn)行。
?

為簡(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
poYBAGOYRvGACeZxAAFKaBsrtw0443.png
?

現(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è)警告,指出以前的版本即將被覆蓋。還行吧。

pYYBAGOYRvWAME7mAACjWScIvVg588.png
啟動(dòng)映像只需要添加 ARM1 的 ELF 文件即可。
?

最后,我將 Zynqberry 插入我的計(jì)算機(jī)并選擇 Xilinx 菜單選項(xiàng)下的“Program Flash”選項(xiàng)。Vitis 填寫了 FSBL 的位置,并為我填寫了啟動(dòng)映像。

poYBAGOYRvyACR4nAAL1xBiQCVw048.png
在成功將啟動(dòng)映像刷入 Zynqberry 后,我打開 Putty 以查看串行輸出。
?

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

pYYBAGOYRv-AHM-CAAATx_164kw559.png
?

希望這個(gè)項(xiàng)目能夠幫助您為充分利用您的 Zynq 設(shè)計(jì)提供一個(gè)起點(diǎn)!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)