當前位置:首頁 » 編程軟體 » zynqbuild編譯優化

zynqbuild編譯優化

發布時間: 2022-04-17 17:59:23

㈠ 沒硬體怎麼玩zynq7000

官網提供的可執行文件是基於64位linux的:zynq_linux.tar.gz.
對於32位的系統,需要自己編譯,解決方案如下:
1) 下載代碼:git clone git://git.xilinx.com/qemu-xarm.git
2) 配置工程:
cd qemu-xarm
./configure --target-list=arm-softmmu --disable-werror --disable-kvm
3) 編譯: make
4) 編譯結果:
[walt@zynq7k qemu-xarm]$ ls -l arm-softmmu/qemu-system-arm
-rwxrwxr-x. 1 walt walt 18428427 Nov 6 15:27 arm-softmmu/qemu-system-arm
5) 檢測環境是否OK,測試如下:
[walt@zynq7k qemu-xarm]$ ./arm-softmmu/qemu-system-arm -h
QEMU emulator version 1.0.50, Copyright (c) 2003-2008 Fabrice Bellard
usage: qemu-system-arm [options] [disk_image]
『disk_image』 is a raw hard disk image for IDE hard disk 0
Standard options:
-h or -help display this help and exit
-version display version information and exit
-machine [type=]name[,prop[=value][,...]]
selects emulated machine (-machine ? for list)
property accel=accel1[:accel2[:...]] selects accelerator
supported accelerators are kvm, xen, tcg (default: tcg)
-cpu cpu select CPU (-cpu ? for list)
…… ……
註: 若無法執行,請按http://wiki.xilinx.com/zynq-qemu提示安裝缺失的動態庫。
替換官方下載的壓縮包中的文件為新編譯的qemu-system-arm,測試執行如下:
[walt@zynq7k zynq_linux]# ./start_qemu.sh
ram size=40000000
error reading QSPI block device
error no mtd drive for nand flash
a0mpcore_priv: smp_priv_base f8f00000
error no sd drive for sdhci controller (0)
error no sd drive for sdhci controller (1)
Number of configured NICs 0×1
ram_size 40000000, board_id d32, loader_start 0
Uncompressing Linux… done, booting the kernel.
Booting Linux on physical CPU 0
Linux version 3.3.0-14.2-build1 (relman@xcobldal824) (gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-50) ) #1 SMP PREEMPT Thu Jul 12 09:04:32 MDT 2012
CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: Xilinx Zynq Platform, model: Xilinx Zynq ZC702
bootconsole [earlycon0] enabled
Memory policy: ECC disabled, Data cache writealloc
PERCPU: Embedded 7 pages/cpu @c190b000 s5696 r8192 d14784 u32768
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 255744
Kernel command line: console=ttyPS0,115200 root=/dev/ram rw initrd=0×800000,8M ip=:::::eth0:dhcp earlyprintk
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 240MB 768MB = 1008MB total
Memory: 1009280k/1009280k available, 39296k reserved, 270336K highmem
Virtual kernel memory layout:
vector : 0xffff0000 – 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 – 0xfffe0000 ( 896 kB)
vmalloc : 0xf0000000 – 0xff000000 ( 240 MB)
lowmem : 0xc0000000 – 0xef800000 ( 760 MB)
pkmap : 0xbfe00000 – 0xc0000000 ( 2 MB)
moles : 0xbf000000 – 0xbfe00000 ( 14 MB)
.text : 0xc0008000 – 0xc040bdb0 (4112 kB)
.init : 0xc040c000 – 0xc0430640 ( 146 kB)
.data : 0xc0432000 – 0xc045fd20 ( 184 kB)
.bss : 0xc045fd44 – 0xc0479f5c ( 105 kB)
Preemptible hierarchical RCU implementation.
Verbose stalled-CPUs detection is disabled.
NR_IRQS:128
xlnx,ps7-ttc-1.00.a #0 at 0xf0000000, irq=43
Console: colour mmy device 80×30
Calibrating delay loop… 147.35 BogoMIPS (lpj=736768)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
smp_twd: clock not found: -2
Calibrating local timer… 84.48MHz.
hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 1 counters available
Setting up static identity map for 0x2f3000 – 0x2f3034
CPU1: Booted secondary processor
CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
Brought up 2 CPUs
SMP: Total of 2 processors activated (271.66 BogoMIPS).
devtmpfs: initialized
NET: Registered protocol family 16
L2x0 series cache controller enabled
l2x0: 8 ways, CACHE_ID 0×00000000, AUX_CTRL 0×72060000, Cache size: 524288 B
registering platform device 『pl330′ id 0
registering platform device 『arm-pmu』 id 0
hw-breakpoint: debug architecture 0×0 unsupported.
xslcr xslcr.0: at 0xF8000000 mapped to 0xF0008000
bio: create slab at 0
gpiochip_add: registered GPIOs 0 to 245 on device: xgpiops
xgpiops e000a000.gpio: gpio at 0xe000a000 mapped to 0xf000a000
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Switching to clocksource xttcpss_timer1
NET: Registered protocol family 2
IP route cache hash table entries: 32768 (order: 5, 131072 bytes)
TCP established hash table entries: 131072 (order: 8, 1048576 bytes)
TCP bind hash table entries: 65536 (order: 7, 786432 bytes)
TCP: Hash tables configured (established 131072 bind 65536)
TCP reno registered
UDP hash table entries: 512 (order: 2, 16384 bytes)
UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport mole.
RPC: Registered udp transport mole.
RPC: Registered tcp transport mole.
RPC: Registered tcp NFSv4.1 backchannel transport mole.
Trying to unpack rootfs image as initramfs…
rootfs image is not initramfs (junk in compressed archive); looks like an initrd
Freeing initrd memory: 8192K
xscugtimer xscugtimer.0: ioremap fe00c200 to f000c200 with size 400
pl330 dev 0 probe success
highmem bounce pool size: 64 pages
JFFS2 version 2.2. (NAND) (SUMMARY) © 2001-2006 Red Hat, Inc.
msgmni has been set to 1459
io scheler noop registered
io scheler deadline registered
io scheler cfq registered (default)
e0001000.uart: ttyPS0 at MMIO 0xe0001000 (irq = 82) is a xuartps
console [ttyPS0] enabled, bootconsole disabled
console [ttyPS0] enabled, bootconsole disabled
e0000000.uart: ttyPS1 at MMIO 0xe0000000 (irq = 59) is a xuartps
xdevcfg f8007000.devcfg: ioremap f8007000 to f0060000 with size 100
brd: mole loaded
loop: mole loaded
GEM: BASEADDRESS hw: e000b000 virt: f0062000
XEMACPS mii bus: probed
xemacps e000b000.eth: invalid address, use assigned
MAC updated d2:c4:43:31:6b:d0
eth0, pdev->id -1, baseaddr 0xe000b000, irq 54
ehci_hcd: USB 2.0 『Enhanced』 Host Controller (EHCI) Driver
xusbps-ehci xusbps-ehci.0: Xilinx PS USB EHCI Host Controller
xusbps-ehci xusbps-ehci.0: new USB bus registered, assigned bus number 1
xusbps-ehci xusbps-ehci.0: irq 53, io mem 0×00000000
xusbps-ehci xusbps-ehci.0: USB 2.0 started, EHCI 0.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 0 ports detected
Initializing USB Mass Storage driver…
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
Xilinx PS USB Device Controller driver (Apr 01, 2011)
mousedev: PS/2 mouse device common for all mice
i2c /dev entries driver
Linux video capture interface: v2.00
gspca_main: v2.14.0 registered
uvcvideo: Unable to create debugfs directory
usbcore: registered new interface driver uvcvideo
USB Video Class driver (1.1.1)
WDT OF probe
xwdtps f8005000.swdt: Xilinx Watchdog Timer at 0xf0066000 with timeout 10 seconds
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using ADMA
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP cubic registered
NET: Registered protocol family 17
VFP support v0.3: implementor 41 architecture 3 part 40 variant 0 rev 0
Registering SWP/SWPB emulation handler
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
GEM: lp->tx_bd ffdfb000 lp->tx_bd_dma 2f2b2000 lp->tx_skb ee9199c0
GEM: lp->rx_bd ffdfc000 lp->rx_bd_dma 2f2b1000 lp->rx_skb ee9198c0
GEM: MAC 0x3143c4d2, 0x0000d06b, d2:c4:43:31:6b:d0
GEM: phydev ee90ec00, phydev->phy_id 0x1410cc2, phydev->addr 0×17
eth0, phy_addr 0×17, phy_id 0x01410cc2
eth0, attach [Marvell 88E1111] phy driver
Sending DHCP requests ., OK
IP-Config: Got DHCP answer from 10.0.2.2, my address is 10.0.2.15
IP-Config: Complete:
device=eth0, addr=10.0.2.15, mask=255.255.255.0, gw=10.0.2.2,
host=10.0.2.15, domain=, nis-domain=(none),
bootserver=10.0.2.2, rootserver=10.0.2.2, rootpath=
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 8192KiB [1 disk] into ram disk… done.
VFS: Mounted root (ext2 filesystem) on device 1:0.
devtmpfs: mounted
Freeing init memory: 144K
Starting rcS…
++ Mounting filesystem
++ Setting up mdev
eth0: link up (1000/FULL)
++ Starting telnet daemon
++ Starting http daemon
++ Starting ftp daemon
++ Starting dropbear (ssh) daemon
rcS Complete
zynq> uname -v
#1 SMP PREEMPT Thu Jul 12 09:04:32 MDT 2012
zynq> df
Filesystem 1K-blocks Used Available Use% Mounted on
none 508808 0 508808 0% /tmp
zynq>

㈡ 如何評估zynq7000的功耗

Zynq系列是賽靈思公司(Xilinx)推出的行業第一個可擴展處理平台,旨在為視頻監視、汽車駕駛員輔助以及工廠自動化等高端嵌入式應用提供所需的處理與計算性能水平。該系列四款新型器件得到了工具和IP 提供商生態系統的支持,將完整的 ARM® Cortex™-A9 MPCore 處理器片上系統 (SoC) 與 28nm 低功耗可編程邏輯緊密集成在一起,可以幫助系統架構師和嵌入式軟體開發人員擴展、定製、優化系統,並實現系統級的差異化。
實際上,Zynq就是兩大功能塊:雙核Arm的SoC和FPGA。根據Xilinx提供的手冊,PS: 處理系統 (Processing System) , 就是與FPGA無關的ARM的SOC的部分。PL: 可編程邏輯 (Progarmmable Logic), 就是FPGA部分。這有點像xilinx以前推出的powerPC+FPGA平台。下圖為官方文檔中介紹的ZYNQ內部結構。

從圖中可以看到,ZYNQ的絕大多數外設都是PL邏輯部分相連,比如說GPIO,IIS,XADC等等,所以如果我們要使用這些外設的話必須在PL邏輯部分對其進行配置。OK,下面我們就以一個簡單的例子來看看如何使用PL和PS進行交互。在下面的例子中,我們通過設置8個開關來對應點亮8個LED燈。
首先打開XPS,由於XILINX內部已經幫我們做好了GPIO部分的IP核,所以我們只需要直接使用即可(如果要用自己的ip核,則可以使用ISE先把IP核寫好再導入進來)。新建立一個工程,選擇「Create New Project Using Base System Builder」,

填好項目工程文件的路徑,其它不需要更改,直接點OK
由於我們用的就是ZEDBOARD,所以在這里我們選擇的是ZYNQ開發板,直接點擊NEXT,

該界面表示當前工程里已經默認把GPIO和4位的led包含進去了,由於我們這里和光放的ZYNQ開發板還有點差別,所以就不需要這些默認設置了,直接選中點擊REMOVE,最後點擊FINISH完成工程的建立。

雙擊圖中所示的AXI General Purpose IO,添加該IP核到ZYNQ中,注意在Width中選擇8,表示當前的GPIO的寬度為8,當然如果你需要更寬也可以進行其它設置,但最多不能超過32 位。我們這里的SW開關和LED都為8個,所以我們把寬度設置為8.一路點擊OK按鈕,把該IP核加入到工程中。

由於我們有SW開關和LED兩個外設並且一個為輸入一個為輸出,所以還需要按照同樣的方法再添加一個GPIO核。完成添加後看右邊的BUS INTERFACES,可以看到GPIO 0和GPIO1均添加到了系統中。


點擊PORT欄,進入到埠設置部分,在這里我們把一個GPIO設置為輸出,它與8個LED燈相連,另外一個設置為輸入,它與8個SW開關相連。完成設置後的結果如下圖所示

下面就是編輯約束文件,給定義的埠分配管腳了,

雙擊project欄中的UCF,打開約束編輯(在這里有個問題,難道ISE14.2中沒有專門的約束編輯器嗎?),輸入以下內容

上面表示8個LED等,下面表示8個SW按鍵,注意,在DS中,8個SW按鍵是連接到VCC_ADJ上的,所以我們這里使用LVCMOS18電平標准。完成這些設置後,依次點擊Generate BitStream和Export Design按鈕,完成流配置文件的生成和導出到SDK中。


上面就是PL部分的配置了,下面我們就根據PL的配置來進行PS部分的編程。打開SDK工具,新建工程(具體如何新建可以參考ZedBoard_CTT_v14.1文檔,該文檔在ZEDBOARD.org網站上有下載)後更改其中的main函數為以下形式

點擊編譯,成功生成ELF文件後即可進行下載,當然在下載ELF文件前還要先把FPGA的配置下載進去。
總結一下,zynq雖然是一個新的東西,但它的基本開發流程和開發原理和xilinx以往的產品基本一樣,ISE,XPS,SDK等等的使用方法也基本相同,所不同的是,ZYNQ系列中包含了兩個ARM核,極大的提高了系統的性能。

㈢ 如何利用Zynq-7000的PL和PS進行交互

在Zynq-7000上編程PL大致有3種方法:
1. 用FSBL,將bitstream集成到boot.bin中
2. 用U-BOOT命令
3. 在Linux下用xdevcfg驅動。

步驟:
1. 去掉bitstream的文件頭

用FSBL燒寫PL Images沒有什麼好說的,用Xilinx SDK的Create Boot Image工具即可完成,不再贅述。用後兩種方法需要把bitstream文件的文件頭用bootgen工具去掉。

一個典型的bif文件如下所示:
the_ROM_image:
{
[bootloader]<fsbl_name>.elf
<pl_bitstream_name>.bit
<u-boot_name>.elf
}
bif文件可以用文本編輯器寫,也可以用Xilinx SDK的Create Boot Image工具生成。然後在命令行下用以下命令即可去掉bitstream文件的文件頭。
bootgen -image <bootimage>.bif -split bin -o i BOOT.BIN
"-split」參數可以生成以下文件:
<pl_bitstream_name>.bit.bin

2. 在U-BOOT下燒寫PL Image
命令」fpga load」和」fpga loadb」都可以。區別是前一個命令接受去掉了文件頭的bitstream文件,後一個命令接受含有文件頭的bitstream文件。

在OSL 2014.2上,預設編譯就可以完整支持寫入PL Image的功能。但是在Petalinux 2013.10下,盡管可以在U-BOOT下看到命令」fpga」,還需要在文件
<PROJ>/subsystems/linux/configs/u-boot/platform-top.h 中增加以下內容後重新編譯才可以支持具體的功能。

/* Enable the PL to be downloaded */
#define CONFIG_FPGA
#define CONFIG_FPGA_XILINX
#define CONFIG_FPGA_ZYNQPL
#define CONFIG_CMD_FPGA
#define CONFIG_FPGA_LOADFS

在OSL 2014.2 U-BOOT中,具體的功能是在zynqpl.c的zynq_load()中實現的。

3. 在Linux下燒寫PL Image
OSL Linux 2014.2.01中已經含有xdevcfg驅動了(之前就有,不過本文是在這個版本上驗證的),直接用以下命令就可以完成PL Image寫入。
cat <path_to_storage_media>/<pl_bitstream_name>.bit.bin > /dev/xdevcfg

Linux驅動的源代碼在xilinx_devcfg.c中。因為驅動的編號是通過alloc_chrdev_region()動態分配的,所以不需要手工用mknod命令手動建立設備節點。

在Linux驅動中,每次往DevCfg中寫入4096位元組,直到全部寫完。

4. 在用戶程序中燒寫PL Image

目前沒有現成的源碼來完成這個功能,不過可以用mmap()把DevCfg的寄存器映射到用戶程序的虛地址中,然後參考一些現成的軟體代碼來完成這個功能:
* FSBL中的pcap.c
* U-BOOT中的zynqpl.c
* Linux中的xilinx_devcfg.c
* Xilinx SDK中的例子。例子位於以下位置,隨SDK的版本會有變化。
C:\Xilinx\SDK\2014.1\data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\index.html

小結:
DevCfg外設內部有自己的DMA,只需要簡單的配置PL Image的基地址和長度到DevCfg寄存器,就可以完成Zynq-7000 PL Image的載入。Xilinx已經提供了靈活的解決方案,如果開發者要把這個功能集成在自己的應用程序中,也有很多的代碼可以參考,並不是很困難的任務。

熱點內容
家用伺服器怎麼選 發布:2024-03-29 00:49:18 瀏覽:400
Ap6510dn如何配置 發布:2024-03-29 00:38:47 瀏覽:332
安卓和蘋果哪個更佔用內存 發布:2024-03-29 00:37:02 瀏覽:423
編譯錯誤算bug嗎 發布:2024-03-29 00:23:03 瀏覽:33
c語言干什麼 發布:2024-03-29 00:05:35 瀏覽:314
香港中轉伺服器搭建 發布:2024-03-29 00:05:16 瀏覽:673
安卓手機怎麼在桌面上顯示鍾表 發布:2024-03-28 23:48:22 瀏覽:5
分析代碼能編譯嗎 發布:2024-03-28 23:48:16 瀏覽:767
c語言與易語言 發布:2024-03-28 23:46:25 瀏覽:588
ai壓縮腳本 發布:2024-03-28 23:41:10 瀏覽:988