域内的PC 访问非域内的samba服务器

加入某个域内的PC 在登录samba服务器的时候,默认会在USERNAME 前加上DOMAIN\, 所以一直登录失败。登陆窗口上也无法取消加 DOMAIN\。 解决方法: 控制面板->凭据管理器(Credential Manager) -> 手动添加Windows 凭据, 这样就可以用此用户账户正常登录了。

zynq 嵌入式开发总结

传统开发步骤 基础设计 编译kernel 编译device tree 制作文件系统 将 BOOT.bin, devicetree.dtb, uImage 拷贝至SD卡的FAT 分区。文件系统拷贝至ext 分区即可。 这是传统的嵌入式系统开发方式,后面 xilinx 出了petalinux 工具,降低了 uboot, kernel, filesystem 的系统配置工作量,可以从Vivado 导出的硬件信息自动完成相关软件的配置。

编译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 编译步骤 然后将imge 烧进SD卡启动,就可以愉快的玩耍PYNQ了! 若板子不提供bsp 文件, 以(AC7020) 为例,则准备boards文件夹如下:

一个例子讲清楚线程间同步、互斥量、条件变量、队列、内存池

前段时间有朋友想要了解一下多线程编程,正好有个项目上有这么个例子可以抽出来讲一讲。只要搞清楚这个例子,就一下子掌握了线程间同步、互斥量、条件变量、队列、内存池的概念和使用。 首先,线程间同步的概念。 比如,学过数字电路的人都知道,两个时钟域的信号如果没有经过同步直接接到一起的话,会引起亚稳态。原因是如果恰好输入信号在时钟边沿附近变化的话(不满足建立保持时间的情况下),信号可能处于一个中间电平,这样会导致触发器处于一个振荡状态,引起整块数字电路的不稳定。这就是数字电路中异步的概念,两个时钟都是各自free running,彼此没有关系。 再比如单片机程序中,各个不同的中断程序或者跟主程序间是异步的,因为主程序在执行的过程中随时可能被进来的中断打断,如果中断和主程序之间要通过一个共享的变量传递数据,你就要注意这个共享的变量的保护。假如主程序只读取了一半的数据而被中断打断,然后中断程序中又更新了整个变量,这样的回到主程序继续执行时读到的数据就有一半是上一次的,一半是更新过的。这样的结果显然不是我们想要的。这里只是举了一个很明显的例子。更多的情况可以搜索一下“原子操作”。 所以在多线程环境下,我们就要注意线程间共享变量的保护,这块敏感区域叫临界区(Critical area)。在单片机中,我们用中断开关来保护共享变量读写操作的完整性。在操作系统中,我们用的是互斥锁(mutex)来占有这个变量,防止它被多个线程同时访问。当一个线程访问当前已经被另一个线程占有的变量时,就会进入阻塞态,直到另一个线程完成解锁操作后,这个线程将得到继续执行。 互斥锁(mutex)是多线程编程时最重要的一个工具,用来解决多线程竞争同个资源的问题。其最底层的实现都是一个原子操作来界定lock or unlock。 接下来的例子创建了两个线程,一个是producer, 另一个是cusumer, 它们两个是异步的,中间通过一个队列来通讯。producer 向队列中发送数据,cusumer读取数据。模拟了一个场景:producer 以较快的速度向队列写数据,cusumer 处理数据较慢。这在图像帧处理时经常会碰到CPU处理和发送数据较慢,而外设采集速度较快的情况,这样多余的帧将被丢弃。队列节点使用自己写的一个内存池来分配,在malloc_node 从内存池(free_queue)里取出node; release_node 时把节点放回资源池。当对free_queue 进行操作的时候都要加锁,因为malloc_node 和release_node 可能被不同的线程调用,必须对free_queue 进行保护。这样的函数称之为是线程安全的。同理对enqueue,dequeue的操作也要对队列进行保护。 然后使用条件变量来通知consumer 队列有新数据到来。条件变量同样是被多个线程调用,也是需要带一个mutex 来进行保护的。当条件不满足时,线程会解锁mutex 进入block状态等待消息,这样才不会一直占有CPU。当条件满足或者超时时,才继续执行下面的程序。 例子中使用了pthread(POSIX thread) 的实现。其实各大操作系统都有自己的实现,FreeRTOS, Linux kernel等等,都可以拿代码过来看看学习。 请看这个多线程的例子,可以在online gdb 中运行调试: 例子中模拟了 producer 的生产速度是cosumer 的5倍,所以当队列满了的时候很多数据就会被丢弃。 若要看其它更简单的使用例子,可以参看libpthread 源码 /tests目录下的小例子。OK!

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
Read More »

H.264 codec Note

•       Elements of a video Sequence o    Frames o    Slices o    MBs (macroblocks) •       Frame Types o    I-, P-, B-frames o    GOP (group of picture), specifies the order in which intra– and inter-frames are arranged. o    NAL (Network Abstraction Layer) v  SPS (Sequence parameter set) v  PPS (Picture parameter  set) v  IDR (Instantaneous Decoder Refresh),
Read More »

Plans

Recently, I want to do some hardware acceleration applcations like using zynq to mining. This will help me more skillful in software and hardware combinational developments. This type of use case may be used in lot of scenes. Such hardware like DSP, VPU, GPU, neural stick and many fpga cores outside of CPU. I have
Read More »

使用 qemu 调试 linux kernel

  在 Ubuntu 中build kernel 参考如下: [Ref] https://wiki.ubuntu.com/KernelTeam/GitKernelBuild    可以直接在宿主机调试kernel, 但是当发生崩溃之后,工作环境又要重新配置。   所以考虑用 qemu,因为它有个option: -kernel, 可以直接引导kernel。比 VirtualBox 等虚拟机更快速更方便。 尝试使用 qemu 直接启动主机上的kernel  $ sudo qemu-system-x86_64 -kernel /boot/vmlinuz-`uname -r` 这会提示缺少文件系统 可以使用 debootstrap 构建一个rootfs  IMG=qemu-image.img DIR=mount-point.dir qemu-img create $IMG 1g mkfs.ext2 $IMG mkdir $DIR sudo mount -o loop $IMG $DIR sudo debootstrap --arch amd64 jessie $DIR sudo umount $DIR
Read More »

git 中心服务搭建

中心服务方式选择 git 本身是一个分布式的版本管理系统,但如果要设置一个中心库方便很多开发者同步,或者像SVN 一样使用它,就需要搭建一个中心库。有几种方式可以选择: gitosis :这个是比较老的方式。不推荐详情参考: https://git-scm.com/book/en/v1/Git-on-the-Server-Gitosis GitLab: git 结合web 服务来管理,方便issue 和权限管理。比较推荐。收费版还可提供更多功能。参考:https://about.gitlab.com/install/ 只用ssh git 用户管理开一个git 用户,设定好权限,也比较方便。但是缺少管理issue 功能。参考:https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server ssh git用户设置  ssh key证书生成 $ ssh-keygen –t rsa –C “user@host”  将id_rsa.pub 发给git服务器管理员添加进/home/git/.ssh/authorized_keys 即可,或者直接用 ssh-copy-id 到服务器即可。 $ git clone git@IP:/srv/git/test.git 有几个注意点: 使用 ssh key 登陆 git 用户时,home目录只能是git 可写的,否则当git组包含多个用户时会出现不用能ssh key 登录的问题。具体debug ssh key 登录问题,可以查看 /var/log/auth 下的日志来解决。.ssh/ 的权限是700,.ssh/authorized_keys 权限是600。 最后用chsh 修改 git用户shell
Read More »