Category: Stay hungry, Stay foolish!

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

前段时间有朋友想要了解一下多线程编程,正好有个项目上有这么个例子可以抽出来讲一讲。只要搞清楚这个例子,就一下子掌握了线程间同步、互斥量、条件变量、队列、内存池的概念和使用。 首先,线程间同步的概念。 比如,学过数字电路的人都知道,两个时钟域的信号如果没有经过同步直接接到一起的话,会引起亚稳态。原因是如果恰好输入信号在时钟边沿附近变化的话(不满足建立保持时间的情况下),信号可能处于一个中间电平,这样会导致触发器处于一个振荡状态,引起整块数字电路的不稳定。这就是数字电路中异步的概念,两个时钟都是各自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 »

使用 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 相关

gitosis 搭建: git 本身是一个分布式的版本管理系统,但如果要设置一个中心库方便很多开发者同步,或者像SVN 一样使用它,就需要搭建git on the server – gitosis。 详情参考: https://git-scm.com/book/en/v1/Git-on-the-Server-Gitosis ubuntu:~$ sudo apt-get install git-core openssh-server openssh-client ubuntu:~$ sudo apt-get install python-setuptools ubuntu:~$ git config --global user.name "myname" ubuntu:~$ git config --global user.email "******@gmail.com" ubuntu:~$ git clone https://github.com/res0nat0r/gitosis.git ubuntu:/tmp$ cd gitosis/ ubuntu:/tmp/gitosis$ sudo python setup.py install ubuntu:/tmp/gitosis$ sudo useradd -m git ubuntu:/tmp/gitosis$ sudo passwd
Read More »

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

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

c/c++编译相关技巧总结帖

链接时忽略文件中未用到的函数或者对象。这在移植代码过程中很有用, 我们就不需要去删除或者注释掉那些大量没用到的对象或者不需要去链接的对象。 For GCC, this is accomplished in two stages: First compile the data but tell the compiler to separate the code into separate sections within the translation unit. This will be done for functions, classes, and external variables by using the following two compiler flags: -fdata-sections -ffunction-sections Link the translation units together using the
Read More »

网站迁移笔记

迁移参考: https://www.digitalocean.com/community/tutorials/how-to-move-an-apache-web-root-to-a-new-location-on-ubuntu-16-04 Ubuntu1604 安装php5.6 由于Ubuntu1604 默认安装的是php7。由于网站兼容性问题,需要装php5。 步骤参考:https://phpraxis.wordpress.com/2016/05/16/install-php-5-6-or-5-5-in-ubuntu-16-04-lts-xenial-xerus/ > add-apt-repository ppa:ondrej/php > apt-get update > apt-get install php5.6 php5.6-mbstring php5.6-mysql php5.6-sqlite3 > 还有这些按需要装 php5.6-cli php5.6-curl php5.6-json php5.6-mcrypt php5.6-curl php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0 mysql-server-5.7 apache2 # php 版本切换方法2 > sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart ; echo 1 | sudo update-alternatives –config
Read More »

linux bash shell 像cmd.exe 一样的滚动补齐功能

有些情况下,比如我们遇到文件名含有一些字符不容易输入时就很着急了,这时候就需要让linux shell像windows cmd.exe 一样自动补全部的文件名,且可自动按顺序一个个滚动切换。方法如下: 在用户目录创建 ~/.inputrc (若不存在则自己创建) 文件里添加一行: 。 登出再登陆用户就可以了。 For more details see the READLINE section in man bash .