如何使用 PetaLinux:從 XSA 到在 Zynq 上開發您的第一個 Linux 應用程式

最後更新: 27/10/2025
作者: 艾薩克
  • PetaLinux 提供了一個核心、裝置樹和根檔案系統,可在 Zynq/ZynqMP 上進行自訂。
  • 實際工作流程結合了 Vivado (XSA)、PetaLinux (鏡像) 和 Vitis/SDK (應用程式)。
  • 設備樹反映了 Vivado 中定義的位址和中斷映射。
  • UIO/驅動程式方便對IP的存取;FPGA管理器簡化PL迭代。

PetaLinux Zynq 和 ZynqMP 指南

如果您在使用 PetaLinux 時遇到困難,別擔心:您並不孤單。它的學習曲線確實比較陡峭,但您可以清楚地了解 Vivado、PetaLinux 和 Vitis 如何協同工作,以及每個組件的作用。在這裡,您將找到實用且​​條理清晰的解釋,幫助您從 Vivado 設計過渡到在 Zynq 或 Zynq UltraScale+ 上運行您的第一個Linux應用程序,而不會感到不知所措。

很多人都想知道是否可以完全在 Vitis 中「生存」。你需要 PetaLinux 來提供核心、裝置樹和根檔案系統。在實際系統中,典型的開發流程是:在 Vivado 中產生 .xsa 文件,建立並配置 PetaLinux 專案(有時基於 BSP),編譯並包裝鏡像(SD 卡使用 WIC),然後匯出系統根目錄,以便在 Vitis 中或使用外部工具鏈開發應用程式。稍後,我將解釋其他方案、避免無休止重建的技巧,以及 FPGA 管理器或 TCF Agent 等工具的使用方法。

PetaLinux是什麼?它預設包含哪些內容?

PetaLinux 是 AMD 為其 SoC 和 MPSoC 設計的參考發行版,提供了一個可隨時自訂的 Linux 環境,其中包含最佳化的引導程式和核心、程式庫和實用程式、C/C++ 支援以及除錯工具。它還包括線程選項、FPU 支援以及用於輕鬆進行網路和韌體配置的基於 Web 的管理伺服器。

官方 BSP 通常包含預製的啟動鏡像和配置鏡像。您可以將這些二進位檔案部署並運行在真實硬體上,或在 PetaLinux 自帶的完整系統模擬器 QEMU 中運行。這可以加快初始測試速度,非常適合在開始開發應用程式驅動程式之前驗證專案是否能夠啟動。

推薦的硬體-軟體工作流程

在專業環境中,Linux 工作流程有兩個版本:一個版本專注於PetaLinux命令行,另一個版本則整合了 Vitis 用於應用程式開發,產生 .xsa 文件,並在適用情況下產生位元流。

Vitis 能完成所有工作嗎?對 Linux 來說,答案是否定的。 Vitis非常適合建立需要自訂核心、裝置樹和根檔案系統的平台。通常的做法是:使用 PetaLinux 建置系統並匯出 SDK/sysroot;然後使用 Vitis 或外部工具鏈來編譯和偵錯應用程式。

從 XSA 到啟動系統

最簡可行流程通常如下:在 Vivado 中產生 .xsa 文件,使用 petalinux-create 建立專案(或從 BSP 開始),使用該 .xsa 檔案更新 PetaLinux 中的硬件,並調整配置(核心、裝置樹和根檔案系統)。然後編譯、打包成 .wic 格式,並燒錄到 SD 卡。

  了解如何在不可見的情況下學習 Facebook 訊息

系統啟動後,就可以新增應用程式了。首先從 PetaLinux 匯出 sysroot/SDK,然後在 Vitis 中根據 .xsa 檔案建立一個平台。接下來,產生指向 sysroot 的 C/C++ 應用程式項目,以便正確連結根檔案系統庫。最後,使用 tcf-agent、gdbserver 或您偏好的方法在目標系統上執行該應用程式。

一個實際應用中的小提示:Vivado/Vitis/PetaLinux 版本之間存在一些問題。例如,Vitis Unified 2023.2 版本曾報告無法連接到 tcf-agent,而快速解決方法是升級到 2024.1 版本。務必查看版本說明,如果可能,請在專案進行過程中凍結您的工具堆疊。

Vivado硬體設計(Zynq-7000和Zynq UltraScale+)

您的技術基礎是 Vivado 的 Block Design 模組。新增「ZYNQ7 處理系統」模組(或 ZynqMP 中的等效模組),然後執行「運行模組自動化」來連接 DRAM 和時脈。之後,根據需要進行調整。

  • 啟用外部中斷:在 PS 自訂設定中,如果您打算在 PL 週邊之間共用 IRQ 線,請啟動 PS-PL 中斷和共用中斷。
  • 同步時脈:常見的做法是將 FCLK_CLK0 連接到 M_AXI_GP0_ACLK 端口,以便 AXI 匯流排時脈與 PS 時脈保持一致。

使用 PL IP 時,請依賴自動化功能。運行連接自動化功能可以建立 AXI 互連和仲裁,但請注意:它不會連接中斷或所有時脈樹。對於 IRQ,請使用連接區塊並將其輸出路由到 PS。

  • 將外圍 IP 的每個 IRQ 線連接到 Concat 區塊。
  • 將 Concat 輸出連接到 PS 中斷輸入。

如果PL需要高速記憶體,請新增BRAM。插入BRAM控制器和區塊記憶體產生器,定義連接埠數、寬度和容量,並且非常重要的是,在位址編輯器中檢查其映射關係。

  • 檢查並調整位址映射:不能有任何範圍重疊;如果存在重疊,Vivado 會將衝突標記為紅色。
  • 考慮其他主處理器(例如,程式邏輯單元中的協處理器)。分配地址是防止綜合失敗的必要步驟。

為了最終完成設計,請為 .bd 檔案建立 HDL 封裝,對其進行綜合和實作。生成比特流可能需要一些時間,完成後,導出硬件,如果您希望從啟動時對 PL 進行編程,則需要導出相應的位。

一些實用技巧:例如,如果您要使用 PYNQ 擴充板,那麼透過 EMIO 將 PS 訊號暴露給 PL以支援 GPIO 或 I2C 就非常實用。需要注意的是,整合週邊裝置通常硬連線到裝置上的固定引腳,而且並非總能在不更改連接的情況下用底層 IP 取代它們。如果實現失敗,請檢查限制(XDC)和分配​​情況。

  如何在 Discord 上建立和管理伺服器

設備樹和硬體映射

最關鍵的問題是:Linux 對使用者的抽象程度有多高?設備樹 (DTS)描述了設備位址、中斷請求 (IRQ) 和相容性。除非使用覆蓋層 (overlay),否則這種映射在啟動時並非「動態」的;它通常是靜態的,源自 Vivado 的位址編輯器和 PetaLinux 產生的 DTS。

控制部分(暫存器)和資料部分(例如,DMA 存取)在概念上和物理上都應該分離。使用“reg”範圍和中斷線。驅動程式(或 UIO)將使用此資訊來映射記憶體和中斷邏輯。範圍的大小和對齊方式必須與您在 Vivado 中定義的一致。

如果使用 PetaLinux 進行編譯,DTS 片段通常會從 .xsa 檔案自動產生。當硬體發生變更(例如新的 IP 位址)時,請更新 .xsa 文件,並至少重新建置裝置樹和核心。 rootfs 檔案並非總是需要更改,因此如果使用者庫未修改,sysroot 檔案仍然可以正常運作。

從 C/C++ 存取硬體的選項

沒有唯一的方法;請根據專案的階段以及您願意投入到驅動程式方面的精力來選擇。 /dev/mem用於MMIO映射,但由於安全性、可移植性和潛在的中斷問題,不建議在生產環境中使用。

一個折衷方案:UIO(使用者空間 I/O)可讓您將 IP 區域對應到使用者空間,並使用選擇/輪詢方式處理中斷。它需要將 UIO 節點添加到設備樹中,但避免了編寫完整的驅動程式。

專業方案是為您的IP建立字元驅動程式或平台驅動程式。字元驅動程式可以讓您精細控制DMA、IRQ、電源,並在/dev目錄下提供穩定的接口,同時還能更好地與核心生態系統整合。如果您的IP使用AXI-DMA或標準框架,則可以使用現有的驅動程式。

關於工具鏈:您可以使用 Vitis 或使用 PetaLinux 匯出的 SDK 進行編譯。執行 `petalinux-build --sdk`並將您的專案連結到該系統根目錄,以確保您連結到與目標根檔案系統中相同的庫。 Vitis 簡化了從 .xsa 檔案建置平台和啟動遠端偵錯的過程。

調試和遠端執行

要在目標系統上運行應用程序,您有多種選擇。如果tcf-agent已安裝在根檔案系統中(可透過 petalinux-config -c rootfs 新增),且不存在版本衝突,則 tcf-agent 非常適合從 Vitis 啟動和偵錯應用程式。

或者,gdbserver簡單易用且功能強大。您只需將二進位檔案複製到目標位置,執行 `gdbserver :port ./yourapp`,然後使用支援多架構的 gdb 從主機連線即可。許多團隊會將 gdbserver 與 VS Code Remote 或Python腳本結合。

  6 個徹底刪除檔案的程序

除了 printf 函數之外,還可以了解核心效能分析和追蹤技術。 Zynq社群分享了一些高效調試的最佳實踐,可以幫助您在遇到不明顯的 bug 時節省時間。

無需重建所有系統即可升級硬件

人們通常會認為修改 PL 檔案需要“重做一切”,但實際上並非如此。核心可見的介面(位址、中斷請求、相容性)、根檔案系統和系統根目錄通常保持不變。在這種情況下,您可以重新編寫 PL 文件,一切就緒。

為了按需載入位元流,Linux 提供了 FPGA 管理器框架 ( fpgautil)或 sysfs/configfs 接口,用於從用戶空間對 FPGA 進行程式設計。這避免了重新產生整個映像,並加快了邏輯迭代速度。

如果硬體變更引入了新的 IP 位址或修改了 IP 位址範圍/中斷要求 (IRQ),那麼是的:需要重建設備樹並重新產生 BOOT.BIN/鏡像。即便如此,也應該使用狀態快取 (sstate cache) 來防止編譯過程重複執行已完成的任務。

加快建造速度並提高穩定性的技巧

避免「一切重來」的最佳方法是快取和組織。使用 sstate 鏡像和 Yocto/PetaLinux 的共享下載目錄;這可以避免重複編譯未更改的軟體包。這對於大型系統和內部環境來說至關重要。

保持可複現性:固定 Vivado/Vitis/PetaLinux 版本並記錄補丁。盡可能避免在專案進行過程中變更版本,除非是已確認的嚴重錯誤。在切換到新版本之前,請在分支上進行測試。

QEMU 是你的好幫手。在 QEMU 中啟動鏡像,無需刷寫 SD 卡即可驗證根檔案系統和核心是否正常運作。它不會替換實際硬件,但可以節省啟動次數。

綜上所述,整個過程不再像拼圖遊戲那麼複雜。 Vivado提供了一個完整的參考發行版(包括引導程式、核心、根檔案系統和工具),用於定義實體映射,而 Vitis 則加速了應用程式的開發和調試週期。在此基礎上,如何利用設備樹、UIO 或驅動程序,決定了應用程式是從簡單的“Hello World”程序發展成為能夠無縫利用硬體資源的強大應用。