ZYNQ平台运行linux系统app

目录

概述

1 虚拟机下安装CentOS\Ubuntu

​ 1.1 虚拟机下的网络设置

1.2 通过SecureCRT的SSH2服务远程登陆linux

2 常用的linux操作

2.1 常用shell命令

2.2 常用服务、应用安装

2.2.1 安装NFS

2.2.2 安装GCC编译器

2.3 代码编译和交叉编译

3  linux下安装vivado

4 ZYNQ运行linux准备

4.1 生成FSBL

4.2 编译Uboot

4.3 编译内核、设备树、文件系统

4.3.1内核编译

4.3.2 设备树编译

 4.3.3 文件系统

4.4 创建SD卡文件系统

5 ARM linux运行app

5.1 运行helloworld

5.2 控制GPIO点亮LED

5.2.1 sysfs 方式控制 GPIO

5.2.2 C语言app控制

6 其它

6.1 RAMdisk根文件系统,用于过渡到文件系统

6.2 注意的问题:


概述

     linux系统体积小,可裁剪,硬件需求可很小,适合在嵌入式平台运行。可在x86,arm运行,在x86主机上交叉编译生成可在arm运行的可执行程序。

    不像windows系统的大部分功能已经做好,学习linux能更好理解操作系统的运行结构。可以无GUI图形界面运行,通过远程的SecureCRT的SSH2协议由网络登陆到系统。

    所有东西都是文件,没有格式之分。安装软件、服务需要联网到软件源,如网易的163源、阿里云源。服务应用:nfs网络文件系统、vim编辑器、gcc代码编译器。

    服务器一般用CentOS不关机;个人桌面用Ubuntu,资料多,更新快。

    CentOS学习视频如下,配套文字教程《Linux 运维入门到高级全套系列》,有基本操作的介绍,也有详细的各种服务的安装使用、维护。CentOS与Ubuntu的安装命令不同,分别为yum和apt-get。

2020年linux入门到精通全套【完整版】_哔哩哔哩_bilibili

1 虚拟机下安装CentOS\Ubuntu

CSDN上有大量的安装教程可以参考,也可以参考视频教程中的内容。

超详细的linux虚拟机安装教程_鹧鸪鹄的博客-CSDN博客_linux虚拟机安装

VMware16的安装及VMware配置Linux虚拟机(详解版)_殇何故的博客-CSDN博客_vmware16安装linux

1.1 虚拟机下的网络设置

 DHCP服务器:负责动态分发IP地址。DNS服务器:解析域名与IP对应关系。

虚拟机可通过USB WIFI独立联网,需将虚拟机网络设置为仅主机模式,在Ubuntu kylin16.4LTS上测试系统已有芯片mt7601的驱动,可直接搜索到WIFI。

Ubuntu16.04 使用小米WiFi 变无线网卡_书生落拓的博客-CSDN博客

Ubuntu18.04 安装360 WIFI驱动 - cy_07 - 博客园

 Ctrl+Alt退出虚拟机的鼠标控制。

1.2 通过SecureCRT的SSH2服务远程登陆linux

   通过SecureCRT软件模拟客户端,登陆linux系统进行命令操作。注意:CentOS的root用户有独立密码;Ubuntu的root用户默认没有密码,需要先用普通用户登陆再sudo su进入root,不然SecureCRT会一直密码报错。

教程很多,一篇如下:

​​​​​​(Second assignment)SecureCRT支持通过SSH方式实现远程登录_bicheno的博客-CSDN博客_securecrt ssh登录

2 常用的linux操作

linux系统的基本文件结构如下:

2.1 常用shell命令

windows的IP查询:ipconfig,Linux的IP查询ifconfig。使用Tab可以自动补全文件、文件夹名字。

可以把大量shell写入一个shell脚本文件中,提供给linux批量执行。同时也类似于vivado的脚本自定义编译步骤。

Linux shell编程(一):基本命令行_万俟淋曦的进击手记-CSDN博客

10分钟让你掌握Linux常用命令(+1万+++收藏)_lydms的博客-CSDN博客_linux常用命令

【Linux】linux常用基本命令_小怪孩的成长之路-CSDN博客_linux常用命令

cd:进入目录

ls:查看当前目录

ll:查看当前目录,同时显示权限类型、时间、文件/文件夹

cat:读取显示文件

vi:打开一个文件,没有时新建一个

touch:新建文件;mkdir:新建文件夹

ifconfig:查询网络信息

apt-get:Ubuntu下安装服务

shell:批量执行shell文件中的命令行,类似tcl脚本、makefile等

mv:移动、重命名文件、文件夹

cp:复制文件、文件夹

rm -rf:删除文件夹

df -h:查看磁盘信息 

showemount -e 显示当前挂载目录。需要在etc/exports文件中设置后才能看到。

chmod 777 设置读/写/运行权限,每个权限有一个有个数字表示,加起来代表几种。

centos下切换GUI模式命令:“init 3” 命令模式,init 5 桌面模式。Ubuntu好像不支持。

CentOS计入root用户:su root,再输入root用户的密码。Ubuntu默认root用户没有密码,sudo su用用户密码进入root。

vi 打开文件后,esc退出编辑模式,末尾:wq保存,:q!强制退出不保存。

tar -zxvf   xxx.tar.gz    解压文件,tar xxx 压缩文件

2.2 常用服务、应用安装

一般情况下需要联网安装各种服务,设置软件包下载源,国内可选阿里云,163等。

2.2.1 安装NFS

        网络文件系统,通过网络共享文件夹,可以传输文件。比如在电脑的linux上装服务端server,在开发板linux装客户端common客户端挂载服务端的共享目录后可以把电脑上交叉编译好的应用通过网络传到开发板,不用来回拔插SD卡。网站有很多教程,不再详述。

sudo apt-get install nfs-kernel-server # 安装 NFS服务器端

sudo apt-get install nfs-common # 安装 NFS客户端

Linux 环境下 NFS 服务安装及配置使用_哎_小羊的博客-CSDN博客_linux nfs 配置

Ubuntu 下搭建 NFS 服务_心驰所往的博客-CSDN博客_nfs ubuntu

1)Ubuntu手动设置IP

(1) ifconfig查询网卡;  

(2) 打开文件 sudo vim /etc/network/interfaces   //此路径与CentOS不同
注释auto lo和iface lo inet loopback两段代码添加以下代码

auto eth0
iface eth0 inet static
address 192.168.1.xxx   #ip地址
netmask 255.255.255.0  #子网掩码
gateway 192.168.1.1    #网关
dns-nameserver 114.114.114.114   #dns服务器,局域网内也可不加
:wq保存退出

(3) 重启网络:sudo /etc/init.d/networking restart

2)CentOS设置静态网络IP地址等:linux 网络配置 (配置/etc/sysconfig/network-scripts/ifcfg-ethx) - 骚年丶勿忘初心。 - 博客园

 vi /etc/sysconfig/network-scripts/ifcfg-eth0

3)设置NFS共享目录 sudo vim /etc/exports 打开文件,增加 /nfsroot *(rw,sync,no_root_squash) ,*位置可指定能被哪些IP挂载。安装完成后启动nfs服务。chmod修改目录的权限,并在客户端挂载服务端的共享目录,主机IP地址。

mount -t nfs 192.168.12.123:/nfsroot /mnt

关机时会自动解除挂载,也可以用命令umount(解除挂载)。

尝试离线安装NFS未成功,该方法时i386平台,提示不适合armhf

2.2.2 安装GCC编译器

用于编译linux下的代码,GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 FortranJavaAdaGo语言前端。

apt install gcc

2.3 代码编译和交叉编译

1)X86编译运行

vi新建C文件(或touch新建,vi打开),编译代码,在X86上编译X86运行的文件。

#include <stdio.h>
int main()
{
	printf("I am bryan's UbuntuOS!\n");
	return 0;
}

gcc aa.c -o aa.out //不加-o时默认生成a.out文件,-o指定编译结果的名字。

./a.out  //执行编译结果

文件嵌套编译举例:

代码嵌套编译:可以分开两次,也可一次完成。分两次-c 生成汇编后的中间文件.o,再对两个.o执行一次链接生成可执行。

 直接一次编译两个.c生成最终的链接文件。

2)x86-ARM交叉编译: 

是指在X86平台编译出在ARM平台运行的文件,因为ARM平台本身资源有限可能不能运行编译环境。交叉编译的结果必须保存为.out后缀,否则在开发板的linux系统不能正确执行。交叉编译工具由Xilinx提供。

source /opt/Xilinx/SDK/2014.4/settings64.sh //定位到Vivado的交叉编译环境,shell内是路径
arm-xilinx-linux-gnueabi-gcc aa.c -o aa.out -static //

在执行多个C文件嵌套编译时,需要编写Makefile文件完成批量编译。

3  linux下安装vivado

安装vivado是为了获取xilinx的交叉编译器,若能单独获取则可不安装。

1)首先下载到Vivado的linux版本,新版本中windows和linux版本在同一个安装包中;

2)将包和licence拷贝进虚拟机下的linux中解压;

tar zxvf Xilinx_Vivado_SDK_2014.4_1119_1.tar.gz

3)运行安装目录下的shell脚本xsetup.sh,可以查看文件内容。xsetup.exe是windows下的安装执行程序,看不到内部信息。

./xsetup  //在终端中cd进入安装包目录,执行xilinx提供的安装脚本,后面跳出GUI操作

支持的芯片只选7000,勾选SDK软件,导入许可。

4)安装32位支持工具包。

 apt-get install lib32z1 lib32ncurses5 libbz2-1.0:i386 lib32stdc++6

 几个包可以用一个安装命令,也可以分开安装,Y继续安装。错误时按提示修改,可能需版本适配。

4 ZYNQ运行linux准备

4.1 生成FSBL

1) 在vivado完整工程编译生成.bit;

2) 导出平台文件 File->Export->Export Hardware...,包含bitstram 文件;

3) 生成 fsbl.elf 。File->Launch SDK,File -> New -> Application Project ,在SDK中新建FSBL工程,Hardware Platform选择刚导出的.hdf平台文件,standalone,选择默认的Zynq FSBL工程即可;在 fsbl_debug.h 文件里添加定义“FSBL_DEBUG_INFO”常量,启动时串口可打印出 Bootloader 信息。编译生成 fsbl.elf 文件。

附:生成BOOT.bin方法,Xilinx Tools->Create Boot Image。fsbl.elf 是Xilinx的bootloader,与.bit文件和u-boot.elf一起生成linux系统的Boot.bin文件。也可以把fsbl.elf +.bit + 裸跑应用.elf 一起生成用于ARM裸跑的Boot.bin。可以烧写进FLASH中启动,也可以拷贝进SD卡中启动。Xilinx Tools->Program Flash。

4.2 编译Uboot

u-boot 是德国 DENX 开发,用于多种嵌入式 CPU 的 bootloader 程序。不仅支持嵌入式 Linux 系统的引导,还支持VXworks,QNX等系统;不仅支持ARM架构,还支持MIPS、 x86、PowerPC等。

1)下载u-boot 。此处使用黑金提供的版本。

2)将u-boot拷贝进虚拟机下的ubuntu中,解压。arch 文件夹下的arm 子目录是 Zynq-7000 SOC使用的 CPU 架构目录;

3)u-boot 工作模式有启动加载模式和下载模式。启动加载是 Bootloader 的正常工作模式,将嵌入式操作系统从 FLASH 中加载到 SDRAM 中运行。u-boot 启动内核的过程可以分为两个阶段:

第一阶段对应的文件是/arch/arm/cpu/armv7 目录下的 start.S 和 lowlevel_init.S 文件。
第二阶段对应的文件是 common/board_r.c。

4)编译U-boot

安装设备树编译工具 apt-get install device-tree-compiler , 安装u-boot工具 apt-get install u-boot-tools

source /opt/Xilinx/SDK/2014.4/settings64.sh //定位到交叉编译器
进入 u-boot-xlnx-master 文件夹,make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_ax7020_defconfig生成 Makefile ,通过make命令,把defconfig参数传递给Makefile中的预留参数,程序就可以顺利编译下去了。

make CROSS_COMPILE=arm-xilinx-linux-gnueabi- , 自动编译 u-boot。根目录下生成 u-boot.elf文件用于制作BOOT.bin。
arm-xilinx-linux-gnueabi-objdump -h u-boot 查看 u-boot 文件的不同段的内存分配。

 Source 定位交叉工具链  (执行脚本,确定路径path)

 说明:编译uboot分两步,先make (config文件)生成makefile(内有编译的执行顺序,重复,类似shell脚本),再次执行make 正式开始编译。(需要通过文件的形式约定好编译的文件、顺序、链接等,类似viviado用脚本生成工程文件。在windows系统中IDE已经设置好了编译方式)

关于makefile:

在Linux下,用Make 命令来编译程序,CROSS_COMPILE=给出了编译程序所用的交叉工具链的名称,比如:
CROSS_COMPILE=arm-xilinx-linux-gnueabi-表示交叉编译器的gcc为arm-xilinx-linux-gnueabi-gcc。ARCH=arm ARCH给出了目标处理器的架构这里用的是arm 处理器。

make工具:可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。cmake可以简单的生成makefile文件给上面那个make编译用。

注意:Uboot中的设备树没有PL信息,kernel中的设备树有PL信息且地址要与vivado工程对应。

4.3 编译内核、设备树、文件系统

4.3.1内核编译

Linux 内核是一个 Linux 操作系统的核心。

1)下载内核,把kernel.tar.gz文件拷贝到虚拟机Ubuntu下,解压tar zxvf kernel.tar.gz

2)cd kernel\linux  ,source /opt/Xilinx/SDK/2014.4/settings64.sh //定位刡交叉编译器
3)make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi uImage LOADADDR=0x00008000",编译内核文件

4)编译完成后在/arch/arm/boot 目录下产生 uImage 二进制文件。与BOOT.bin一起放置在SD卡FAT分区中。

4.3.2 设备树编译

有两个设备树:U-boot中有设备树是最基本的底层设备,内核中设备树是增加的外设。

设备树的描述在.dts 文件(device tree source)里,它是一种 ASCII 文本格式。在 ARM Linux 中,一个.dts 文件对应一个 ARM
 machine,一般放置在内核的 arch/arm/boot/dts/目录。需要根据具体设备做更改,可冗余。

需要编译生成.dtb 格式的设备树文件,放在SD卡的FAT分区中。

1)cd kernel\linux  ,执行  ./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb ./arch/arm/boot/dts/AX7020.dts  ,在当前linux目录下生成devicetree.dtb 文件。此处使用的编译工具是内核自带的dtc编译器。-I dts输入文件格式.dts, -O dtb输出文件格式dtb。

 

 4.3.3 文件系统

    内核启动后需要挂载文件系统才能正常启动,文件系统的结构与主机上的桌面版类似。

ZYNQ7000 开収平台支持三种类型文件系统:
1) ubuntu 文件系统, 黑金实验中使用的文件系统为:linaro-precise-ubuntu-desktop-20121124-560.tar.gz
2) 基于 RAM 的文件系统 ramdisk8M.image.gz
3) 基于NFS 的网络文件系统 (方便调试,主机文件传到开发板)。

文件系统使用: 直接解压后,把binary/boot/filesystem.dir 下所有文件复制到SD的EXT4分区使用。

4.4 创建SD卡文件系统

1)需要USB-Micro SD卡转换器,直接用MicroSD大适配器不能识别。在主机中搜索disk,创建分区。

 2)在windows中把SDK创建的BOOT.bin;虚拟机Linux中 内核镜像 ./kernel/linux/arch/arm/boot 下uImage,./kernel/linux/的devicetree.dtb等三个文件拷入FAT分区。windows只能识别FAT格式。

 .bit和uboot.elf在合成BOOT.bin时为datafile,fsbl.elf选择bootloader。

 3)ubuntu文件系统放入EXT4分区中

 ubuntu 文件系统拷贝进SD卡的EXT分区中解压,ar zxvf linaro-precise-ubuntu-desktop-20121124-560.tar.gz,生成binary文件夹,需要的文件系统文件在binary/boot/filesystem.dir,cd 进入该目录把所有文件复制到EXT的根目录下,sync -av ./ /media/bryan/EXT。

注意:SD卡的路径在 /media/bryan/EXT;

FAT:存放Uboot,内核镜像uImage, 设备树devicetree.dbt;

EXT:文件系统结构类似于电脑上的linux;

注意:在ZYNQ的linux上直接vim时操作奇怪,命令模式。

5 ARM linux运行app

把黑金工程的led最后一路管脚分配改为米尔7020核心板上LED灯D3,接在ZYNQ脚 R17。

开发板的调试信息通过UART1输出,可用SecureCRT的串行模式,115200速率,可在串口界面输入shell命令。

ping 主机IP,可CTRL+C/Z停止。

在开发板上安装NFS客户端:

sudo apt-get install nfs-kernel-server  安装NFS客户端;

mkdir nfs_server 创建共享目录;

sudo vim /etc/exports ,/home/alinx/Downloads/nfs_server *(rw,sync,no_root_squash) ,ESC,:wq保存 设置共享目录信息,*标识可被挂载的IP段;

/etc/init.d/nfs-kernel-server start"启动 nfs server。"showmount -e"命令可以查看 nfs server 路径。

sudo mount -t nfs localhost:/home/nfs_server  /mnt"       //挂在本机测试,localhost也可写主机IP。

取消 umount, 输入命令"sudo umount /mnt"。

5.1 运行helloworld

在主机共享目录下创建C文件,交叉编译生成app.out文件

source /opt/Xilinx/SDK/2014.4/settings64.sh
arm-xilinx-linux-gnueabi-gcc helloworld.c -o helloworld.out -static
此2文件同步到开发板上,串口调试终端上   ./helloworld.out运行可看到打印信息。

5.2 控制GPIO点亮LED

5.2.1 sysfs 方式控制 GPIO

内核把外设映射在/sys/class/目录下,gpio文件夹下为ZYNQ的所有GPIO,包括PS和PL端,系统并不区分。

在串口的终端输入ls /sys/class/gpio ,查看到GPIO管脚编号,图中gpiochip898是AXIGPIO模块管脚的起始地址,根据宽度编号累加。export通知系统需要导出控制的 GPIO 引脚;unexport通知系统取消导出


cat /sys/class/gpio/gpiochip898/label"查看 GPIO 控制器标签为/amba_pl/gpio_leds@41200000,对比内核设备树可确定哪个AXI-GPIO模块;
cat /sys/class/gpio/gpiochip898/ngpio   查看AXI-GPIO模块的位宽;

 echo -n 902 > /sys/class/gpio/export  导出米尔的LED控制脚,ls 再次查询,gpio文件夹下出现名为gpio902的文件夹,其下包含了等控制文件

echo out > /sys/class/gpio/gpio902/direction //向方向文件中写入 out
echo 1 > /sys/class/gpio/gpio902/value //向value中写入1或0控制IO电平翻转

echo命令可以执行写入文件操作,不必打开文件编写保存。cat命令查看是否写入成功。

5.2.2 C语言app控制

在主机共享目录下创建文件,C文件交叉编译 source /opt/Xilinx/SDK/2014.4/settings64.sh 定位交叉编译器,
arm-xilinx-linux-gnueabi-gcc gpio.c -o gpio.out -static 生成arm可执行out文件,在串口中断输入 ./gpio.out ,灯闪烁,ctrl+c停止运行。

程序内容:打开端口 gpio902, 设置方向为输出,在一个循环里输出1和0,间隔时间为 1 秒,可以看到核心板上灯D3闪烁。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
 
 
// The specific GPIO being used must be setup and replaced thru
// this code.  The GPIO of 901 is in the path of most the sys dirs
// and in the export write.
//
// Figuring out the exact GPIO was not totally obvious when there
// were multiple GPIOs in the system. One way to do is to go into
// the gpiochips in /sys/class/gpio and view the label as it should
// reflect the address of the GPIO in the system. The name of the
// the chip appears to be the 1st GPIO of the controller.
//
// The export causes the gpio901 dir to appear in /sys/class/gpio.
// Then the direction and value can be changed by writing to them.
 
// The performance of this is pretty good, using a nfs mount,
// running on open source linux, 
// the GPIO can be toggled about every 1sec.
// The following commands from the console setup the GPIO to be
// exported, set the direction of it to an output and write a 1
// to the GPIO.
//
// bash> echo 901 > /sys/class/gpio/export
// bash> echo out > /sys/class/gpio/gpio901/direction
// bash> echo 1 > /sys/class/gpio/gpio901/value
 
// if sysfs is not mounted on your system, the you need to mount it
// bash> mount -t sysfs sysfs /sys
 
// the following bash script to toggle the gpio is also handy for
// testing
//
// while [ 1 ]; do
//  echo 1 > /sys/class/gpio/gpio901/value
//  echo 0 > /sys/class/gpio/gpio901/value
// done
 
// to compile this, use the following command
// gcc gpio.c -o gpio
 
// The kernel needs the following configuration to make this work.
//
// CONFIG_GPIO_SYSFS=y
// CONFIG_SYSFS=y
// CONFIG_EXPERIMENTAL=y
// CONFIG_GPIO_XILINX=y
 
int main()
{
    int valuefd, exportfd, directionfd;
 
    printf("GPIO test running...\n");
 
    // The GPIO has to be exported to be able to see it
    // in sysfs
 
    exportfd = open("/sys/class/gpio/export", O_WRONLY);
    if (exportfd < 0)
    {
        printf("Cannot open GPIO to export it\n");
        exit(1);
    }
 
    write(exportfd, "901", 4);
    close(exportfd);
 
    printf("GPIO exported successfully\n");
 
    // Update the direction of the GPIO to be an output
 
    directionfd = open("/sys/class/gpio/gpio901/direction", O_RDWR);
    if (directionfd < 0)
    {
        printf("Cannot open GPIO direction it\n");
        exit(1);
    }
 
    write(directionfd, "out", 4);
    close(directionfd);
 
    printf("GPIO direction set as output successfully\n");
 
    // Get the GPIO value ready to be toggled
 
    valuefd = open("/sys/class/gpio/gpio901/value", O_RDWR);
    if (valuefd < 0)
    {
        printf("Cannot open GPIO value\n");
        exit(1);
    }
 
    printf("GPIO value opened, now toggling...\n");
 
    // toggle the GPIO as fast a possible forever, a control c is needed
    // to stop it
 
    while (1)
    {
        write(valuefd,"1", 2);
		sleep(1);
        write(valuefd,"0", 2);
		sleep(1);		
    }
}

6 其它

6.1 RAMdisk根文件系统,用于过渡到文件系统

  为了减少linux内核的大小,能够把一些外设驱动编译成内核模块,可是在启动ubuntu的时候,须要读取flash,可是此时flash的驱动模块存放在ubuntu文件系统中。为了解决这样的问题,能够使用ramdisk内存文件系统,将必备的驱动模块,好比这里的flash驱动模块放到ramdisk中,当uboot引导linux时,能够将ramdisk和内核镜像先加载到内存,启动内核时,会将ramdisk在内存中的内存地址传给内核。express

  当内核启动后,会先将ramdisk做为根文件系统,而后使用insmod加载flash驱动,就能够访问存放有ubuntu文件系统的块设备节点,最后再经过命令将根文件系统切换为ubuntu文件系统。

6.2 注意的问题:

1)在SecuCRT中输入命令过长时,需要反斜杠+enter换行继续输入。\ + Enter;

2)在开发板上用vi打开文件后,不能向主机上一样编译。删除当前光标用x键,处在命令模式;

vi的基本使用方法_zy010101博客-CSDN博客_vi使用方法

3)黑金的Uboot在米尔上运行时,

    (1)插入SD后报错 ,米尔的CD卡CD脚与黑金不对应,可在ZYNQ的配置GUI界面把CD脚关闭后正确;

    (2)加内核启动后循环报IIC设备timeout,根据地址定位到读取HDMI信息的IIC设备树,删除设备树文件中最后2行后不报错。米尔板子的HDMI有专用芯片驱动,没有IIC口。cdns-i2c e0005000.i2c: timeout waiting on completion

4)Xilinx提供的petalinux工具可用于linux的裁剪。Petalinux是Xilinx公司推出的嵌入式Linux开发套件,包括了Linux Kernel、u-boot、device-tree、rootfs等源码、库,以及Yocto recipes,可以让客户很方便的生成、配置、编译及自定义。

5)试验平台为黑金ZYNQ 7010/7020开发板,米尔ZYNQ7020开发板。

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值