ZYNQ:加速 PetaLinux 工程编译、复制 PetaLinux 工程

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编译。

环境:PetaLinux 2018.3

安装PetaLinux

对于PetaLinux的安装,请参考Xilinx文档: UG1144 PetaLinux Tools Reference Guide

提高PetaLinux/Yocto的编译速度

Note:参考来自 sstate_rel_2020.1_README

  • By default petalinux uses sstate-cache and download mirrors from petalinux.xilinx.com.
  • This doc is for the users who uses tool completely offline.

下载SState cache

下载前,需要注册Xilinx网站的帐号。

在Xilinx网站下载sstate cache2018.3版的大小时29.89 GB。

sstate cache-v2018.3 (TAR/GZIP - 29.89 GB )

MD5 SUM Value: 64103b445f2af366b83897f80e9bcb9e

下载后,解压到本地,可以看到类似下面的目录结构。

$ ls 
aarch64  arm  downloads  mb-full  mb-lite  downloads

并非每一个目录都是需要的,使用时,只需要对应平台的目录即可。

以下是目录与平台的对应关系:

目录 平台
aarch64 ZynqMP
arm Zynq
mb-full MB AXI
mb-lite MB AXI lite
downloads 全平台

每一个目录都是类似下面的结构:

$ ls arm/

00  14  28  3c  50  64  78  8c  a0  b4  c8  dc  f0
01  15  29  3d  51  65  79  8d  a1  b5  c9  dd  f1
02  16  2a  3e  52  66  7a  8e  a2  b6  ca  de  f2
03  17  2b  3f  53  67  7b  8f  a3  b7  cb  df  f3
...
0e  22  36  4a  5e  72  86  9a  ae  c2  d6  ea  fe
0f  23  37  4b  5f  73  87  9b  af  c3  d7  eb  ff
10  24  38  4c  60  74  88  9c  b0  c4  d8  ec  universal
11  25  39  4d  61  75  89  9d  b1  c5  d9  ed  universal-4.8
12  26  3a  4e  62  76  8a  9e  b2  c6  da  ee
13  27  3b  4f  63  77  8b  9f  b3  c7  db  ef

假设以ZYNQ为例,对应的目录(arm)解压到了下面的路径:

download:
/home/xx/sstate_package_for_petalinux/downloads

zynq:
/home/xx/sstate_package_for_petalinux/arm

设置

1、输入 petalinux-config、在对应的位置设置好缓存以及镜像。

注意,修改镜像时,填入的路径是以file://开头的

-> Yocto Settings
	## 设置缓存:SState cache
    -> Local sstate feeds settings
       -> local sstate feeds url    ## 按 Enter
	   /home/xx/sstate_package_for_petalinux/arm

-> Yocto Settings
    ## 设置镜像:download mirror
    -> Add pre-mirror url           ## 按 Enter
    file:///home/xx/sstate_package_for_petalinux/downloads
    
-> Yocto Settings    
    ## 设置离线编译
    [ ] Enable Network sstate feeds ## 按 N
    [*] Enable BB NO NETWORK        ## 按 Y

2、Save,检查build/conf/plnxtool.conf是否有对应的修改。

3、自动生效。

4、此后, petalinux-build会从本地进行寻找。

脚本

#!/bin/sh
## 本地仓库设置
SSTATE_LOCAL_PATH="/home/huangshuchao/sstate_package_for_petalinux/"
## IP地址设置
NET=192.168.1
IPADDR=$NET.100


#删除带有指定关键字的行
delete_line_with_special_word ()
{
    if [[ $# -lt 2 ]]; then
        return
    fi
    FILE=$1
    WORD=$2

    sed -i "/${WORD}/d" ${FILE}
}
#文件内容追加
append_line_into_file ()
{
    if [[ $# -lt 2 ]]; then
        return
    fi
    FILE=$1
    LINE=$2
    echo do
    echo $LINE >> $FILE
}
CONFIG=config_old
cp $CONFIG $CONFIG.old

## 网络设置
delete_line_with_special_word   $CONFIG  CONFIG_SUBSYSTEM_ETHERNET_PS7_ETHERNET_0_USE_DHCP
append_line_into_file           $CONFIG  "# CONFIG_SUBSYSTEM_ETHERNET_PS7_ETHERNET_0_USE_DHCP is not set"
append_line_into_file           $CONFIG  "CONFIG_SUBSYSTEM_ETHERNET_PS7_ETHERNET_0_IP_ADDRESS=\"$IPADDR\""
append_line_into_file           $CONFIG  "CONFIG_SUBSYSTEM_ETHERNET_PS7_ETHERNET_0_IP_NETMASK=\"255.255.255.0\""
append_line_into_file           $CONFIG  "CONFIG_SUBSYSTEM_ETHERNET_PS7_ETHERNET_0_IP_GATEWAY=\"$NET.1\""

## 本地包
delete_line_with_special_word   $CONFIG  CONFIG_YOCTO_NETWORK_SSTATE_FEEDS
append_line_into_file           $CONFIG  "# CONFIG_YOCTO_NETWORK_SSTATE_FEEDS is not set"
delete_line_with_special_word   $CONFIG  CONFIG_YOCTO_BB_NO_NETWORK
append_line_into_file           $CONFIG  "CONFIG_YOCTO_BB_NO_NETWORK=y"
delete_line_with_special_word   $CONFIG  CONFIG_PRE_MIRROR_URL
append_line_into_file           $CONFIG  "CONFIG_PRE_MIRROR_URL=\"file://${SSTATE_LOCAL_PATH}/downloads\""
delete_line_with_special_word   $CONFIG  CONFIG_YOCTO_LOCAL_SSTATE_FEEDS_URL
append_line_into_file           $CONFIG  "CONFIG_YOCTO_LOCAL_SSTATE_FEEDS_URL=\"${SSTATE_LOCAL_PATH}/arm\"" #zynq

        ## | 目录      | 平台        |
        ## | --------- | ----------- |
        ## | aarch64   | ZynqMP      |
        ## | arm       | Zynq        |
        ## | mb-full   | MB AXI      |
        ## | mb-lite   | MB AXI lite |
        ## | downloads | 全平台  |

## 免输入密码登陆
delete_line_with_special_word   $CONFIG  CONFIG_YOCTO_ENABLE_DEBUG_TWEAKS
append_line_into_file           $CONFIG  "CONFIG_YOCTO_ENABLE_DEBUG_TWEAKS=y"

复制PetaLinux工程

想保留 已经配置好的工程,但是又不想新建一个的时候,可以把老的工程的内容选择性地复制一份。

注意,不要直接拷贝整个目录,PetaLinux 构建工具不允许这么做。

##
#    Copyright By Schips, All Rights Reserved
#    https://gitee.com/schips/
#
#    File Name:  copy_petalinux_project.sh
#    Created  :  2020-07-25 11:28:24
#
##

#!/bin/sh

help () {
    echo "ERROR : Need arguments"
    echo " eg:"
    echo "     $0  petaProjectOld  petaProjectNew"
    exit
}

if [ -z "$1" ]; then
    help
fi

if [ -z "$2" ]; then
    help
fi

SOURCEDIR=$1
DESTDIR=$2

mv ${DESTDIR} /tmp/back 2>/dev/null -f
mkdir ${DESTDIR}/image/linux -p

cp -v ${SOURCEDIR}/project-spec ${SOURCEDIR}/.petalinux ${SOURCEDIR}/config.project ${DESTDIR} 
cp -v ${SOURCEDIR}/images/linux/*.bit ${DESTDIR}/image/linux

之后,内核、uboot的配置会被保存到our_config中。

PetaLinux本身的配置不会改变:使用petalinux-config会看到之前的配置。

恢复配置

配置会被保存在一个地方,因此,需要LOAD回来,要么使用这样的命令:

petalinux-config -c kernel 

在弹出的配置窗口中选择LOAD,指定之前配置保存的路径即可。

Uboot也是一样的,如果配置过了uboot,那么需要额外的LOAD操作。

petalinux-config -c u-boot

此后,直接petalinux-build即可。

posted @ 2020-09-28 09:03  schips  阅读(3659)  评论(2编辑  收藏  举报