这段时间,我回答嵌入式相关的问题比较多,结果网友们误以为我很懂嵌入式,呵呵,这不,又有问题过来:
原文:
肖舸老师,您好!谢谢您抽空看我的邮件。
昨天在51CTO认识了您,您对IT行业有着非常丰富的经验,我现在遇到一个困惑,希望能得到您的教导与建议。
我已经在工作了,所属行业是嵌入式Linux。嵌入式行业无疑就是应用开发与驱动开发,我现在困惑的也就是这两个小方向的选择。
我了解了下现在智能终端的市场,对一个嵌入式设备来讲,应用软件算是比较重要并且吸引人的地方,但我自己又偏喜欢驱动开发。
我自己有思考过了,但终究是刚起步,不太了解这行业的需求量或者一些深入性的东西,没有您这么深厚的认识。
您觉得在嵌入式设备上,应用开发与驱动开发哪个前景会比较好?有什么建议?
我的回答:
嗯,这位朋友,首先声明一点啊,我其实本人从事嵌入式开发较少,我并不是嵌入式开发专家,我很多基于嵌入式的论述,其实更懂是通过我对计算机软件开发,或者说计算机软硬件开发的理解来阐述的。因此,太细的问题我回答不了的,见谅哈。
嗯,基于你这个问题,我可以谈点我的看法。
我先说个猛的啊,别害怕啊,呵呵。
我认为,“这个世界上,不存在真正的嵌入式开发!”,猛不猛?
为什么这么说?好,我们来讨论一个话题,什么叫做嵌入式。
嗯,区分方法有很多啦,不过,恐怕大家心目中,最多用的就是“大”和“小”。大,自然相对PC机而言,小呢,嵌入式设备都很小。比如一个控制盒,一个手机,等等。
但我说这么论述,恰恰没有说到点子上。你说大,PC够大吗?那IBM的大型机就开始哭了。你说小,我看过工厂里面的自动生产线,几百米长呢,比大型机都大。但是,你能说明它不是嵌入式?
99年的时候,我做过一个系统,《水泥生产窑红外线筒体测温报警系统》,看这个名字,算不算嵌入式范畴?
问题是,我是用PC机完成的,呵呵。用了gcc的DOS版本,djgpp,32位的C/C++语言实现的。
原理很简单,我去买了个红外线测温头,用个螺丝把它上到步进电机上,然后我老板(他懂硬件),用8235做了一块卡,要AD转换嘛,读出温度数据,还顺便做了几路IO量,我总得给步进电机打信号啊。
然后焊了个箱子,防雨嘛,我还专门学习了一下油漆技术。然后我们把这个箱子放到远处能完整看见水泥窑筒体的楼顶上,在楼里面找了个房间放PC机,然后就好了。
成本1万块,我们卖了28万,呵呵。然后,再后来,我都离开那家公司很久了,老板和我说,每个月卖4套,看起来很不错。
我问问大家,这算不算嵌入式?
当然,我们不是忽悠钱,这里面有核心技术含量的,步进电机需要很标准的方波信号,我的问题就是怎么利用PC机不怎么准确的时钟频率,打出标准的IO方波高电平的,我去年公开了一个算法,《一个带自适应功能的高精度计时》,就是这里面最核心的算法,仅仅是我用C++改写了一下而已。有兴趣的朋友可以看看。
好,这个项目不重要,PC机也不重要,我的问题是,究竟什么是嵌入式?
说点我的看法吧,我认为,嵌入式和PC最大的差别,前者是专用计算机系统,PC更加像一个通用的计算机系统。二者各有优缺点。
嵌入式没有什么UI,没有什么繁多的功能,强调小而专一,能把一个用户需求解决到最好,并且,整合度高,很多嵌入式系统就一块板子,没有硬盘扩展卡什么的,稳定性好。
而PC呢,这些也能做,但是由于PC设计为通用平台,强调方便的扩展性,因此,冗余功能过多,售价有点贵,还有,强调了扩展性,稳定性就受影响,没有专一系统稳定性好。
但是不绝对,PC在某种场合也可以充作嵌入式设备使用的,但是还是要有一些特殊设计,比如说我们的系统没有显卡,板载,这就是考虑稳定性,我们的扩展板有光耦隔离,防止电流峰值冲击,我们的PC是整合式的小机箱,也是考虑作为一个设备,长期7*24小时工作,稳定性第一。嗯,最后我们还给这个小PC专门配了一个UPS,主要是维持稳定的电源。
说到这里,大家有注意到什么没有?
传统的PC,其实并不是计算机的全部,计算机造出来,天生就是用来改变人们生活的,PC仅仅是其中一个通用化的代表,它在设计之初,就是为了应对用户千变万化的扩展需求,因此它强调开放性,有点忽视稳定性。
其实IBM最开始设计PC架构时,更多是把它作为一个学习用机器开发出来的,或者说应对家庭日常计算,小规模计算开发的,你看它名字嘛,个人计算机,PC。
只是后来由于Intel和微软的力推,再加上业界众多厂商的推崇,PC成了事实上的通用计算机标准,才发展到今天。
但到了今天,当基础的CPU、内存、硬盘、GPU速度足够快,并且造价低廉,可以大规模应用到生产生活各个方面时,人们才发现,我们有很好的原件,但是如果每个设备都用PC的标准架构设计和生产的话,太贵了,也没必要。
我很难想象,一个交通灯管理控制盒,我要图形用户界面干什么?还有,一个mp4,你能放电影播音乐就好了,我为什么要为你设计插接口卡功能,来解决未来永远不可能存在的需求,比如说把你作为一个数据采集终端,读AD转换数值?
所以人们在最开始PC平台上的“加法”(不断扩展卡,扩展其应用)之后,又开始做“减法”,显卡不要,砍掉,硬盘不要,砍掉。。。
砍到最后大家发现,我们还遵守这个PC架构做什么?能完成业务就好了,于是,重新设计一个标准,更加贴合实际应用的,更小更稳定更便宜的,这不是更好?
于是,arm就产生了。
然后,大家说,PC有些好的经验我们还是要学习,其实是计算机领域的经验啦,要有个操作系统,它封装了不同厂商不同型号,但是功能相似的元件的差异性,提供统一的api界面,方便应用开发者做开发。
喏,嵌入式Linux就此产生。
这些东东,其实都是顺理成章的,只要沿着计算机几十年发展的路径看看就知道了。
我个人的理解,人类历史的发展,总是遵循“先解决有无问题,再解决好坏问题”这个客观规律的。嗯,这是我自己总结的哈,呵呵。
最开始计算设备很贵,于是先设计个通用的平台,大家都买得起,可以用它学会开发,这是PC,以后发现通用平台在解决具体实际问题时不好用,那就由设计一个专用平台,在拥有一定扩展性的基础上,强调稳定性,专一化。
大家觉得呢?
所以我一直说,平台不重要,语言不重要,解决问题是关键。
嗯,现在回到这个朋友的问题,嵌入式应用开发和PC上的应用开发,有多大差别?Android或者iPhone上开发个游戏,和PC上开发个游戏,有多大差别?
驱动,制造厂设计一款硬件,准备纳入到某个嵌入式平台,你给嵌入式Linux开发一个设备驱动,以便在这个上面开发的应用程序能识别这个设备并用好它,这和我们开发一块新的显卡,数据采集卡,插到PC上,为Windows写个驱动,有多大差别?
这也就是我前面说的“这个世界上,不存在真正的嵌入式开发!”的意义。
现在又很多培训班,专门打着嵌入式开发培训的旗号,嗯,3G开发也算,对于这类培训,我的理解不过是把通用的计算机软硬件设计知识,到嵌入式平台,或者更细化一点,3G手机平台上,做了一些具体的应用级调整,更加强调和突出了某些特性而已。
从知识体系上讲,这和普通大学的计算机软件专业课程安排,我个人的理解,并无本质的不同。
所以,对于希望从事嵌入式开发的朋友们,我有这么几点建议,不一定准确哈,大家做个参考罢了。
1、没有真正意义上的特定类型开发,所有的开发,基于的知识、原理都差不多,大家要做的,是把今天的知识学好,学扎实。
2、开发人员,特别是程序员,天生就应该会抽象,抽象是我们这个行业的重要特性,那么,开发抽象来看,其实大家都差不多。
3、嵌入式的特性是“专”,即对某个系统,某个平台,某个知识点,要求理解特别“深入”,能发现其性能的极致并展现出来,这是嵌入式本质的生存基础。因此,要求我们有钻研精神,能够就一个问题探讨到极致。
4、技术可以“专”,人不可以“太钻”,即视野不能窄了,嵌入式的应用,是要解决人们某个方面的问题,但是我们知道,凡是涉及生活中的问题的,其知识面不可能窄了,你看一个电动车都涉及多少个专业的知识?嵌入式开发一定是合作开发,有软件,有硬件,有自动控制理论,有传输,有图形图像解码,一个人很难做到面面俱到,因此,要善于跨专业学习,起码要理解别人行业的特性,合作中才能取得好效果,不能自顾自。
5、嵌入式开发容易取得好的回报,但是不容易出现个人英雄主义的成绩,这个心态要调整好,其实现在哪个大点的系统,是一个人能完成的,要有团队合作精神,做人要低调一点,虚心一点,多学一点,就能越走越远。
6、嵌入式开发更像软件开发的综合性学科展现,对个人能力提出了更高的要求,但是回报很丰厚,这一行是可以轻易产生百万富翁的,也是能让一个人做一辈子开发不愁没饭吃的,但是,没有付出就没有收获,嵌入式开发要成才,其学习曲线比单纯的软件开发陡很多,要做好吃苦的思想准备。
7、嵌入式求职建议不要把目光放在传统意义上的IT企业,很多制造业,很多设计研究单位,包括很多国企,他们都需要嵌入式综合性人才,因此,找工作时不妨眼光看开一点,说不定机会更好。
嗯,先这么多吧,我也是一边想一边写,可能不一定全面,大家先看看吧。
有问题再问。
肖舸(QQ:712123)