做者: 付漢傑html
1. 測試環境linux
- Ubuntu 16.04
- PetaLinux 2019.1
- PetaLinux 2019.1 ZCU106 BSP
- ZCU106
2. PetaLinux介紹git
PetaLinux是Xilinx基於Yocto推出的Linux開發工具。Yocto是業界主流的Linux發行版的構建工具,它不只能夠從源代碼編譯Linux 內核,還能夠編譯Linux發行版必須的數以千計的的應用程序,功能很是強大。Yocto的出現,大幅度下降了構建嵌入式Linux發行版的難度。
萬物總有兩面性。雖然PetaLinux/Yocto能夠一鍵編譯出一個自定義的嵌入式Linux發行版,可是編譯整個文件系統很耗費時間。完整的一次PetaLinux/Yocto編譯,可能須要從網絡下載上GB的文件,可能須要幾個小時。即便只更改一行代碼,也須要數分鐘時間。PetaLinux/Yocto的編譯流程,也和不少開發人員原來的基於make的工做方法不同,它會分析文件系統裏全部應用程序的配置文件,執行下載、配置、編譯、打包等過程。
若是在調試單板時,僅僅改動一行代碼,也須要執行這些操做,顯得冗餘,也影響開發效率。
爲了適應開發人員的工做習慣,也爲了提升速度,能夠整合PetaLinux工程編譯和OpenSource U-Boot/Linux編譯。github
3. PetaLinux的安裝bash
對於PetaLinux的安裝,請參考Xilinx文檔, UG1144 PetaLinux Tools Reference Guide, 和 一鍵離線安裝PetaLinux依賴包網絡
4. 提升PetaLinux/Yocto的編譯速度 4.1. 下載SState cacheapp
在Xilinx網站下載sstate cache,2019.1版的大小時32.84 GB。下載前,須要註冊Xilinx網站的賬號。less
Xilinx下載網站嵌入式工具下載區ide
登陸後,文件從相似於https://www.xilinx.com/member/forms/download/xef.html?filename=sstate-rel-v2019.1.tar.gz的地址下載。工具
下載後,解壓到本地,能夠看到相似下面的目錄結構。
$ ls
aarch64 arm downloads mb-full mb-lite versal
$ cd aarch64/
aarch64$ ls
00 07 0e 15 1c 23 2a 31 38 3f 46 4d 54 5b 62 69 70 77 7e 85 8c 93 9a a1 a8 af b6 bd c4 cb d2 d9 e0 e7 ee f5 fc
01 08 0f 16 1d 24 2b 32 39 40 47 4e 55 5c 63 6a 71 78 7f 86 8d 94 9b a2 a9 b0 b7 be c5 cc d3 da e1 e8 ef f6 fd
02 09 10 17 1e 25 2c 33 3a 41 48 4f 56 5d 64 6b 72 79 80 87 8e 95 9c a3 aa b1 b8 bf c6 cd d4 db e2 e9 f0 f7 fe
03 0a 11 18 1f 26 2d 34 3b 42 49 50 57 5e 65 6c 73 7a 81 88 8f 96 9d a4 ab b2 b9 c0 c7 ce d5 dc e3 ea f1 f8 ff
04 0b 12 19 20 27 2e 35 3c 43 4a 51 58 5f 66 6d 74 7b 82 89 90 97 9e a5 ac b3 ba c1 c8 cf d6 dd e4 eb f2 f9 universal
05 0c 13 1a 21 28 2f 36 3d 44 4b 52 59 60 67 6e 75 7c 83 8a 91 98 9f a6 ad b4 bb c2 c9 d0 d7 de e5 ec f3 fa universal-4.8
06 0d 14 1b 22 29 30 37 3e 45 4c 53 5a 61 68 6f 76 7d 84 8b 92 99 a0 a7 ae b5 bc c3 ca d1 d8 df e6 ed f4 fb
4.2. 設置SState cache
在PetaLinux工程目錄下執行命令petalinux-config,在菜單Yocto Settings->Local sstate feeds settings->local sstate feeds url設置本地SState cache的目錄。
對於ZynqMP,使用aarch64,好比/opt/Xilinx/peta/sstate-rel-v2019.1/aarch64。對於Zynq-7000,使用arm,好比/opt/Xilinx/peta/sstate-rel-v2019.1/arm。設置後,文件project-spec/configs/config會包含指定的目錄,好比下行:
CONFIG_YOCTO_LOCAL_SSTATE_FEEDS_URL="/opt/Xilinx/peta/sstate-rel-v2019.1/aarch64/"
對於sstate的使用,能夠參考Xilinx下載網站嵌入式工具下載區的README for state-cache。
4.3. 利用離線下載文件
SState文件包裏,還有不少經常使用軟件的壓縮包。
hankf@xszgs4:/opt/Xilinx/peta/sstate-rel-v2019.1/downloads$ ls
acl-2.2.52.src.tar.gz lame-3.100.tar.gz
acpica-unix2-20180508.tar.gz less-530.tar.gz
adwaita-icon-theme-3.28.0.tar.xz libarchive-3.3.3.tar.gz
alsa-lib-1.1.6.tar.bz2 libassuan-2.5.1.tar.bz2
alsa-plugins-1.1.6.tar.bz2 libcap-2.25.tar.xz
alsa-tools-1.1.6.tar.bz2 libcroco-0.6.12.tar.xz
alsa-utils-1.1.6.tar.bz2 libdaemon-0.14.tar.gz
... ...
在project-spec/meta-user/conf/petalinuxbsp.conf裏,添加以下內容,就能夠重用這些文件。編譯過程須要的件,若是已經在其中,就不會再去網絡下載,而是直接建立鏈接到本地文件。
PREMIRRORS_prepend = " \
git://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
ftp://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
http://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
https://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
"
4.4. 重用下載文件
PetaLinux在編譯過程當中下載所須要的文件,編譯結束後,目錄build/downloads/下含有不少下載的文件。
$ ls build/downloads/*.xz
build/downloads/atk-2.28.1.tar.xz build/downloads/grep-3.1.tar.xz build/downloads/netbase_5.4.tar.xz
build/downloads/at-spi2-atk-2.26.2.tar.xz build/downloads/gst-rtsp-server-1.14.4.tar.xz build/downloads/ofono-1.24.tar.xz
build/downloads/at-spi2-core-2.28.0.tar.xz build/downloads/gtk+-2.24.32.tar.xz build/downloads/pango-1.42.4.tar.xz
build/downloads/autoconf-archive-2018.03.13.tar.xz build/downloads/gtk+-3.22.30.tar.xz build/downloads/pciutils-3.6.2.tar.xz
build/downloads/bash-completion-2.8.tar.xz build/downloads/gtk-doc-1.29.tar.xz build/downloads/pcmanfm-1.3.0.tar.xz
... ...
$ ls build/downloads/*.bz2
build/downloads/alsa-lib-1.1.6.tar.bz2 build/downloads/libassuan-2.5.1.tar.bz2 build/downloads/pcre-8.42.tar.bz2
build/downloads/alsa-plugins-1.1.6.tar.bz2 build/downloads/libgpg-error-1.32.tar.bz2 build/downloads/pixman-0.34.0.tar.bz2
build/downloads/alsa-tools-1.1.6.tar.bz2 build/downloads/libICE-1.0.9.tar.bz2 build/downloads/sysvinit-2.88dsf.tar.bz2
build/downloads/busybox-1.29.2.tar.bz2 build/downloads/libmnl-1.0.4.tar.bz2 build/downloads/xcb-proto-1.13.tar.bz2
... ...
建議把這些文件拷貝到一個工程外的本地目錄,好比/opt/Xilinx/peta/downloads/。而後在project-spec/meta-user/conf/petalinuxbsp.conf裏,添加以下內容,就能夠重用這些文件。
PREMIRRORS_prepend = " \
git://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
ftp://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
http://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
https://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/ \n \
git://.*/.* file:///opt/Xilinx/peta/downloads/ \n \
ftp://.*/.* file:///opt/Xilinx/peta/downloads/ \n \
http://.*/.* file:///opt/Xilinx/peta/downloads/ \n \
https://.*/.* file:///opt/Xilinx/peta/downloads/ \n \
"
後續編譯時,downloads目錄下的大部分文件都是連接。這時候,檢查新下載的文件,就很困難。可使用命令「ls -l | grep -v ">" | grep -v done」排除連接和後綴爲done的標誌文件,從而只顯示新下載的文件。建議也把這些新下載的文件拷貝到上述本地目錄,方便之後編譯。
hankf@xszgs4:/proj/hankf/zcu106/v191/zcu106-2019.1-bsp/build/downloads$ ls -l
total 3972
lrwxrwxrwx 1 hankf hankf 72 Oct 15 15:32 acl-2.2.52.src.tar.gz -> /xilinxtool/peta/2019.1/components/yocto/downloads/acl-2.2.52.src.tar.gz
-rw-rw-r-- 1 hankf hankf 141 Oct 15 15:32 acl-2.2.52.src.tar.gz.done
lrwxrwxrwx 1 hankf hankf 73 Oct 15 15:32 alsa-lib-1.1.6.tar.bz2 -> /xilinxtool/peta/2019.1/components/yocto/downloads/alsa-lib-1.1.6.tar.bz2
hankf@xszgs4:/proj/hankf/zcu106/v191/zcu106-2019.1-bsp/build/downloads$ ls -l | grep -v ">" | grep -v done
total 3972
drwxrwxr-x 62 hankf hankf 12288 Oct 15 16:11 git2
-rw-rw-r-- 1 hankf hankf 2515756 Oct 15 16:11 git2_github.com.xilinx.gst-omx.git.tar.gz
... ...
4.5. 離線編譯
若是確信全部軟件包都已經在本地,能夠去掉網絡鏈接,執行離線編譯,會提升編譯速度。
在菜單Yocto Settings裏,去掉「Enable Network sstate feeds」,選擇「Enable BB NO NETWORK」。
5. Open Source Linux和UBoot 5.1. 保留Linux和UBoot源代碼
缺省狀況下,PetaLinux在編譯完成後會刪除源代碼,以節省硬盤空間。在project-spec/meta-user/conf/petalinuxbsp.conf裏,添加以下內容,能夠保留Linux和UBoot源代碼。
RM_WORK_EXCLUDE += "linux-xlnx"
RM_WORK_EXCLUDE += "u-boot-xlnx"
5.2. 取得Linux源代碼
若是爲Linux添加了上述RM_WORK_EXCLUDE字段,PetaLinux工程在編譯後,在build目錄下的某一級子目錄kernel-source,含有全部Linux源代碼。對於PetaLinux 2019.1的ZCU106 BSP工程,Linux源代碼在目錄 ./build/tmp/work-shared/zcu106-zynqmp/kernel-source/。能夠複製這個目錄裏的Linux源代碼,用來使用open source流程編譯。
PetaLinux工程在編譯後,在build目錄下的某一級子目錄kernel-build-artifacts保存了Linux的配置文件.config. 對於PetaLinux 2019.1的ZCU106 BSP工程,Linux的配置文件.config在./build/tmp/work-shared/zcu106-zynqmp/kernel-build-artifacts/。
爲了方便使用,能夠把文件.confi複製到Linux源代碼的子目錄arch/arm/configs/下,重命名爲xilinx_peta_defconfig。這樣使用make xilinx_peta_defconfig,能夠建立PetaLinux使用的Linux配置。
生成image.ub,須要一個後綴名爲its的配置文件,來指定使用的設備樹文件、根文件系統文件、內核文件。its文件的相關信息,請參考蝸窩科技 u-boot FIT image介紹。在PetaLinux 2018.2/2018.3裏,images/linux/下有文件rootfs.its。可是在PetaLinux 2019.1裏,已經沒有這個文件。在build目錄下的文件fit-image-petalinux-user-image.its,也能夠用於生成image.ub。對於PetaLinux 2019.1的ZCU106 BSP工程,它在目錄build/tmp/work/zcu106_zynqmp-xilinx-linux/linux-xlnx/4.19-xilinx-v2019.1+gitAUTOINC+9811303824-r0/linux-zcu106_zynqmp-standard-build/下。
fit-image-petalinux-user-image.its使用了build下的層次很深的子目錄來指定文件。爲了方便,能夠修改成使用images/linux下的文件。PetaLinux工程的目錄"images/linux/"裏,含有建立image.ub的devicetree、rootfs文件等。
5.3. 取得UBoot源代碼
若是爲UBoot添加了上述RM_WORK_EXCLUDE字段,PetaLinux工程在編譯後,在build目錄下的某一級子目錄u-boot-xlnx裏的子目錄git,含有全部UBoot源代碼。對於PetaLinux 2019.1的ZCU106 BSP工程,UBoot源代碼在目錄 ./build/tmp/work/zcu106_zynqmp-xilinx-linux/u-boot-xlnx/v2019.01-xilinx-v2019.1+gitAUTOINC+d895ac5e94-r0/git/。若是使用了外部UBoot源代碼編譯,則沒有這個源代碼。能夠複製前面提到的UBoot源代碼,用來使用open source流程編譯。
值得注意的是,從PetaLinux工程裏獲得的UBoot源代碼的include/configs/platform-auto.h文件裏的宏定義裏的鏈接符後有空格,致使編譯時編譯器會產生大量警告。建議修改platform-auto.h,消除編譯器警告。下面是修改以前的宏定義的一部分。
"nc=setenv stdout nc;setenv stdin nc;\0" \
"ethaddr=00:0a:35:00:22:01\0" \
PetaLinux工程在編譯後,在build目錄下的某一級子目錄u-boot-xlnx裏的子目錄build下,保存了Linux的配置文件.config. 對於PetaLinux 2019.1的ZCU106 BSP工程,UBoot的配置文件.config在./build/tmp/work/zcu106_zynqmp-xilinx-linux/u-boot-xlnx/v2019.01-xilinx-v2019.1+gitAUTOINC+d895ac5e94-r0/build/.config。
爲了方便使用,能夠把文件.confi複製到UBoot源代碼的子目錄configs下,重命名爲xilinx_peta_defconfig。這樣使用make xilinx_peta_defconfig,能夠建立PetaLinux使用的UBoot配置。
PetaLinux工程生成boot.bin時,會在build目錄下生成文件bootgen.bif。編譯UBoot後,須要建立boot.bin,也須要bootgen.bif,因此把bootgen.bif一塊兒複製到UBoot源代碼目錄。bootgen.bif裏用的是臨時目錄,最好改爲
PetaLinux工程的目錄"images/linux/". PetaLinux工程的目錄"images/linux/"裏,含有建立boot.bin的pmu, fsbl, ATF的ELF文件。
5.4. Open Source 編譯Linux
取得Linux源代碼和配置後,能夠在其中執行make,編譯Linux。注意,編譯前請導入PetaLinux環境變量,設置和導出ARCH爲arm或者arm64;設置和導出CROSS_COMPILE,好比aarch64-linux-gnu-。編譯後獲得vmlinux,還須要用下列命令,把它打包成image.ub。
aarch64-linux-gnu-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin
gzip -9 linux.bin
mv -f linux.bin.gz linux.bin
mkimage -f fit-image-petalinux-user-image.its image.ub
5.5. Open Source編譯Linux時間
更改Xlnx_vcu.c, Xlnx_vcu_clk.c, Xlnx_vcu_core.c, 在它們的開始增長DEBUG宏定義,並增長兩個printk打印後,使用petalinux-build編譯,耗時337秒。一樣更改,使用外部Linux源代碼編譯,並建立image.ub,只耗時8秒鐘。
5.6. Open Source編譯UBoot
取得UBoot源代碼和配置後,能夠在其中編譯UBoot,獲得u-boot.elf。而後再使用下列命令建立boot.bin。
bootgen -arch zynqmp -image bootgen.bif -o BOOT.BIN -w on
5.7. Open Source編譯UBoot時間
在PetaLinux裏,編譯UBoot,並建立boot.bin,總共耗時84秒鐘。
在外部UBoot源代碼裏,從頭編譯UBoot,並建立boot.bin,總共耗時26秒鐘。
因此從外部源代碼裏編譯UBoot,速度快兩倍多。
6. 總結
經過整合PetaLinux工程編譯和Open Source U-Boot/Linux編譯,既適應開發人員的工做習慣,也提升了速度。