谈谈如何学习嵌入式Linux(一) Post
By:2014-4-9 11:55:00
如何正确的学习嵌入式Linux技术是每一个初学者面临的第一个题目。根据笔者自身经验以及和其他人的接触,很多初学者在一拿到开发板后,就马上搞移植,搞内核。这显得很有技术含量,也很有成就感。其实这是和正确的学习方法背道而驰。笔者以前也是瞎搞了一年,结果去面试时,人家面试官问:“什么是僵尸进程?僵尸进程过多会有什么后果?”被人家问得满面通红。
那么应该如何正确地学习嵌入式Linux呢?那么需要知道在企业中一个嵌入式Linux开发小组中,是需要什么技能的人。在什么地方学习嵌入式Linux最快呢?当然是在企业里。笔者有一个客户,刚大学毕业,之前没有接触过Linux,只花了两个月时间的学习和准备,就单独开发项目了。企业的需求会让人清楚的明白具备什么样的技能才能把一个项目开发出来。那么在学习的过程中就有针对性的学习,不走弯路。
下面我们就用一个项目案例说明,一个嵌入式Linux小组的成员具备什么技能就可以做项目。
这是一个野外的无人加油站的项目。客户需要在野外偏僻的马路边安装加油站,方便过住的车辆加油。由于地处偏僻,如果安排人手看值,成本不划算。所以加油站设计为无人看值,需要加油的司机是自助加油。这样需要加油机内嵌计算机,用于和司机互交,执行加油、收油、收银的动作。同时所有加油机都和中心服务器联网,报告所有的信息。整个系统如图下所示:。
此主题相关图片如下snap1.jpg:
项目小组的任务是开发内嵌计算机上的控制程序。当然,这个嵌入式计算机也有一定的要求。由于野外的各季节的温差大,所以嵌入式计算机必须经过严格的高低温测试;由于加油站是布署在马路边,容易扬尘,所以嵌入式计算机必须有良好的防尘性能;加油站周边会大量的电磁干扰:如车辆发动机、暴雷闪电,所以嵌入式计算机要有良好电磁兼容性能;由于加油站是长期无人看值,这需要嵌入式计算机搭载的操作系统的性能稳定,能长时间工作而不出错。具备这种能力的计算机,我们通常叫是工业级控制计算机,也叫工控机。出于成本考虑,这种工控机是直接在有实力厂家中直接购买(如周立功公司的EPC8000系列、DAQ1000系列)。工控机上已经有稳定的操作系统(如Linux)和所有驱动程序,项目小组的工作只是直接在这现成的工控机上开发应用程序。这会大大降低项目小组的负担和成本。
那么我们看看项目小组需要在工控机上实现的功能:
1、 工控机在开机后进入欢迎界面。在界面上提示客人在界面上触摸“开始服务”按钮进入服务状态。;
2、 工控机进入服务状态后,在界面上提示客人选择油品:柴油或汽油;
3、 客人选择好油品后,工控机在界面提示客人输入加油量;
4、 工控机根据用户输入油品和加油量计算出客人应付款额;
5、 工控机通过RS232接口控制钱币机进入接受纸币状态,然后在界面提示客人在钱币机口送入钱币;
6、 当客人送入的钱币等于或大于应付款额时,关闭钱币机进币口,然后返回找赎;
7、 收银动作完成后,工控机通过RS485接口激活相关的加油枪,并在界面提示客人可以拿起加油枪进行自助加油了;
8、 客人使用加油枪进行加油枪进行加油时,工控机通过RS485不断地获得加油枪输出油的油量,并对出油量进行计数;
9、 当油量计数达到客人设定的加油量时,工控机通过RS485接口控制加油枪关闭出油;
10、 工控机在界面提示客人放回加油枪,提示服务结束,并通过RS232接口控制打印机打印本次交易票据;
11、 界面返回欢迎界面;
12、 工控机把本次交易情况生成SQL语句,通过网络提交到服务器上的数据库;
13、 本次任务结束,等待下一次交易。
根据这需求,我们可以归纳开发这个项目所需要的技术:
1、 Linux环境下的C/C++编译,还可能用到Linux下的多线编程。
2、 串口编译。这里控制加油枪、钱币机、打印机所需的RS232和RS485控制都是用串口操作。至于这些仪器的操作命令参考厂商提供的手册或代码范例就可以了。
3、 界面编程。在Linux一般是使用QT或GTK,都是很容易学的。
4、 数据库编程,会编写SQL语句。
当一个从没接触过Linux的初学者面临这些学习目标时,该如何制作学习方案呢?一般的过来人都会说:
1、 首先学习安装Linux系统。现在比较常用的是ubuntu。这可以直接安装在电脑上或安装在虚拟机上。但对于初者学来说,如果想学习原汁原味的Linux,抛弃windows思维,还是直接安装在电脑上好。
2、 学习使用Linux系统,特别是shell命令。这其实和学习windows的道理一样,我们在学习windows的C语言编程前也得先学习windows基础。使用Linux时,大多是使用shell命令操作。Shell命令很多,但是常用的命令也就是十几条。
3、 学习使用vim文本编辑器,是一种命令行方式的文本编辑器。大家在windows上编写代码一般是使用各种代码编辑软件来编写代码,当然Linux也有。但Linux的程序员大都是使用vim来编辑代码。对于不会使用vim的人,我们很难认同他是同行人员。
4、 学习Linux下的文件系统。Linux下的文件系统结构和windows的完全不一样。Linux的文件系统下的各个目录是放置什么东西是有规定的。同样,在我们的嵌入式Linux设备上安装我们的程序时,什么地方该放库文件,什么地方该放程序文件,什么设置启动代码之类,也是需要我们心中有数的。
5、 学习Linux下的软件安装。我们在开发工作中,可能会使用多种软件。
6、 学习shell编程。
7、 学习gcc命令的使用。在Linux编译程序代码是使用gcc命令进行的。
8、 学习Makefile。在Linux编译代码不同于windows编译代码,在windows按一下按钮就可以编译项目中的所有代码文件。但在Linux,需要用Makefile文件来描述各个文件的编译方法和顺序。当然我们不需要很深入地学习Makefile,只需要我们能看懂Makefile文件就可以。在实际项目开发中,我们都是套用Makefile文件的范例。
9、 学习Linux的C/C++编程。Linux下的C/C++的语法和windows下的没有什么不同的。
10、 学习Unix环境编程。主要是学习文件操作、多进程编程、多线程编程、信号、网络编程。这都是项目开发中经常用到的。一般来说,嵌入式Linux的求职者在面试时,这部份是考得比较深。
11、 学习图形界面编程,如QT、GTK。这是比较容易学习的。
到这里大家可能觉得这和PC机的Linux学习没有什么区别。其实不是没有什么区别,而是根本没有区别。不管是PC机的Linux还是嵌入式Linux,在应用层做开发都是一样的,仅是编译器和调试工具不一样。一个原来是做PC机Linux应用层程序开发的转做嵌入式Linux应用层程序开发是没有任何难度。
说了那么多,可能有些网友更心急:系统移植、驱动(底层)是怎样学?在相当的初学者眼中,做底层(系统移植、驱动实现)显得更有“技术含量”,更有挑战性。因为看起来做应用层的程序比较容易入门。但是我们得考虑一个问题:在一个嵌入式设备中,是应用层的程序更有价值或是底层的程序更有价值?要知道任何一个嵌入式设备都是为了实现一个或多个功能的。这些功能会给用户以直观体验:好不好用、稳不稳定、美不美观。这是都是由应用程序体现出来的。而底层的操作系统、文件系统、驱动程序不管做得再好,再好稳定,也是为应用层的程序服务的,是用户不能直接体验的。或者说,把底层的软件做好做稳定是工程师基本责任。同时在“技术含量”的角度来说,说做应用层的比较底层的低一等也站不住脚。要把一个功能复杂的应用程序做好做稳定,不仅是需要良好的软件设计方法,也需要对Unix环境编程有深入的了解。Unix环境编程是易学难精。若应用层的工程师是和资深的行业背景联系一起时,那就更显工程师的价值了。
至于嵌入式Linux的底层开发应该如何去学,我们下次再讲。