在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>Zynq上使用Vitis的雙ARM Hello World

Zynq上使用Vitis的雙ARM Hello World

2022-12-14 | zip | 16.93 MB | 次下載 | 免費

資料介紹

描述

Xilinx 的 Zynq-7000 系列 FPGA 芯片組是 FPGA 市場上最受歡迎的片上系統 (SoC) 選項之一。由于 Xilinx 的集成開發環境 (IDE) Vivado,這是我在 FPGA 領域工作的個人偏好之一(盡管有時這是一種愛恨交織的關系)。Xilinx 的任何 SoC 芯片組(Zynq-7000 或 UltraScale+)的主要特性之一是嵌入到 FPGA 的可編程邏輯中的多個物理處理器Zynq-7000 系列 FPGA 專門配備了雙核 ARM Cortex-A9 處理器。Zynq 處理器的內核能夠共享芯片上的資源,例如片上存儲器 (OCM)、DDRUART、通過中斷控制分配器 (ICD) 的中斷和全局定時器等等。

雖然我已經很快適應了 Xilinx 的新 SDK 工具/平臺 Vitis,但我注意到目前還沒有大量關于如何在其 SoC FPGA 上同時運行多個處理器的文檔。幸運的是,經過幾天的探索,我發現這是一個相當簡單的過程。

在過去的項目中,我已經介紹了如何在 Vitis 中為僅在 ARM 核心 0 上運行的 Zynq 上的裸機應用程序創建一個新項目,因此我將直接介紹如何為第二個 ARM 核心創建裸機應用程序( ARM 內核 1) 以及如何為其創建單個引導映像。我在這個項目中使用了 Zynqberry,但這個項目中的任何步驟都不一定特定于Zynqberry ,并且適用于任何 Zynq-7000 系列開發板。

pYYBAGOYRsCAFodRAARe1E2CsUM328.png
Zynqberry FPGA 開發板。
?

在 Vitis 中,就像在其前身 XSDK 中一樣,軟件設計基于硬件平臺。這就是為什么必須在創建應用程序項目之前在 Vitis 中創建平臺項目的原因。該平臺將硬件設計從從 Vivado 導出的 XSA 文件導入 Vitis,然后有助于創建板級支持包 (BSP)、第一階段引導加載程序 (FSBL) 等引導組件,最終是裸機應用程序或操作系統

每個 BSP 只能支持一個裸機應用程序或操作系統。BSP 與裸機應用程序/OS 的這種層次關系在 Vitis 中稱為域。因此,由于 ARM 內核 0 的域已經存在于它的 Hello World 裸機應用程序中,因此需要為第二個 ARM 內核 (ARM 1) 創建一個新域。

要創建新域,請打開 platform.xpr,然后在打開的窗口中右鍵單擊帶有綠色符號的平臺項目名稱(不在資源管理器菜單中 - 將出現的唯一選項是“添加領域'):

poYBAGOYRsOAF7GCAAJ4CaaYIbM002.png
右鍵單擊平臺項目名稱以添加新域。
?

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

pYYBAGOYRsmASEv-AAIgalRd8ic933.png
新域的目標 ARM 內核 1。
?

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

pYYBAGOYRtGAUzBHAAMYq24Bxz0973.png
創建新域后 Vitis 中的整體項目視圖。
?

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

poYBAGOYRtiAG5WnAAKM-MsYg6M931.png
創建新應用程序以在 ARM 內核 1 上運行。
?

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

pYYBAGOYRtqACd-RAABI4Auy3-Q405.png
如果您不選擇從 Vivado 導出的自定義 XSA,應用程序將看不到硬件。
?

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

poYBAGOYRuCAS3lUAAIL4sN5wRE210.png
選擇 ARM 內核 1 域。
?

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

poYBAGOYRuaAd5SHAABPjz4daKE301.png
選擇申請模板
?

在 Zynq 芯片中運行兩個雙核時很容易錯過的關鍵步驟之一是鏈接描述文件中的 DDR 內存地址不會被修改以將每個應用程序保留在它們自己的內存部分中。

默認情況下,在創建應用程序時,鏈接器腳本會為應用程序分配相同的基地址,并且其大小由硬件平臺表示,板卡上有多少 DDR 可用。如果保持不變,ARM0 和 ARM1 的應用程序都將嘗試從 DDR 中的空間地址空間進行操作。這當然不好。

要修改尋址的 DDR,將一個部分分配給 ARM0,另一個分配給 ARM1,請打開每個應用程序的鏈接描述文件(位于 Explorer > application > src > lscript.ld)并更改頂部 ps7_ddr_0 的值。

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

為簡單起見,我決定將 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
poYBAGOYRvGACeZxAAFKaBsrtw0443.png
?

現在所有硬件和 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 文件的位置。將類型保留為數據文件,然后單擊“確定”。

在“創建引導映像”窗口中,單擊“創建映像”。將彈出一個警告,指出以前的版本即將被覆蓋。還行吧。

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

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

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

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

pYYBAGOYRv-AHM-CAAATx_164kw559.png
?

希望這個項目能夠幫助您為充分利用您的 Zynq 設計提供一個起點!


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

評論

查看更多

下載排行

本周

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

本月

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

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 成人黄色三级| 中文字幕第8页| 天天更新影院| 黄 色 片 在 线 看| 人人做人人爽人人爱| 日本在线不卡一区二区| 日本特级黄色大片| 午夜久久久久久网站| 一区二区三区高清视频在线观看| 色综合久久九月婷婷色综合| 狠狠色96视频| 亚洲天堂h| 狠狠色丁香婷婷第六色孕妇| 欧美hhh| 午夜色a大片在线观看免费| 一区二区福利| 日本成人一级片| 天天爱天天干天天操| 国产成人午夜精品影院游乐网| 一级特黄aa大片一又好看| 狠狠操综合| seetube18日本第一次| 天堂网成人| 午夜看片网站| 免费色黄网站| 国产在线一区二区三区四区| www.天天干.com| 色97色| 人人精品| 香港日本三级在线播放| 69成人免费视频| 97夜夜操| 日韩免费无砖专区2020狼| 成年人黄色片视频| 69日本人xxxx16-18| 男人边吃奶边爱边做视频日韩| 就操| 视频在线你懂的| 手机看片自拍自自拍日韩免费| 一区二区三区影院| 一级网站在线观看|