这是一个文章系列的一部分,介绍基于MK802这类MiniPC的扩展开发,并展示他在计算机视觉、机器人控制方面的潜能
欢迎转载,但请保留原始作者信息(Shikai Chen, http://www.csksoft.net),以及指向本文原始出处的链接!
访问目录:基于MK802 MiniPC的扩展开发应用-简介篇(http://www.csksoft.net/blog/post/mk802_dev_intro.html)
revision: 1
这里将介绍如何在MK802的Linux系统上进行程序开发和开发工程中会用到的一些工具和技巧。虽然文章是针对MK802这个MiniPC写的,但是由于采用了Linux系统,因此文章中介绍的内容其实都是标准Linux系统所支持的,因此自然可以在其他类型的MiniPC(如树梅派)上使用。
在之前的系列文章中我介绍了如何在MK802运行定制的传统Linux发行版。在此基础上,我们就可以使用标准Linux开发的技巧来为MK802开发程序。如果你很了解Linux的开发知识,不妨跳过本系列直接阅读后续的文章。
另外需要提醒大家的是本文并不打算写成一个系统的Linux开发教程,因此对于很多背景知识,还需要大家去学习相关的书籍。这里只是抛砖引玉式的通过一些例子让大家了解为MK802开发的大致过程。
1. 相关背景知识
1.1. 选用的语言和目标程序类型
1.2. 本机编译还是交叉编译模式
1.3. 开发工具
1.4. 书目推荐
Advanced Programming in the UNIX® Environment (Unix环境高级编程)
Advanced Linux Programming
GNU Make Manual
An Introduction to GCC
ARM v7-M Architecture, Application Level Reference Manual
2. 相关的工具和环境准备
2.1. MK802上的相关工具环境配置
2.1.1. 使用SSH远程命令行登录至MK802
在登陆过程中需要输入用户名和密码,如果使用的是我给出的自制系统镜像,可以首先在图形界面中使用命令
将内置账号linaro的账号密码设置成自己希望的,随后便可以使用ssh登陆。如果希望直接以root账号登陆,则可以先执行
passwd
重置自己的root账户密码。

2.1.2. 使用scp命令进行远程文件复制
在安装了ssh服务后,就同时可以使用scp这个命令实现在MK802和远程机器之间的文件传输操作。这个命令与标准的Linux shell命令cp很类似,格式举例为:
从本机复制文件A到MK802的/root目录
从MK802的/root目录下复制所有文件到本机当前目录:

图: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这个服务:
安装完毕后,可以在MK802图形界面中打开命令行终端,输入命令:
此时会启动Vino的配置界面:

图:Vino服务配置界面
可以按照上图的配置,开启vino的服务。对于完整完本的ubuntu发行版,此时就可以使用VNC客户端进行连接了,而对于我制作的系统或者linaro版本的ubuntu rootfs,需要运行额外的命令:
/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完成开发常用工具的安装:
此时将花费几百兆的空间用于安装Make、GCC这些开发工具。接下来就可以在MK802上进行C/C++程序的开发了。
2.1.5. 关闭MK802的图形系统
如果在今后的MK802扩展使用中不需要连接显示器以及不需要运行任何图形程序,就可以考虑将整个X-Server图形系统关闭。比如将MK802用于机器人控制,就不需要拥有图形界面,本系列文章的后续OpenCV应用开发同样也不需要图形界面。
关闭了图形系统可以节约大量的内存,以及2-30%的CPU占用率消耗。
对于使用ubuntu发行版的rootfs系统,任何时候,可以使用命令:
关闭图形系统,如果今后不希望MK802开机自动启动图形系统,则使用命令关闭:
如果需要恢复图形系统的自动启动,则执行
不过一旦图形系统关闭,上文提到的VNC远程桌面也同样不可用了。
2.2. PC开发机上准备的工具
如果需要使用交叉编译方式在PC上进行开发工作,就需要相应的准备开发工具。这里我们需要安装有Linux的PC作为开发机,Linux的选择目前推荐使用Ubuntu 12.04LTS发行版本。
并且包含如下工具:
基本的开发工具
可以用apt-get build-essential安装
Arm-gcc交叉编译器
这里我们同样使用在系统自制篇[1]编译linux kernel用到的armhf gcc编译器。可以使用命令
完成他们的安装
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. 编译和运行
使用命令
即可完成程序的编译,随后执行./main即可看到输出结果
图:对main.cpp进行编译和执行
至此我们第一个在MK802上运行的程序就完成了。
3.2. 在PC上交叉编译方式开发
这里介绍在PC上给MK802编写并编译程序的方式,这将是我所推荐的给MK802以及类似设备开发程序的模式。
3.2.1. 环境准备
按照前文的方式准备好Linux开发系统,并在当前目录中保存有前文提到的main.cpp文件
3.2.2. 交叉编译
使用如下命令,利用arm-gcc进行编译:
在编译过程中可能会出现下列警告,可以忽略:
图:使用arm-gcc交叉编译
可以看到交叉编译过程其实和本机直接使用gcc编译一样。不过这里产生的main程序就无法在PC上执行了,它是针对ARM的程序,可以用file命令验证:
图:使用file命令查看可执行程序的适用平台
3.2.3. 远程部署
编译产生程序后,我们使用scp命令将它部署到MK802上,这里同样假设MK802的ip地址是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