嵌入式 Linux 的学习误区
误区一、全身投入学习桌面或服务器版本 linux 系统
很多想学嵌入式 linux 的同学经常问我,我不会 linux 系统,怎么学习嵌入式 linux 开发,于是他们就花费了大量的精力和时间去研究学习桌面版本 linux 系统的使用,什么 redhat 、federo,、ubuntu 等等都用过,如何配置 linux,linux 的各种使用命令都背的滚瓜烂熟,linux 各种服务器的配置,还原备份各种操作非常熟悉,以为这样就学会了嵌入式 linux 开发。其实这是一个学习嵌入式 Linux 开发的误区。
Linux 桌面环境只是嵌入式 linux 的一个开发工具,开发环境而已。我们的目标不是学习 linux 服务器的配置和使用,linux 服务器的高级配置和使用那是另外一个领域,不属于嵌入式 linux 讨论的范畴。我们进行嵌入式 linux 开发,只是把 linux 桌面环境当作一个工具,在 linux 桌面环境下运行嵌入式 linux 开发工具,例如 gcc 编译器,make 工具来开发我们的嵌入式 linux 应用程序而已,对于嵌入式开发工程师来说,没有必要花费那么多的精力和时间去研究 linux 桌面版和服务器的应用,只要能了解最基本的操作即可。现在的桌面 linux 系统的图形化界面做的也相当好,跟 window 具有相同的易用性能。熟悉 linux 桌面系统的使用和基本操作命令,安排 1~2 天时间学习基本就可以掌握了。
误区二、直接阅读 linux 内核源代码
很多想学 linux,在连 linux 是什么东西,一点都还不会使用的情况下去就阅读 linux 内核源代码。这样的结果很可能就是看的头昏眼花,不知所云,最后只能放弃了。这也是同学们学习嵌入式 linux 的一个误区,在有一定嵌入式 linux 开发基础后,带着一定的目的去阅读 linux 源代码,这样可以极大的提高你的技术能力,但是你在没有任何基础,对 linux 一点都不了解的情况下就去阅读 linux 内核源代码,无异于以卵击石,最后只能是撞个头破血流。
由于 Linux 系统的 FrameBuffer 机制,会把屏幕上的每个点映射成一段线性内存空间,程序就可以通过改变这段内存的值来改变屏幕上某一点的颜色。屏幕色彩的原始数据保存在/dev/fb0 文件内,因此我们可以直接 cat /dev/fb0 > fb.raw 读取该文件获得数据。
图 1 原始截屏数据
显然,这种原始数据无法通过简单的工具直接查看,特别是在精简的嵌入式 Linux 系统上。因此,我们找到了一个不错的工具——gsnap。这个工具可以将 framebuffer 中的数据直接保存为 png 或者 jpeg 格式的图片。当然,我们需要获得该工具的源码,并且在交叉编译后移植它。
二、 原材料
本次尝试笔者选择 ZLG 开源开发套件 EasyARM-i.MX283A3,宿主机选用 Ubuntu14.04。首先,我们需要获取 gsnap 源码,该源码可在网络中搜索下载。源码解压后得到的文件如图 2:
图 2 gsnap 源码
其中 gsnap.c 为解析算法,感兴趣的读者可以打开研究,本文我们不做分析。我们直接打开跟编译相关的 Makefile 文件,内容如下图所示。从下图可知,该源码依赖 libpng、libjpeg、zlib、libmath 四种库。由于交叉编译器的库种包含有 libmath,因此我们需要准备好另外三种库备用。
图 3 gsnap 的 Makefile
解压后得到的文件如图 4。(源码包可从库官网或论坛下载)
图 4 库的源码包解压
三、交叉编译
第一步,交叉编译 libjpeg。
进入到源码目录,执行./configure --host=arm-linux --prefix=/home/vmuser/gsnap/jpeg_install/,然后执行 make、make install ,在安装目录/home/vmuser/gsnap/jpeg_install/得到交叉编译过的库。
图 5 交叉编译 libjpeg
第二步,交叉编译 zlib。
由于 zlib 是 libpng 的依赖,因此必须首先编译 zlib。由于 zlib 中的 configure 并未提供--host 参数,因此需要为它手动指明交叉编译器:export CC=arm-fsl-linux-gnueabi-gcc,然后执行./configure --prefix=/home/vmuser/gsnap/z_install/,make、make install 。得到的文件类同第一步,不再放图。
第三步,交叉编译 libpng。
与上述两步骤又不同,libpng 中提供有 Linux 平台下的 Makefile 例程,我们可以直接拿来修改使用。进入到 libpng 的源码目录,执行拷贝 cp scripts/makefile.linux Makefile,然后打开 Makefile 修改,如图 6。修改的内容为交叉编译器名称和依赖的 zlib 的路径。最后 make、makeinstall 得到头文件可库文件。
图 6 修改 libpng 的 Makefile
第四步,交叉编译 gsnap。
为方便起见,我们将上述得到的库文件和头文件分别集中拷贝到自行建立的 lib 和 includes 目录下,并且修改 gsnap 的 Makefile。执行 make 后就能得到可执行文件 gsnap。
图 7 修改 gsnap 的 Makefile
四、验证
将得到的 gsnap 可执行文件拷贝到目标板的/opt 目录下,执行截屏命令:./gsnap fb.jpg /dev/fb0,将得到的截屏 fb.jpg 拷贝到 ubuntu
版权声明: 本文为 InfoQ 作者【智趣匠】的原创文章。
原文链接:【http://xie.infoq.cn/article/f5834733097a890c27d45a898】。文章转载请联系作者。
评论