三入门篇(这篇最郁闷,掉电丢了一回,重新开始,算是纪念)
常碰到初学的朋友提出这样的问题:怎样学习嵌入式开发?自己不是这个专业,开始也没有从事相关的工作.经历了许多不同的道路后,才定下来做这方面的工作。不敢说可以全面准确地回答了这个问题,只能谈谈自己的经历和感受,与大家分享。
本人的专业是机电控制,工科出身,说句心里话,小时候理想是当科学家,从事基础研究,呵呵,现在还没彻底丢掉这个梦想,现实就是现实,可能好多人都有过自己的梦想。还是要感谢母校,给予自己基本的知识。回顾在校期间技术上唯一可以记得的就是毕业课题的单片机系统设计调试,虽也是简单的应用,跟作成产品相差还是很远,但感觉还是受益很多。毕业后做了几年MIS软件开发和简单的工业控制系统,根本就没有啥特点一提。
第一次接触嵌入式开发,是去一家小公司,做路由器单板BSP&Drivers开发,一开始就接触的是底层开发,呵呵,可能跟自己的单片机和软件编程经验有关吧。用得平台是PPC+Vxworks,跟硬件工程师一起,看板子,修改供应商提供的源码,忙得个晕头转向。除了要涉及基本的c语法,开发环境外,还要了解相关的通讯知识,自己根本就不了解,只能用到现学。还好这样的开发根本就不要太深入,基本就是修改。一个哥们C语言根本就不太懂,愣是将一块板子给跑起来了。系统方案都是芯片供应商提供,硬件原理图也提供,基本就是抄板子,软件开发包都有,不用改就可以跑上。所以说国人基本都是拿来主义,自己的核心东西很少,好多的所谓开发只是停留在这个层次。选择一个好的发展环境很重要,并且好多公司面试你的时候考的是你的基本功,如果都是这样的泛泛而为,对自己的发展很不利,要认识这一点,即使目前没有这样的环境,也要自己努力向这样发展。我毕竟有了工作经验,勤奋好学,呵呵,算悟性也高吧,最主要的还是我认识到了该怎样去做技术,作技术要把握实质,不要流于表面,要形成系统。可能有人不同意,但我说的是技术发展,好多人没有把技术作为终身的目标,所以还有更高的追求。但我想我这辈子就和技术离不开了。经历曲折痛苦,自己感觉终于可以说进入了正轨,虽然没有达到很高层次,但剩下得只是自己的努力和时间问题,还有就是外界对自己的认可和给予的机会。所以,自己的嵌入式入门是很曲折,很模糊的,但现在感觉很清晰了。
现在好多人都是专业出身,起码在学校期间就接触了好多相关的东西,并且对今后都有了好多了解,这是多么的幸福,要好好珍惜吧。
作嵌入式,首先要知道什么是嵌入式和做嵌入式需要的相关知识。
何谓嵌入式?我想好多人都不会给一个清楚的答案,包括许多高手。记得有一个定义,记不起来了。这里只能按照自己的理解来进行表达和总结,仅供交流。一提嵌入式,普遍印象是在mcu上跑东西。不错,可以这样理解。以前单片机和PC共存,单片机基本都是8位的,开发用汇编,后来出现了C51,没有操作系统。PC就是286、386、486等,加windows。差别太大,区分明显。技术发展后,单片机都达到32位了,尤其ARM的出现,使大多数人感受到了这个技术发展的成果,并且好多OS都可以移植上。但PC的技术相对发展放慢了,当然已经发展到了极高的水准。所以有人说是后PC时代。单片机和PC的区别不那么明显了。其实x86+windows linux也可以看作是一种嵌入式开发。是PC技术应用到了嵌入式,还是嵌入式融合了PC技术,这个不好说了,其实本来就是相同技术的一个最终融合过程。出发点因应用不同而显不同,后因技术的发展可以相互融合了。目前形成了这样的应用格局:单片机开发(如51 ,DSP,ARM7),没有操作系统;单片机+OS;PC+windows or linux。单片机的概念拓宽了,可以认为是MCU。所以最终还是硬件和软件的集成。硬件包括不同体系的CPU和外围电路,软件包括基本编程和OS。如果更加准确的说嵌入式开发,自己认为可以表示为:CPU+OS+APP。具体看自己的应用了。
所以,嵌入式涉及了软件和硬件知识,并且包含了行业应用。硬件涉及到了CPU架构和基本电路,软件涉及编程语言和操作系统。应用行业就包含了不同的硬件接口和软件接口。其实好多嵌入式开发主要还是在于所涉及应用行业技术的开发,基本的CPU+OS相对关注不多,方案也比较成熟,当然是应用的基础了,也是开发的一个基本平台。所以,嵌入式的进入点也分不同,你可以只关注应用方面的东西,比如应用软件的编制或者板子上特定应用电路,也可能你要做CPU基本系统和OS移植和驱动得开发,一般都有方案参考。
可以这样认为,x86+windows or linux是一种嵌入式开发,但这种系统资源比较多,考虑的条件相对要少些,其它真正的板子开发,资源相对少,开发时候尤其要注意这样的限制。这样的观念一定要存在。
现在可以总结一下入门要涉及的东西:编程语言(主要是C)及相关开发环境、操作系统(原理及移植过程)、CPU架构(基本架构及基本外围接口电路)。这只是大的分类,具体涉及的会很多,尤其和具体行业应用的相关知识,比如通信行业,要了解相关的架构和协议,图像处理要了解算法和原理等。一般入门应用编程比较容易些。相关具体细节可以举例如下:
1 硬件
除了要了解CPU架构外,基本的接口知识 (如时钟,FLASH SDRAM等),还要涉及具体应用接口,如PCI总线、USB总线,以太网接口、光通信接口、ADSL接口等,都要涉及相关知识。但最终要集成到一块板子上,高速板和非高速板,这就要涉及PCB布线,信号完整性等问题,还要考虑EMC、EMI、结构等,电源更是要考虑的。至于EDA只是个工具罢了,我们是要用这个工具来辅助我们完成我们的应用。这只是考虑到的几个例子,最终体现的是扎实的硬件基本功,如果你的基本功过硬,任何应用只要了解一下就可以很快地加以解决。有了基本知识,遇到问题就可以问问自己为什么这样,这些应用都是在基本理论基础上产生的,一些限制和条件包括出现的问题,都离不开基本的东西。比如我们都知道电源地要加宽尽量,可以抗干扰。我们是否问一下问什么?还是只是机械的记住这个经验?换个角度想,地有2个作用,一个是供电流的回流,二是提供一个基准电压。如果这2个作用出现问题,可能会影响电路特性,包括上面的元器件。所谓干扰就是这样产生的,干扰无非就是外界对线路和线路自身产生的,最终理论表现为阻性、感性、容性的变化。底线宽和窄,受到的干扰表现出的性能就不同,最终影响到整个电路,宽相对阻抗小,根据电磁理论,外界对其的电磁和辐射干扰产生的结果小,线路电流涌动影响也小。地的特性和电路特性变动,就会影响相关器件,每个器件都有自己的适用范围,所以超出了这个范围,就表现不稳定。这样思考,就可以把电磁电路等理论联系起来,包括干扰的种类和途径,解决的办法,进而采取的措施。上面仅是个例子,有可能不准确,但这样思考了,比单纯的记忆好多了,可以形成系统,宾且遇到问题也好查找和解决。当然这样要涉及的东西就太多了,但基本上在学校应该都学过,还要有学习新东西的准备。只是要认识到这个。
2 软件
软件可能基本就是C语言,当然其它语言应该类似。对于C的基本语法,这个不用说了。但这个是不够的。嵌入式上开发资源少,限制多,有好多值得注意的地方,比如内存,中断,任务调度等。这些是前提,如果恣意编码,肯定回有报应的。所以有这个思想,想实现这个东西,就要有过硬的C功底,才能完成,这是个基本的要求。如果光知道这个要求而没有能力来实现,只是个空谈。那末感觉自己C已经够用了吗?简单的一个例子,volatitle这个关键字啥含意?啥时候要记得用? Static的生存期是啥?inline的特点是啥?知识是无止境的。即使C过关了,你的算法过关了吗?这个是个很明显的东西,任何人都会打怵。有了C和算法的功底,只是个开始,具体应用中的技术了解吗?比如数据库技术、网络技术、信号处理等,只有非常了解才能写出好的应用程序。如果这些凑合着还能用,如何那?还是不够。前面说的只是C的表面应用,还要涉及操作系统和编译上的知识,比如bss段数据是啥?如何定义变量?程序是怎么在OS上加载运行的?这些都会影响到系统性能。如果在PC上编程可能涉及的不多,但嵌入式上你不考虑会很容易出现问题的。所以,软件也是个系统的问题,而不是只会C语言那么简单。当然如果你只想停留在这个表面上,可以不深入研究。驱动和操作系统移植还要涉及和硬件的接口,考虑的也很多。
另外可能会有一些其它相关的东西,比如调试技术及工具等,这些只是辅助的工具,会与不会的东西,不会涉及深层次的。
不禁写了这么些东西,可能很乱,可能没扣入门的题。只是自己的思路而已。嵌入式涉及的就是这些东西,要做,就要会这些东西。当然,入门可以从某一处入手,比如应用软件开发。但要了解自己,明白对自己的要求和方向,然后一步步做起。会了C语言和开发环境,可以编制简单的应用了,如果要做的更好,还要加强其它知识的了解。首先要认识到,然后才能去做。不要因为一点的进步而得意,以为都可以了。基本功是最主要的,有了这个才会作出好的东西。一个公司招聘新人往往考察的也是基本功,比如C语言、操作系统、编译原理、数据结构、电子电路、信号处理等,这就是所谓的一个人的素质,好的素质才能做好的工作。
入门篇可以结束了吗?不知道是否有了自己的收获,根据自己的情况来设计自己的未来吧。
(待续)
|