0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

整合Xilinx PetaLinux工程编译和Open Source U- Boot/Linux编译

YCqV_FPGA_EETre 来源:博客园 2020-06-28 10:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 测试环境

Ubuntu 16.04

PetaLinux 2019.1

PetaLinux 2019.1 ZCU106 BSP

ZCU106

2. PetaLinux介绍

PetaLinux是Xilinx基于Yocto推出的Linux开发工具。Yocto是业界主流的Linux发行版的构建工具,它不仅可以从源代码编译Linux 内核,还可以编译Linux发行版必须的数以千计的的应用程序,功能非常强大。Yocto的出现,大幅度降低了构建嵌入式Linux发行版的难度。

万物总有两面性。虽然PetaLinux/Yocto可以一键编译出一个自定义的嵌入式Linux发行版,但是编译整个文件系统很耗费时间。完整的一次PetaLinux/Yocto编译,可能需要从网络下载上GB的文件,可能需要几个小时。即使只更改一行代码,也需要数分钟时间。

PetaLinux/Yocto的编译流程,也和很多开发人员原来的基于make的工作方法不一样,它会分析文件系统里所有应用程序的配置文件,执行下载、配置、编译、打包等过程。

如果在调试单板时,仅仅改动一行代码,也需要执行这些操作,显得冗余,也影响开发效率。

为了适应开发人员的工作习惯,也为了提高速度,可以整合PetaLinux工程编译和OpenSource U-Boot/Linux编译。

3. PetaLinux的安装

对于PetaLinux的安装,请参考Xilinx文档, UG1144 PetaLinux Tools Reference Guide, 和一键离线安装PetaLinux依赖包:https://forums.xilinx.com/t5/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/%E5%88%86%E4%BA%AB-%E4%B8%80%E9%94%AE%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85PetaLinux%E4%BE%9D%E8%B5%96%E5%8C%85/td-p/1019995

4. 提高PetaLinux/Yocto的编译速度

4.1. 下载SState cache

在Xilinx网站下载sstate cache,2019.1版的大小时32.84 GB。下载前,需要注册Xilinx网站的帐号。

Xilinx下载网站嵌入式工具下载区:

https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html

登录后,文件从类似于

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/2019.1.sstate.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/
ftp://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/
http://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/
https://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/
"

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/
ftp://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/
http://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/
https://.*/.* file:///opt/Xilinx/peta/2019.1.sstate.downloads/
git://.*/.* file:///opt/Xilinx/peta/downloads/
ftp://.*/.* file:///opt/Xilinx/peta/downloads/
http://.*/.* file:///opt/Xilinx/peta/downloads/
https://.*/.* file:///opt/Xilinx/peta/downloads/
"

后续编译时,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;"
"ethaddr=003522:01"

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编译,既适应开发人员的工作习惯,也提高了速度。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20143

    浏览量

    328666
  • Xilinx
    +关注

    关注

    73

    文章

    2192

    浏览量

    129881
  • 应用程序
    +关注

    关注

    38

    文章

    3342

    浏览量

    59907

原文标题:【工程师分享】整合Xilinx PetaLinux工程编译和Open Source U- Boot/Linux编译

文章出处:【微信号:FPGA-EETrend,微信公众号:FPGA开发圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    别再迷糊了!Linux交叉编译到底是个啥?一文讲清楚

    就用 不绕弯子、接地气、工程师能看懂 的方式,把交叉编译讲得明明白白。 而且结合我们钡铼技术(BaileiTech)那些跑在 ARM、RISC-V、国产嵌入式 Linux 的产品,告诉你交叉
    的头像 发表于 12-03 16:28 356次阅读
    别再迷糊了!<b class='flag-5'>Linux</b>交叉<b class='flag-5'>编译</b>到底是个啥?一文讲清楚

    Linux 下交叉编译实战:跑起来你的第一个 STM32 程序

    很多开发者第一次接触STM32,总会被“交叉编译”、“烧录程序”等概念绕晕。其实方法很简单:在Linux下配置交叉编译环境,编写简单程序,然后烧录到STM32,就可以看到成果了。本文带你从零开始
    的头像 发表于 11-24 19:04 226次阅读
    <b class='flag-5'>Linux</b> 下交叉<b class='flag-5'>编译</b>实战:跑起来你的第一个 STM32 程序

    飞凌嵌入式ElfBoard ELF 1板卡-uboot编译u-boot/u-boot.bin/u-boot.imx

    u-boot文件就是编译流程章节讲的,链接器将链接各.o文件之后生成的.elf文件,该文件中包含了大量的调试信息、地址信息和注释信息,不能被直接执行,需要转换成为可执行的u-boot.bin文件,而
    发表于 05-22 11:24

    不借助Linux系统,在Windows下如何搭建ZMC900E交叉编译环境

    不需要依赖笨重的虚拟机,也不需要安装双系统。抛开繁琐的环境准备,在Windows上轻松搭建交叉编译环境。本文将介绍如何在Windows上搭建交叉编译环境,不借助Linux系统,直接进行交叉编译
    的头像 发表于 05-21 11:34 648次阅读
    不借助<b class='flag-5'>Linux</b>系统,在Windows下如何搭建ZMC900E交叉<b class='flag-5'>编译</b>环境

    瑞芯微RK3506 3核A7@1.5GHz+双网口+双CAN-FD 工业开发板—Linux系统开发手册

    本文主要演示Linux系统开发流程。包括LinuxSDK的配置与编译U-Boot、Kernel及Rootfs开发,以及系统镜像的替换方法,旨在帮助开发者完成系统开发。
    的头像 发表于 05-20 09:24 1121次阅读
    瑞芯微RK3506 3核A7@1.5GHz+双网口+双CAN-FD 工业开发板—<b class='flag-5'>Linux</b>系统开发手册

    Linux内核编译失败?移动硬盘和虚拟机的那些事儿

    Linux开发中,编译内核是一项常见任务,但不少开发者在移动硬盘或虚拟机环境下尝试时会遭遇失败。本文将简要探讨这些问题的成因,并介绍一些虚拟机使用技巧,帮助大家更好地应对相关问题。在移动硬盘里编译
    的头像 发表于 04-11 11:36 728次阅读
    <b class='flag-5'>Linux</b>内核<b class='flag-5'>编译</b>失败?移动硬盘和虚拟机的那些事儿

    TWR-VF65GS10塔式模块上编译U-Boot没有控制台输出是怎么回事?

    我有一个预构建的映像(来自 LinuxLink Timesys 的工厂起点),其中包括 SD 卡上的 U-BootLinux,它通过连接到板上 D9插头的 TWR-SER-SCH
    发表于 04-03 06:03

    从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

    /environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi”以设置相应的环境变量,其中的“.”和source具有相同含义。 1.3拷贝源码到Ubuntu系统拷贝u-boot
    发表于 03-20 16:48

    【ELF 2学习板试用】1、快速入门、简单模块编译和运行

    了。 3.3Linux Kernel编译 上述的源代码文件、KConfig和makefile选项设置完成后,执行ELF2_linux_source文件夹下的build.sh脚本并添加kernel选项
    发表于 02-17 21:24

    迅为RK3588开发板实时系统编译-Preemption系统/ Xenomai系统编译-编译Linux实时系统-单独编译1

    界面,进入之后如下所示: ./build.sh 光标默认就在uboot,所以直接回车即可开始uboot的编译编译过程如下所示: Uboot 编译完成如下图所示: 编译完成后生成 u
    发表于 01-23 10:20

    Triton编译器与其他编译器的比较

    Triton编译器与其他编译器的比较主要体现在以下几个方面: 一、定位与目标 Triton编译器 : 定位:专注于深度学习中最核心、最耗时的张量运算的优化。 目标:提供一个高度抽象、灵活、高效
    的头像 发表于 12-24 17:25 1571次阅读

    Triton编译器功能介绍 Triton编译器使用教程

    Triton 是一个开源的编译器前端,它支持多种编程语言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一个可扩展和可定制的编译器框架,允许开发者添加新的编程语言特性和优化技术
    的头像 发表于 12-24 17:23 2667次阅读

    干货来喽!实用树莓派Linux编译指南

    不友好,有没有好的解决办法? 今天来分享一下我的私藏干货——树莓派Linux编译编译好之后,开发板只需插到树莓派上连接电脑就可以直接用了,极其方便。 本文以树莓派为例,其他板子只要带Linu
    的头像 发表于 12-18 16:31 833次阅读
    干货来喽!实用树莓派<b class='flag-5'>Linux</b><b class='flag-5'>编译</b>指南

    实用树莓派Linux编译指南,打工人必备!

    不友好,有没有好的解决办法? 今天来分享一下我的私藏干货——树莓派Linux编译编译好之后,开发板只需插到树莓派上连接电脑就可以直接用了,极其方便。 本文以树莓派为例,其他板子只要带Linu
    的头像 发表于 12-17 16:19 1979次阅读
    实用树莓派<b class='flag-5'>Linux</b><b class='flag-5'>编译</b>指南,打工人必备!

    飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译

    接下来我们就进行内核代码的初次编译,直接使用我们适配好的Linux内核源码进行编译。为了使编译操作更加简单,我们提供了编译脚本,将
    发表于 12-17 09:34