基于MK802的应用开发和相关的工具 这是一个文章系列的一部分,介绍基于MK802这类MiniPC的扩展开发,并展示他在计算机视觉、机器人控制方面的潜能 作者:Shikai Chen, http://www.csksoft.net
这里将介绍如何在MK802的Linux系统上进行程序开发和开发工程中会用到的一些工具和技巧。虽然文章是针对MK802这个MiniPC写的,但是由于采用了Linux系统,因此文章中介绍的内容其实都是标准Linux系统所支持的,因此自然可以在其他类型的MiniPC(如树梅派)上使用。
在之前的系列文章中我介绍了如何在MK802运行定制的传统Linux发行版。在此基础上,我们就可以使用标准Linux开发的技巧来为MK802开发程序。如果你很了解Linux的开发知识,不妨跳过本系列直接阅读后续的文章。
另外需要提醒大家的是本文并不打算写成一个系统的Linux开发教程,因此对于很多背景知识,还需要大家去学习相关的书籍。这里只是抛砖引玉式的通过一些例子让大家了解为MK802开发的大致过程。
1. 相关背景知识
1.1. 选用的语言和目标程序类型
这里不讨论使用什么语言开发比较好的问题,接下来的系列文章都主要采用C/C++作为MK802扩展应用的开发语言。基于如下原则:
 编译产生的本机程序相对效率较高
 其他诸如OpenCV等依赖库也为C/C++接口
 可以介绍传统的Linux程序开发的一些必要环节
 我自己的喜好
其他语言,如Java,也可以很好的完成我们的后续任务。不过对于这类采用虚拟机执行的语言以及各种脚本语言(如Python、javascript)在执行效率上肯定不如本机程序优秀,并且他们的运行库和虚拟机需要更多的依赖项和资源消耗,这些将在后续文章介绍OpenCV做视觉运算时候成为瓶颈。因此需要大家按照自身情况和需求来选择。
1.2. 本机编译还是交叉编译模式
在PC上大家可能习惯了同时在同一台(同一类)机器上做开发并编译、执行程序的流程,比如直接在windows中使用Visual Studio开发程序。
这种在同一台(一类)机器上为同类机器开发编译程序的模式这里我称为本机编译。对于MK802这类MiniPC来说,这个方式仍旧有效,并且很多时候也比较简单。不过由于相对PC来说这类设备的性能还是差很多的,也没有很大的存储空间,Flash的读写速度也没有PC的硬盘快,因此这里还将介绍嵌入式开发的另一种主要模式:交叉编译。
这里所说的交叉编译具体讲就是在PC上开发运行在MK802上的程序,并且完成最终可执行程序的编译过程。随后直接将编译产生的程序打包发布到MK802设备上执行。
交叉编译方式的好处有:
 利用PC相对强大的处理性能,加快程序编译速度
 利用PC上成熟强大的开发环境和工具,开发开发过程
 降低对目标系统的负担,如不用安装对应的编译器等开发工具
 对于Linux kernel等系统软件,交叉编译时唯一选择
不过交叉编译相比本机编译也复杂了一些,为此本文在后面的例子中将分别介绍本机编译和交叉编译两种开发方式,给大家以直观的认识。而对于这些开发模式的具体情况,还需要大家系统的学习相关的教程。
1.3. 开发工具
这里我们使用最标准的gcc和相关开发工具(make[2]、binutils[3]等)作为开发工具。这些都是纯命令行的开发工具,可能对于习惯了诸如Windows的Visual Studio IDE的人来说一开始会有所不适应,不过这并不代表用他们开发就是很复杂的。一旦习惯了,就会感受到他们的强大,另外,这些工具可以在所有类UNIX环境下使用。
另外如果实在不能适应纯命令环境开发,可以尝试一些基于这类工具的GUI IDE,比如Eclipse CDT[4]和Code::Blocks [5]。他们虽不及Visual Studio强大,但也够用。对于他们的使用,就不是本文的介绍范围了,需要大家自己摸索。另外就是如果打算在MK802上进行本机编译,这些工具则几乎不可用(没有移植或者运行性能太差)。
1.4. 书目推荐
开始写这段就有点后悔,因为发现要完整列举这些书目太困难了,所以这里只是按我的喜好列出一些具有代表性的书籍,要进行学习的话,还是需要看更多的书,毕竟每个人的背景知识不同。不妨先买一本Linux下开发的入门介绍书。随后在按照需要看这里给出的书。从推荐的书中也可以发现,其实给MK802开发应用就是普通的Linux程序开发。
Advanced Programming in the UNIX® Environment (Unix环境高级编程)
ISBN: 0201433079
这本书就像《Windows核心编程》一样,是想涉足Linux/Unix这类基于POSIX规范[6]的系统开发的必读书。相对于Windows的Win32 API来说,当今POSIX类系统更加的广泛,比如MacOS、iOS、Android都是采用POSIX规范的系统。
Advanced Linux Programming
ISBN: 0-7357-1043-0
这本书虽然没有上一门那么有名权威,不过其中从GCC/Make到针对Linux的编程都有介绍,覆盖面比较广,可以看看。
GNU Make Manual
使用Makefile进行软件项目的编译已经算是行业标准了,因此理解Makefile的工作机制和如何编写Makefile对于MK802的开发也相当重要。
这是GNU Make的手册,但是写的非常好,这里给出的是他的英文原版的电子版本地址,网上也有中文翻译版本。
http://www.gnu.org/software/make/manual/
An Introduction to GCC
ISBN: 0-9541617-9-3
这本书的全文可以在网上免费获取:
http://www.network-theory.co.uk/docs/gccintro/
介绍了GCC编译器的相关使用的问题
ARM v7-M Architecture, Application Level Reference Manual
这是ARM公司编写的针对应用程序开发者的芯片开发手册,相对来说比较底层。但是如果需要开发专门针对ARM优化的程序,它是必读的。
文档可以在网上免费获取:
http://www.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM.pdf
2. 相关的工具和环境准备
这里向大家介绍能够满足后续对MK802进行开发的环境和工具的准备。这里介绍的工具并不是对每个人都必须的,可以按照自身喜好进行使用。工具和环境准备的原则是:
 满足程序编译的需求
 实现对MK802进行远程文件传输和远程操作
2.1. MK802上的相关工具环境配置
2.1.1. 使用SSH远程命令行登录至MK802
SSH(Secure Shell)[7]应该是对于Linux操作必须的工具,即所谓的远程命令行终端。当然SSH这个名字还是具有更多的意义的。只要MK802可以访问网络,我们就可以在其他机器上通过SSH以命令行界面的形式登陆到MK802上进行操作和控制,而无须通过键盘鼠标以及显示器操作。这将在今后开发上带来很多便利。
在MK802能够联网后,使用如下命令可以安装ssh服务:
sudo apt-get install openssh-server
该命令将安装并配置ssh服务,今后便可以使用ssh客户端(Linux/Mac下直接使用ssh命令,Windows下推荐使用Putty工具[8])登陆MK802了。
图:Windows上使用Putty SSH客户端登陆MK802
在登陆过程中需要输入用户名和密码,如果使用的是我给出的自制系统镜像,可以首先在图形界面中使用命令
sudo passwd linaro
将内置账号linaro的账号密码设置成自己希望的,随后便可以使用ssh登陆。如果希望直接以root账号登陆,则可以先执行
sudo su
passwd
重置自己的root账户密码。
在Linux或者Mac环境下,可以直接用命令:ssh <用户名>@<MK802 IP地址> 的方式通过ssh登陆MK802。比如MK802的ip地址是192.168.1.103,我们打算以root用户登陆,则命令为:
ssh root@192.168.1.103
图:在Linux中直接使用ssh命令可以登陆至MK802
2.1.2. 使用scp命令进行远程文件复制
在安装了ssh服务后,就同时可以使用scp这个命令实现在MK802和远程机器之间的文件传输操作。这个命令与标准的Linux shell命令cp很类似,格式举例为:
从本机复制文件A到MK802的/root目录
scp A root@192.168.1.103:/root
从MK802的/root目录下复制所有文件到本机当前目录:
scp root@192.168.1.103:/root/* .
相信上面的例子已经展示清楚了这个命令的使用了方式了,不过由于每次scp操作都需要连接到MK802,因此默认情况下每执行一次scp命令都需要输入对用的账号密码(例子中我们使用的是root账号)。如果希望scp以及ssh不再提示密码,可以参考文献[9]的做法进行配置。
在Windows上,也有不少基于图形化的scp客户端,比如Fillezilla[10]和WinSCP[11],操作起来非常容易。 图:Windows上使用WinSCP与MK802进行文件传输 相对于我们后面介绍的如samba文件共享来说,scp是最快捷的方式,基本不需要怎么配置就可以使用,并且可以很容易的整合到脚本中,实现远程部署功能。
2.1.3. 使用VNC实现远程桌面
可以使用VNC服务实现MK802的远程桌面登陆。可以在PC上通过VNC客户端(如RealVNC[12])登陆至MK802,此时就可以远程操作MK802的显示画面了:
图:在Windows上使用RealVNC客户端远程查看并控制MK802的图形桌面
对于一些必须使用图形界面的程序,就可以使用VNC的方式远程在MK802上进行操作。另外使用VNC远程登陆过程中,MK802甚至不需要使用HDMI连接到显示器上。
不过由于MK802的处理器性能限制,使用VNC的方式登陆会消耗比较大的CPU资源,诸如摄像头画面预览、视频播放等涉及快速图形刷新的操作性能会很差。
对于Ubuntu发行版,这里推荐用vino这个VNC server。它的好处是vnc的会话与MK802正在显示的实际画面一致,并且在标准ubuntu发行版中已经自带了这个服务:通过输入remote desktop即可开启vnc服务的配置界面:
图:完整的Ubuntu Rootfs包含了VNC服务和配置程序
如果使用的是我提供的自制系统或者基于Linaro 的ubuntu rootfs,则首先需要安装vino这个服务:
sudo apt-get install vino
安装完毕后,可以在MK802图形界面中打开命令行终端,输入命令:
vino-preferences
此时会启动Vino的配置界面:
图:Vino服务配置界面
可以按照上图的配置,开启vino的服务。对于完整完本的ubuntu发行版,此时就可以使用VNC客户端进行连接了,而对于我制作的系统或者linaro版本的ubuntu rootfs,需要运行额外的命令:
export DISPLAY=:0
/usr/lib/vino/vino-server --display :0 1>/dev/null 2>&1 &
如果希望每次MK802开机都自动开启vino服务,则可以将上述代码加入/etc/rc.local脚本。
在配置完毕后,使用VNC客户端即可远程登陆MK802的图形界面。
图:RealVNC Viewer的远程登陆画面
2.1.4. 开发工具链
如果需要在MK802本机进行程序的开发,就需要在上边安装gcc/make这一系列的开发工具。这里可以简单的使用apt-get完成开发常用工具的安装:
sudo apt-get install build-essential
此时将花费几百兆的空间用于安装Make、GCC这些开发工具。接下来就可以在MK802上进行C/C++程序的开发了。
2.1.5. 关闭MK802的图形系统
如果在今后的MK802扩展使用中不需要连接显示器以及不需要运行任何图形程序,就可以考虑将整个X-Server图形系统关闭。比如将MK802用于机器人控制,就不需要拥有图形界面,本系列文章的后续OpenCV应用开发同样也不需要图形界面。
关闭了图形系统可以节约大量的内存,以及2-30%的CPU占用率消耗。
对于使用ubuntu发行版的rootfs系统,任何时候,可以使用命令:
sudo stop lightdm
关闭图形系统,如果今后不希望MK802开机自动启动图形系统,则使用命令关闭:
sudo mv /etc/init/lightdm.conf /etc/init/lightdm.conf.disable
如果需要恢复图形系统的自动启动,则执行
sudo mv /etc/init/lightdm.conf.disable /etc/init/lightdm.conf
不过一旦图形系统关闭,上文提到的VNC远程桌面也同样不可用了。
2.2. PC开发机上准备的工具
如果需要使用交叉编译方式在PC上进行开发工作,就需要相应的准备开发工具。这里我们需要安装有Linux的PC作为开发机,Linux的选择目前推荐使用Ubuntu 12.04LTS发行版本。
并且包含如下工具:
基本的开发工具
可以用apt-get build-essential安装
Arm-gcc交叉编译器
这里我们同样使用在系统自制篇[1]编译linux kernel用到的armhf gcc编译器。可以使用命令
sudo apt-get install cpp-arm-linux-gnueabihf g++-arm-linux-gnueabihf pkg-config-arm-linux-gnueabihf binutils-arm-linux-gnueabihf
完成他们的安装
SSH/SCP/VNC等客户端
这些客户端已经在前文提到了,这里不再重复。
3. 一个在MK802上运行的Hello World例子程序
在做好上述工具环境准备后,我们将分别介绍在MK802本机编译以及PC开发机交叉编译的方式编写一个最基本的hello world并执行。
为了体现Linux平台的共用性,这里统一使用如下的C++源代码文件:main.cpp
#include <iostream>
Using namespace std;
int main(int argc, char * argv[]) {
cout<<”Hello world from MK802!”<<endl;
return 0;
}
3.1. 在MK802上直接开发3.1.1. 环境准备首先使用ssh登陆MK802,在当前用户目录下创建上述main.cpp文件(也可以通过前文介绍的SCP方式将该文件从PC端传输过去) 图:创建main.cpp
3.1.2. 编译和运行
使用命令
g++ -o main main.cpp
即可完成程序的编译,随后执行./main即可看到输出结果
图:对main.cpp进行编译和执行
至此我们第一个在MK802上运行的程序就完成了。
3.2. 在PC上交叉编译方式开发这里介绍在PC上给MK802编写并编译程序的方式,这将是我所推荐的给MK802以及类似设备开发程序的模式。
3.2.1. 环境准备
按照前文的方式准备好Linux开发系统,并在当前目录中保存有前文提到的main.cpp文件
3.2.2. 交叉编译
使用如下命令,利用arm-gcc进行编译:
arm-linux-gnueabihf-g++ -o main main.cpp
在编译过程中可能会出现下列警告,可以忽略:
图:使用arm-gcc交叉编译
可以看到交叉编译过程其实和本机直接使用gcc编译一样。不过这里产生的main程序就无法在PC上执行了,它是针对ARM的程序,可以用file命令验证:
file ./main
图:使用file命令查看可执行程序的适用平台
3.2.3. 远程部署
编译产生程序后,我们使用scp命令将它部署到MK802上,这里同样假设MK802的ip地址是192.168.1.103。
scp main linaro@192.168.1.103:~/
上述命令将main程序通过网络远程复制到用户linaro的目录下(/home/linaro)。
图:将交叉编译的程序部署到MK802上
随后我们可以登陆mk802,执行这个main程序,将得到与本机编译一样的效果。
4. 小结
这里我们介绍了一些给MK802进行应用开发所需要的工具和环境准备,以及介绍了一个简单的hello world程序在MK802本机编译和交叉编译两种模式的操作。虽然目前这个例子非常简单,不过这将是接下来几篇文章的基础。我们将基于这些模式进行诸如与Arduino交互、OpenCV视觉处理应用的开发。
5. 参考文献
[1] 基于MK802 MiniPC的扩展开发应用-系统自制
http://www.csksoft.net/blog/post/mk802_dev_sysbuild.htm
[2] Make (software)
http://en.wikipedia.org/wiki/Make_(software)
[3] GNU Binutils
http://en.wikipedia.org/wiki/GNU_Binutils
[4] Eclipse CDT (C/C++ Development Tooling)
http://www.eclipse.org/cdt/
[5] Code::Blocks
http://www.codeblocks.org/
[6] Portable Operating System Interface (POSIX)
http://en.wikipedia.org/wiki/POSIX
[7] Secure Shell
http://en.wikipedia.org/wiki/Secure_Shell
[8] PuTTY: a free telnet/ssh client
http://www.chiark.greenend.org.uk/~sgtatham/putty/
[9] SSH Keys
https://wiki.archlinux.org/index.php/SSH_Keys_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
[10] FileZilla - The free FTP solution
http://filezilla-project.org/
[11] WinSCP
http://winscp.net/eng/index.php
[12] RealVNC Viewer
http://www.realvnc.com/download/viewer/
[13] 基于MK802 MiniPC的扩展开发应用-软/硬件修改和扩展
http://www.csksoft.net/blog/post/mk802_dev_hacks.html
|