Embedded

zynq 嵌入式开发总结

传统开发步骤 基础设计 # 使用Vidado 设计硬件工程,导出硬件设计 bitstream. $ File-> Export-> Export Hardware... # 使用SDK 生成 fsbl.elf # 编译U-boot $ make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_ac7020_defconfig # 使用SDK, Xilinx Tools->Create Boot Image 生成BOOT.BIN。 即: fsbl.elf + system_wrapper.bit + u-boot.elf 编译kernel $ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage LOADADDR=0x00008000 # 生成 /arch/arm/boot/uImage 编译device tree $ dtc -I dts -O dtb devicetree.dtb ./arch/arm/boot/dts/AC7020.dts 制作文件系统 $ 基于RAM 的 ramdisk $ 基于Flash 的 jffs2 $ 基于network 的 NFS 将 BOOT.bin, devicetree.dtb, uImage 拷贝至SD卡的FAT 分区。文件系统拷贝至ext 分区即可。

编译PYNQ 在ZCU102上的镜像

由于PYNQ官方没有编译好的ZCU102的镜像,所以需要自己手动编译。这里记录一下编译过程。 因为手头上的ZCU102 批次比较新,所以目前只能使用2018.3 版本的SDK才能BOOT起来。(应该是由于换了DDR型号了,所以老版本的镜像是BOOT不起来的。板子版本是REVISION 1.1的 新批号) PYNQ 版本Xilinx Tool 版本对应 Release version Xilinx Tool Version v1.4 2015.4 v2.0 2016.1 v2.1 2017.4 v2.2 2017.4 v2.3 2018.2 v2.4 2018.3 参考: https://blog.csdn.net/vacajk/article/details/84728062 https://github.com/Xilinx/PYNQ/tree/image_v2.4/sdbuild https://pynq.readthedocs.io/en/latest/pynq_sd_card.html#pynq-sd-card 准备工作 使用事先编译好的文件系统: bionic.aarch64.2.4.img ZCU102 BSP: xilinx-zcu102-v2018.3-final.bsp 如果非官方板子,比如黑金的AC7020, 没有BSP, 则可以从vivado 工程导出hdf 文件,给petalinux 生成一个bsp 安装好SDSoc2018.3, PetaLinux2018.3 系统环境 Ubuntu 1604-64 编译步骤 \# 下载 pynq $ git clone https://github.com/Xilinx/PYNQ.git $ cd PYNQ $ git checkout image\_v2.4 # 检查依赖环境,qemu,crosstool-ng $ cd .

ARM NEON Usage Note

简介 SIMD, 即Single Instruction Multiple Data(单指令多数据)的并行操作。CPU 在处理向量数据时有它的局限性。CPU的优势在于处理复杂多变的指令,而对于那种大数据量的重复性操作,ARM 为了增加处理效率,增加了这种并行处理模块, 即NEON(Advanced SIMD)。主要是在ARMv7 架构后的处理器使用。 NEON 的主要 components: NEON register file NEON integer execute pipeline NEON single-precision floating-point execute pipeline NEON load/store and permute pipeline NEON 指令和 floating-point 指令使用的是相同的 register file。不同于ARM core的register file。此 register file 可以以 32-bit, 64-bit, 128-bit 方式访问。 The contents of the NEON registers are vectors of elements of the same data type. A vector is divided into lanes and each lane contains a data value called an element.

YUV 图像格式

Y:亮度分量 UV:色度分量 Y与RGB的演算关系为:Y = 0.2126 R + 0.7152 G + 0.0722 B YUV4:2:2或4:2:0都是指的Y分量和UV分量在一个像素点中占有的平均比例。 YUV422:水平方向上的UV分量减半了 YUV420:水平垂直方向都会减半 YUV 4:4:4采样,每一个Y对应一组UV分量。 eg: YUVYUV YUV 4:2:2采样,每两个Y共用一组UV分量。 eg: YUYVYUYV YUV 4:2:0采样,每四个Y共用一组UV分量。 eg: YUYVYUYV YYYY  以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。

嵌入式linux 开发中常用工具安装笔记

Samba server  \# apt install samba samba-common # vim /etc/samba/smb.conf 添加: security = user \[shuji\] comment = share dir path = /srv/samba browseable = yes writable = yes # useradd public (不要用adduser, 否则还要禁用shell) # smbpasswd –a public # service smbd restart Samba client smbclient -L //192.168.1.10 -U dev smbclient //192.168.1.10 -U dev   nfs \# vim /etc/exports /srv/nfs *(rw,sync,nosubtree_check)

petalinux use guide summarize

petalinux 是针对 Xilinx FPGA-based SOC designs 的 embedded linux system development kit 。 包含了: Yocto Extensible SDK Minimal downloads XSCT and tool chains PetaLinux CLI tools 详情参考 PetaLinux Tools Reference Guide。 **版本: v2018.2 June 6, 2018 ** 不支持 ubuntu1804, 手贱装了ubuntu1804, 结果 build 的时候出现 Bitbake 运行不起来,google 一遍发现这版本petalinux 还是暂时不支持 ubuntu1804 ,遂重新装回1604. 总结: petalinux 安装, 略。 BSP 安装 BSP 是petalinux 的一个参考开发板的基础配置。可以把它作为一个模板创建自己的工程。它提供 了一个 installable BSP files,包含了所有必要的 design 和 configuration files ,pre-built 和 tested hardwrae 和 software images.

recent new tech need to analysis and learn

reverse ssh tunnel nohup ssh -NfR 2222:localhost:22 root@106.12.13.xxx -p22 expect script strip command Some useful line editing key bindings provided by the Readline library: Ctrl-A: go to the beginning of line Ctrl-E: go to the end of line Alt-B: skip one word backward Alt-F: skip one word forward Ctrl-U: delete to the beginning of line Ctrl-K: delete to the end of line Alt-D: delete to the end of word https://askubuntu.

gdb 简记

常用命令如下:(详情可以用 help 命令查看) r (run, restart) s (step into) n (next state, step over) finish (step out) q (quit) p (print anything you want) l (list) b (breakpoint) #设置断点: (gdb) b fileName.c:lineNumber 或者 (gdb) b function u (until) #运行到指定行 call #调用函数 set #设置变量 set args #设置main 的输入参数 bt (backtrace) #查看堆栈 x #examine memory, (gdb)/FMT ADDRESS info # show things, (gdb) info break d # delete somthing (gdb) delete break xx 或者 (gdb) clean lineNumber 如果print 的内容比较长导致后面的内容是…,可以重新设置print长度的上限,或者无限制: set print element 0 如果要生成带调试信息的程序,在gcc时要加上-g参数。 target remote 192.

Lwip 内存管理

Lwip 用它自己的动态内存分配方式替代了标准C的malloc(); 它可以使用MEM_POOL的方式分配内存,即开辟几个不同尺寸的缓冲池,给数据分配合适的缓冲区来存放,就类似于使用数组的方式,可能会比较浪费空间,但是可以有效避免内存碎片产生, 这在第二部分讲。两种方式分别在mem.c memp.c里面实现,下面先总结一般的内存堆分配方式。 (一) 内存堆动态分配方式 [c] //mem.h /** Align a memory pointer to the alignment defined by MEM_ALIGNMENT * so that ADDR % MEM_ALIGNMENT == 0 */ #ifndef LWIP_MEM_ALIGN #define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) #endif [/c] 首先是内存对齐,这里用到的MCU是按4字节对齐的。这一语句功能是将addr 调整成最靠近addr的且能被4整除的值,其实就是(addr+3)&(~(u32)(0x03)),+3之后有余数的自然就进位了然后再舍掉余数。其实也可以用 addr = (addr&0x03)?(addr+1):addr; 这样应该也可以,更容易理解一些,但是没有上面的简便。 [c] #ifndef LWIP_RAM_HEAP_POINTER /** the heap. we need one struct mem at the end and some room for alignment */ u8_t ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT]; #define LWIP_RAM_HEAP_POINTER ram_heap #endif /* LWIP_RAM_HEAP_POINTER */ … /** * The heap is made up as a list of structs of this type.

IAR sprintf() 输出不正常的问题

前几天调试了一程序,用到sprintf函数,输出结果一直不正常,同样的输出格式用printf打印则没有问题。然后同样的程序在gcc下sprintf也是正常的。怀疑IAR的sprintf函数有问题。后来发现原因是IAR把sprintf函数简化了,在project-options-general options 里面的Library options 的Tabs里有个printf formatter,默认是选成tiny的选项,结果就不支持一些复杂的输出格式。把它设置成auto,输出结果就正常了,o yeah!