在学习嵌入式开发的过程中,尤其是开始入门时,包括各类各样的教程,都是在讲学习linux,甚少讲怎样借助linux来开发属于自己的嵌入式项目,也就是没有一个全局的概念,简单理解,大约流程如下:
一、建立开发环境
操作系统其实是LInux,或则在win系统下安装虚拟机,通过网路下载相应的GCC交叉编译器进行安装,或则安装产品厂家提供的交叉编译器。
这一步,就相当于在win系统下,要安装一个IDE开发环境,如MDK,IAR等。
二、配置开发主机
主要是配置minicom,也就是并口助手,minicom软件是作为调试嵌入式开发板信息输出的监视器和按键输入工具,是一个十分便捷的工具,我们开发其他嵌入式程序时,虽然好多时侯也采用并口调试,所以最终原理都是相通的。
配置网路,主要是配置NFS网路文件系统,这个主要是用于下载程序,其实不配置也可以,有好多别的办法。
三、建立引导装在程序的bootloader
常用的bootloader主要有u-boot、vivi等,据说主流的就是u-boot,这个按照自己具体的芯片进行移植更改。有些芯片是没有外置引导加载程序的,这就须要编撰开发板上的Flash的多些程序,其实也可以用windows下的通过JTAG串口和仿真器多些Flash芯片程序,也有linux下的公开源代码的J-Flash程序,所以在设计自己的硬件时,可以预留多种方法。
简单的讲,虽然就是要做好一个属于自己板子的u-boot,完成初始化,内核引导,下载、烧写等。
四、移植嵌入式Linux操作系统
假如有专门针对你使用的CPU的Linux再好不过,例如uCLinux、ARM-Linux、PPC-Linux等,假如没有,就要尝试移植专属自己的linux了,之后再添加自己特定硬件的驱动程序,进行调试更改,对于带MMU的CPU可以使用模块形式调试驱动,而对于uCLinux这样的系统则须要编译进内核,与内核为一体,再进行调试。
五、建立根文件系统
后面的文章述说过,没有根文件系统的Linux是难以正常工作的,还须要根文件系统。所以须要下载使用busybox软件来实现制做根文件系统。
再依照自己的应用须要来添加其他程序,默认的启动脚本通常都不会符合应用的需求(由于所有的嵌入式开发都是自由订制的),所以就要更改根文件系统中的启动脚本,它的储存位置至于/etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,手动挂载文件系统的配置文件/etc/fstab,虽然就是订制自己要开机启动的程序,具体情况会随着系统的不同而不同,根文件系统在嵌入式系统中通常设为只读,须要使用mkcramfs、genromfs等工具形成多些映像文件。
六、建立应用程序的Flashc盘分区
通常会使用jffs2或则YAFF文件系统,这须要在内核中提供这种文件系统的驱动,有的系统使用NORFLASH,有的系统使用NANDFLASH,也有的系统两种flash都使用,这么jffs2的作用是哪些呢?
百科里的介绍是:jffs2全名为journallingflashfilesystemversion2(闪存日志型文件系统第二版),其功能就是管理MTD设备上实现的日志型文件系统,日志系统也是一个完整系统所必须的linux嵌入式开发,不管是windows还是linux,有了这种才不算耍流氓,嘿嘿。jffs2并不打算提供提供类似与传统文件系统的功能,它只会直接在MTD设备上实现日志结构的文件系统,不仅提供具有断电可靠性的日志结构文件系统,jffs2都会在它管理的MTD设备上实现"耗损平衡"和“数据压缩”等特点。
MTD(memorytechnologydevice显存技术设备),就是各类flash。
七、开发应用程序
应用程序可以放在根文件系统中免费linux主机,也可以放在yaffs、jffs2文件系统中,有的应用不使用根文件系统,直接将应用程序和内核设计在一起,就是类似于uCOS-II的形式。
虽然,讲到这,这一步才是最终的目的,上面的步骤都是为了这一步,我自己的理解,开发应用程序呈现的形式应当是有三种的:
(1)直接讲应用程序和内核设计在一起,类似与uCOS-II的形式,这些方法就是属于私人定制了,实现的功能种类是比较少的,只是专属,而且稳定性要求高的,譬如说复杂交换机、防火墙等,可能更看中linux系统的稳定性和各类优秀的外围资源吧。
(2)基于qt等GUI开发应用程序,之前仍然以为qt是linux绕不开的,虽然随着了解,不尽然,qt似乎就是一个桌面系统,例如说ubuntulinux qq,对于前辈来说,有没有桌面都是无所谓的,由于所有都是可以通过shell来完成的,使用qt是便捷用户使用,所以对于这些须要操作,有屏幕的嵌入式设备,这个是一个挺好的方案。例如目前工控触摸屏还有各类手持式带有屏幕的仪表器械,都是此类方法。
(3)没有屏幕,只有简单的人机插口,例如并口,键盘,数码管,这些也能实现复杂功能开发,例如说,完全可以开发一个基于linux的PLC,可编程方案,通过脚本实现,这也是一种挺好的方案实现。
八、烧写内核、根文件系统、应用程序
无论如何加载,模块也好,所有的这种开发,过程资料,都是要烧讲到flash中的,之后应用程序须要哪些,就加载对应的功能程序即可。
九、发布产品
讲到最后,发觉,之前还是过分迷信linux,不是说linux不好,而是说,对于嵌入式开发工程师来说,没有最好的,只有最适宜的,开发一款产品,用哪些,不用哪些,都是因地制宜的。
例如说一个简单的跑马灯,你非要使用嵌入式linux方案,那就是烧包,只须要一个简单的2051,裸机程序能够开发,既实惠,又好用。
开发一款大型控制器设备,假如功能不太复杂,可以使用稍为中级的CPU,裸机或则ucos等来开发,也很便捷,也能做好多订制版的工业大型控制器。
开发一款中高型的控制器设备,功能比较复杂linux嵌入式开发,甚至须要复杂的屏幕交互,例如手机(安卓是linux的亲弟弟,OS是linux的亲哥哥),提款机,服务器交易系统,这么linux就十分合适了。