本文主要介绍一下在LINUX环境下开发嵌入式软件中的一些常识性的东西,对每一项不做深究展开。同样一个问题的解决方法有很多,我把自己习惯用的方法分享在这里。也希望谁有更好经验的也拿来分享。
先介绍一下基本环境。嵌入式开发环境多多,本文基本的环境为windows-xp操作系统,虚拟机ubuntu 11.10。
虚拟机安装
这里选用ubuntu-11.10。可以自行从网上下载,我是从这个地址下载的:http://releases.ubuntu.com/11.10/ubuntu-11.10-desktop-i386.iso。更多的版本可以从这个网址自行选择:http://releases.ubuntu.com/
下载完成后,再下载一个vmware虚拟机软件,用于安装LINUX。安装方法非常傻瓜化,一路默认设置装下来即可。
有几个需要稍微注意的地方介绍如下:
1,创建过程中,有一步要求指定磁盘大小,其标题为:"Specific Disk Capability",其默认设置为20G。建议将它设置的大一些。它只是一个最大值,不会实际占用太大的空间。将其设大些可以避免以后空间不够,再上网找办法增加空间。
2,还是这个设置页,有两个选项:1, "Store virtual disk as a single file"; 2,"Split virtual disk into 2GB files"。选项2存在的目的,是因为windows的FAT32文件系统能支持的文件大小有限。如果你的磁盘是FAT32,则只能选2。如果是NTFS格式,则建议选1。当然了,选1还是2对实际使用没有任何影响,只不过选1的话,可以让你的虚拟机目录看起来文件少一些。
3,用户名。安装过程中,会要求输入初始的用户名和密码(不是root帐户)。这个没啥问题。安装完成后也没问题。但是,root帐户呢?比如,用户名lfx,密码123456,然后安装完成后就会有一个lfx帐户,其密码为123456。这里需要注意:该帐户有sudo权限。其权限密码同用户密码相同。而root帐户有点儿可怜,还没创建呢。个人建议还是弄一个root帐户出来,方法为:输入命令:sudo passwd root。然后开始输入root的新密码即可。
4,图形化界面。在步骤3中,是在命令行中操作的。也就是说,安装完成后,它停在了命令行中。没进窗口界面。输入命令:startx,然后系统就进图形界面了。个人建议先进到root帐户,再startx。Root帐户用起来比较方便。同时需要注意,进过一次之后,再重启会自动进入窗口界面。(尝试让它开机进命令行,但是失败了。。。)
5,命令行terminal,没找到从哪里能打开命令行terminal。还好找到一个快捷键:CTRL+ALT+T。至于从界面中如何进,不管了。
PS:建议安装vim。sudo apt-get install vim。不安装的话,vi编辑文件时,方向键不能移动光标。
网络设置
首先要设置虚拟机的网络,在虚拟机标签页上点右键,选settings,Hardware标签,Network Adapter项,在右边选中Bridged框。确定即可。桥接的连接方式,可以让虚拟机如同与windows运行在同一局域网中的另外一台电脑一样。非常明了。
用root帐户登陆进ubuntu的图形界面,右上角有个“↑↓”的标记,点击,选择Edit Connections.将IP设置为与windows同一网段。网关和DNS的设置也要与windows相同。设置好后,开命令行ping一下网关是否能通,再ping一下DNS,确保网络畅通。文件共享
文件共享
文件共享的方式有很多,这里推荐使用samba。下面的配置方式,需要能够连接公网
Samba的配置一直是个麻烦,好在在ubuntu 11.10中还算比较简单。步骤如下:
1,在ubuntn中选择一个目录,比如/home/lfx,在上面点右键,选择Share Options.
2,选中Share This Folder前面的框框
3,share Name要改一下,不能和用户名相同
4,选中Allow others to create and delete files in this folder
5,点击Create Share
6,会有提示,安装samba,全都照他说得办。这个过程中,会需要ROOT权限
7,这一套办完,还需要创建一个samba的帐户,命令如下:
sudo smbpasswd -a lfx
按提示输入密码即可。
最后,试下从windows上看能否打开这个目录吧
从windows上打开共享后,在共享目录上点右键,映射网络驱动器。这样在“我的电脑”目录下就能直接访问linux的共享了。里面的文件用起来如同在windows目录中一样,基本没什么区别。
Linux命令行远程工具
这里说的命令行工具,是指Secure CRT。它可以通过网络,连接虚拟机。连接完成后,就如同真正在linux环境中的命令行一样。至于为什么使用它,而不是直接在虚拟机中使用,主要是虚拟机中,按alt+tab没办法切换回来。没装vm tools时更麻烦。还有其它优势,用多了就明白了。
还有个优势就是,可以将LINUX不装在虚拟机上,而是装在一台高配置的服务器上。然后多人连接,共享使用。这时Secure CRT的作用就更体现出来了。
这东西的下载地址,自己找吧。网上大把。
服务器配置
新装的ubuntu没有ssh服务端,需要自行安装:
sudo apt-get install ssh
/etc/init.d/ssh start
完成
终端Secure CRT连接、配置方法:
1,文件->快速连接,协议选择SSH2,主机名填写linux的IP。用户名为linux用户名。然后确定
2,这时会弹出一个框(有可能需要等一会儿才出来),要求输入密码,输入即可,选中“保存密码”可以方便下次登陆。
3,这样就可以基本使用了。也可以再配置一下,用起来更方便一些
4,在标签页上点右键->会话选项->终端->仿真,在右边最上面:“终端”项选linux.。右边最下面“回滚缓冲区”原值为500,改成5000。这个值代表的是命令行能容纳的最多的行数。
5,还是这个配置页,外观选项,“字符编码”改成UTF-8。这样才能让linux中的中文正常显示。
Linux 图形远程工具
xManager。这个工具可以远程登陆linux/unix/windows。非常方便易用。需要的话可以研究下,这里不多说了。
虚拟机+securt+samba的情况下,用不着它。
服务器+securt+samba的情况下,就可以在服务器中安装一个xmanager的服务端,使用它会方便些。串口工具
还是Secure CRT这个神器。
连接方法:文件->快速连接,协议选择Serial,端口和波特率根据实际情况选择,右侧“流控”有三个选项,都不要选,其它不用管(如果设备特殊,其它可能也要调,不过我没遇到过)。
配置完成后连接即可。
如果设备是linux环境,请参照连接linux时的配置方式配置一下,看起来会舒服些。500改5000的那个命令行回滚参数,建议一定要改。
再介绍个非常有用的功能:配置自动记录打印信息。一次配置,终生受益。
这个功能可以让它每天自动记录一个文件,将所有的串口通讯信息保存起来。实用中非常方便。
在串口标签页上点右键->会话选项,找到“日志文件”一栏,在右侧可以配置自动将打印保存到文件中。文件名可配置,自动以日期为文件名,一天一个文件。我的文件名为:session-%M%D.log,其它自己研究。
版本管理
这里强烈建议使用SVN管理代码、文档。
SVN的介绍有很多,这里只说切身体验最关键的两点优点:
1,可以导出历史版本。也就是说你可以让你的代码,回到以前的某一个版本当中。
2,支持自动合并。两个甚至更多人可以同时修改同一个文件。只要修改的不是同一行,SVN可以帮助你们把多人的修改合并到一处。这不像VSS那样必须先锁定文件。
同样优秀的,git也是不错的版本管理工具,但用起来稍嫌复杂。
SVN管理首先要配置一个服务端。这个服务端可以安装在WINDOWS上,也可以安装在linux中。Linux安装方法如下:
服务器端:
sudo apt-get install subversion
下面的命令,将建立两个分开的版本库,其位置位于:/svn/test1,svn/test2
sudo apt-get install subversion
sudo mkdir /svn/
sudo mkdir /svn/test1
sudo mkdir /svn/test2
sudo svnadmin create /svn/test1/
sudo svnadmin create /svn/test2/
然后,需要修改文件/svn/test1/conf/svnserve.conf中的如下几行:
anon-access = read
auth-access = write
password-db = passwd
其它不动,只要将这几行前面的“#”却掉即可,注意一定要顶格。
修改/svn/test1/conf/passwd添加用户名和密码。
然后,再执行一个命令,就可以用了:
sudo svnserve -d -r /svn
客户端:
推荐使用tortoise svn图形化工具。在windows系统上。
新建工程:
安装完成后,在想添加版本管理的目录上点右键->TortoiseSvn->Import,在弹出来的提示框中输入svn://192.168.11.42/test1/{工程名},然后确定。会提示输入用户名和密码,填上服务器中设置的用户名和密码即可。
获取一个已有工程:
建一个空目录,点右键->SVN Checkout,然后选择路径,确定即可
在已有工程上更新版本:
在已有工程的目录上点右键->SVN Update即可
提交修改
修改某文件后,在工程上点右键,或者在工程目录中某一子目录空白处点右键->SVN Commit,会有弹出框,选择要提交的文件,填写注释即可。
更新历史版本:
方法一:获取一个历史版本的工程,在空目录中,右键->SVN Checkout,然后选择路径,注意右下角有一个“Show log”项,点一下,然后选择历史版本,确定即可。
方法二:在已有工程上,点右键-》Tortoise SVN->Show Log,然后在期望的版本上点右键-》update item to revision即可。
其它更多功能,自己摸索下吧。有界面的情况下用起来非常简单。
代码编辑工具
Source insight 编程神器。所有没用过这东西,而坚持用VC、UE等编辑文件的朋友们,强烈建议试一下。简单易用,这里就不多说了。
MAKEFILE
Makefile,实际上就是一个工具,可以让我们批量的编译大堆的文件,库。最终生成我们期望的可执行文件。
基本的Makefile没什么可说的,自己找资料学一下就成。文章一大把。
这里简单说一下生成Makefile的几个工具。
Autotools。这东西牵扯一大堆的工具,功能强大,用法复杂。要使用这东西,必须安装好几个相关的工具。最大的问题是,由于版本不同,会造成兼容性问题。出错后的纠察也较为困难,适合高手使用。对于需要集成开源软件的同志们来说,没办法,必须要用。抱着学习目的看本文的同志们,强烈不建议研究这东西。
CMake。隆重介绍下,这个东东是个好东东。本人也是头几天初次使用。非常简单易用。具体用法就不讲了,从做的工程中抽了个模板出来,有兴趣的可以下载下来直接修改着用。http://download.csdn.net/detail/taixinlfx/4263725。
代码规范
个人总结,要注意的几个地方:
1,遵守原代码的风格,原代码怎么写,新添加的代码就怎么写。
2,少用全局变量,尽量不用。
3,各个文件尽量独立,减少互相依赖,尽量不要互相依赖
4,如果C文件中的静态变量较多,可以用一个结构体把它们组织起来。
5,只提供必须的函数做外部函数,并在头文件中声明。其它的函数都做成static类型。
6,malloc敏感,看到它首先想到的是有没有释放内存。
强烈建议,花上一、两个小时的时间,看一下林锐的“高质量C++/C编程指南”。下载地址:http://download.csdn.net/detail/taixinlfx/4263733
代码注释,自动生成文档
介绍个工具:doxygen。它可以把规范的注释生成文档。下载和使用方法,请自行到网上找。代码的注释风格大致如下:
/**
*@brief 函数的简要说明
*函数的具体说明
*@param handle 参数说明
*@param msg 参数说明
*@note 需要注意的地方。 #jv_queue_create 这种# + 函数名的方式,可以变成一个链接指向该函数
*@return 0 成功,错误号表示超时
*@retval 0 意义
*@retval 1 意义
*@retval 2 意义
*
*/
int jv_queue_recv(int handle, void *msg, int timeout);
NFS服务
这个东西,大家了解的可能多一些。嵌入式开发基本上必须用到的东西。在LINUX主机上开通NFS服务,并指定一个目录。然后在开发板上(需要是LINUX系统的开发板)就可以通过mount将NFS指定的目录挂载到本地。从而方便升级、调试。
服务器配置
安装:apt-get install nfs-kernel-server
sudo vi /etc/export,仿照如下句子添加。
/home/lfx *(rw,sync,no_subtree_check)
其中,*可以改成192.168.11.22,限制只有固定IP可以访问,也可以部分用*代替。
启动:/etc/init.d/nfs-kernel-server restart
开发板端挂载命令:
mount -t nfs -o nolock 192.168.11.131:/home/lfx/ /mnt/