買了一塊ZYNQ 開發板Z7-NANO,開始了ZYNQ開發的苦難之旅。盡管按照廠商提供的開箱檢查指南,將image 拷貝到sd卡上插入板上后板子工作起來了。但是如何開發應用軟件呢?這一步要比平常的SOC麻煩了許多。
安裝軟件
網絡上有許多的文章介紹應用軟件的開發,但是大多數使用的是舊版本的vivado和SDK 軟件。開發板提供的文檔和軟件也大多是基于舊版軟件的,但是官網上已經使用的軟件是vivado和vitis了,前者開發硬件,后者開發軟件。
下載軟件使用 Xilinx Unified Installer 2021.2。通過它下載vivado和vitis。安裝軟件需要足夠的磁盤空間和耐心。vitis 軟件包大約有60個G左右。vitis 中包括了vivado 軟件。只需要下載vitis就可以了,不必單獨地下載vivado。
vivado用來開發硬件,vitis 開發軟件,相當于原來的SDK。
由于手頭沒有大硬盤空間的ubuntu Linux 電腦,又不想去做VM。先安裝在windows10 的筆記本上了。網絡上建議安裝在ubuntu 上。
ZYNQ 的開發流程
ZYNQ 的開發要比其它的SOC開發復雜的多。大至的流程包括:
img
ZYNQ的開發包括
1 硬件邏輯設計
硬件工程師設計邏輯并將軟件開發所需的信息從Vivado導出到 XSA 存檔文件。
2 構建軟件平臺
平臺(platform)
平臺是硬件組件 (XSA) 和軟件組件(域/BSP、FSBL 等引導組件等)的組合。
領域(domain)
一個平臺上可以建立多個領域。領域是一個板級支持包 (BSP) 或操作系統 (OS),其中包含用于構建應用程序的軟件驅動程序集合。例如LinuxDomain。可以創建多個應用程序以在域上運行。領域與平臺中的單個處理器或同構處理器集群。比如在一個核上運行Linux,或者在兩個核的集群上運行Linux。
建立領域的基礎是支持包和操作系統。Zynq 的Linux 稱為PetaLinux。PetaLinux 的裁剪需要使用Petalinux 構建工具。
Petalinux是Xilinx公司推出的嵌入式Linux開發套件,包括了Linux Kernel、u-boot、device-tree、rootfs等源碼、庫,以及Yocto recipes,可以讓客戶很方便的生成、配置、編譯及自定義。Petalinux支持Zynq UltraScale+ MPSoC、Zynq-7000全可編程SoC,以及MicroBlaze,可與Xilinx硬件設計工具Vivado協同工作,大大簡化了Linux系統的開發工作。
在vitis 軟件中,包含Xilinx開發的多個開發板的硬件xsa。并且能夠建立相應的LinuxDomain。
3 應用程序開發
軟件開發人員基于平臺和領域創建應用程序。
在已有的平臺上開發應用程序
網絡上有許多ZYNQ 應用程序開發的文檔和教程,但是它們大多數使用的2018 年前的vivado 和SDK 的。幾乎沒有使用vitis 開發。而國內的ZYNQ開發板目前還沒有提供支持vitis 平臺的軟件包。
網絡上關于ZYNQ 開發的介紹文章都比較復雜,大多數從vivado 硬件設計開始,再談petaLinux,再談到vitis 的使用。
其實沒有那么復雜。 最方便地方法就是在vitis 軟件中支持xilinx 開發板的platefrom 構建應用程序,這些開發板包括:
zc702 基于Zynq XC7Z020-1CLG484C。
zc706 基于XC7Z045,PCI插卡結構
zcu102 Zynq? UltraScale+? MPSoC ,四核 ARM? Cortex?-A53、雙核 Cortex-R5F 實時處理器以及一款 Mali?-400 MP2 圖像處理單元。
zcu106 基于Zynq UltraScale+MPSoC。
zedBoard 基于Zynq-7000 SoC XC7Z020-CLG484-1。由安富利公司開發的低成本開發板。
開發的過程
vitis –New->Create Application Project
點擊Next。
選擇zc702 平臺,點擊Next。
填入Application Project Nam。例如LinuxApp4
Z7020 系列ZYNQ 是雙核cortex-A9 .
領域可以建立在單核上也可以建立在雙核上,也可以是一個為linux,一個為freeRTOS 上。非常靈活,在這里我們選擇ps7_cortexa9_SMP。雙核linux。
按Next
img
在這一步我以為要填入紅框內的內容,下載了 common image,并且生成了Sysroot
xilinx-zynqmp-common-v2021.2
導入到項目中,結果發現編譯通不過,缺少-lstdC++,等等問題。后來發現,z702 平臺包中已經包含了Sysroot 的SDK內容。不需要填入任何東西就可以編譯成功。
按Next
選擇Linux Hello World!
生成了一個簡單的hello world c程序
#includeintmain(){ printf("Helloworld "); }
選擇 Project-> Build Project .經過很長的一段時間。終于編譯成功了。但是沒法形成SD image。
copy 到我的Z7_Nano 開發板的SD Card 上。插入到目標板,運行Linux。輸入
$>mkdirsdcard $>mount/dev/mmcblk0sdcard $>cdsdcard $>./main.elf Helloworld! $>
為了測試其它庫的調用,編寫了一個UDP Client 程序,同樣編譯成功了
//ClientsideimplementationofUDPclient-servermodel #include#include #include #include #include #include #include #include #definePORT8080 #defineMAXLINE1024 //Drivercode intmain(){ intsockfd; charbuffer[MAXLINE]; char*hello="Hellofromclient"; structsockaddr_inservaddr; //Creatingsocketfiledescriptor if((sockfd=socket(AF_INET,SOCK_DGRAM,0))0?)?{ ??perror("socket?creation?failed"); ??exit(EXIT_FAILURE); ?} ? ?memset(&servaddr,?0,?sizeof(servaddr)); ? ?//?Filling?server?information ?servaddr.sin_family?=?AF_INET; ?servaddr.sin_port?=?htons(PORT); ?servaddr.sin_addr.s_addr?=?INADDR_ANY; ? ?int?n,?len; ? ?sendto(sockfd,?(const?char?*)hello,?strlen(hello), ??MSG_CONFIRM,?(const?struct?sockaddr?*)?&servaddr, ???sizeof(servaddr)); ?printf("Hello?message?sent. "); ? ?n?=?recvfrom(sockfd,?(char?*)buffer,?MAXLINE,MSG_WAITALL,?(struct?sockaddr?*)?&servaddr,(socklen_t?*)&len); ?buffer[n]?=?'?'; ?printf("Server?:?%s ",?buffer); ? ?close(sockfd); ?return?0; }
為了測試C++ 程序,編寫了
#includeusingnamespacestd; classhello{ public: voidSayHello(); }; voidhello::SayHello() { cout<<"Hello?world"<
也通過了編譯。
結束語
ZYNQ 要比普通的SOC 芯片復雜很多,國產開發板的技術支持相對滯后。給初學者帶來不小的困難。
審核編輯:劉清
-
soc
+關注
關注
38文章
4165瀏覽量
218271 -
Zynq
+關注
關注
10文章
609瀏覽量
47182 -
Ubuntu系統
+關注
關注
0文章
91瀏覽量
3942
原文標題:zynq /vitis 應用筆記
文章出處:【微信號:ZYNQ,微信公眾號:ZYNQ】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論