嵌入式arm简介
十年经验教你如何学习嵌入式系统(基于ARM平台)。
一、嵌入式系统的概念
重点理解“嵌入”的概念
主要从三个方面来理解。
1.从硬件上来说,基于CPU的外围设备都集成到了CPU芯片中。比如早期基于X86架构的计算机,CPU只有运算器和累加器的功能,所有芯片都需要通过搭建外部桥来扩展,比如串口,通过16C550/2的外部串口控制器芯片来实现。目前这种串口控制器芯片早已集成到CPU中,PC都有显卡。ARM Intel Xscale架构下相对高端的IXP网络处理器CPU集成了一个PCI控制器(可以配置为支持四个PCI从机,也可以配置为一个CPI从机);它还集成了三个NPE网络处理器引擎,其中两个对应两个MAC地址,可以用于网关切换,而另一个NPE网络处理器引擎支持DSL,只要在外面加一个PHY芯片,就可以实现DSL上网功能。IXP系列最高频率可达1.8G,支持2G内存,1G×10或10G×1的以太网口或Febre通道的光通道。IXP系列应该是intel基于ARM架构,以集成到Xscale内核为目标的最高处理器。
2.从软件上看,在定制的操作系统内核中选择应用,编译后内核下载到rom中。在定制操作系统内核时,选择的应用组件就是软件的“嵌入”。比如自定义内核时,WinCE会有相应的选择,包括写字板、PDF、MediaPlay等等。如果我们选择,我们可以在ce启动后的界面中找到这些东西。如果是以前PC上的windows操作系统,大部分东西都需要重装。
3.真正的“嵌入”是通过将软件内核或应用文件系统烧录到嵌入式系统硬件平台的ROM中来实现的。
以上定义是我六七年前给嵌入式系统下的定义,重在理解。书中有很多定义,但是没有人敢说他们的定义在这个领域是非常准确的,包括那些专家学者。毕竟嵌入式系统是计算机范畴下的一门综合学科。
2.嵌入式系统的分层和专业分类。
嵌入式系统分为四层:硬件层、驱动层、操作系统层和应用层。
1,硬件层,是整个嵌入式系统的基础。如果现在对微控制器和接口比较熟悉,可以用C和汇编语言编程,那么从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础。一个优秀的驱动工程师应该能够自己理解硬件电路图并完成CPLD的逻辑设计,同时对操作系统内核及其调度也相当熟悉。但硬件平台是基础,增值靠软件。
硬件层比较适合电子、通信、自动化、机电一体化、信息工程专业的人。需要掌握的基础专业知识是单片机原理与接口技术,微型计算机原理与接口技术,C语言。
2、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要对操作系统内核非常精通,这样在系统调用的时候,他写的驱动不会独占操作系统时间片,反而导致其他任务不能动,不懂操作系统内核架构和实时调度,没有好的驱动编写风格。很多人可以像大多数书里提到的那样,通过添加驱动程序来实现。但可能连一个初级驱动工程师的水平都达不到,所以这样写出来的驱动就好比我们在windows下运行完一个程序后打开它的时候,要么中断前面的程序,要么等一会儿再运行后面打开的程序。想成为一名优秀的司机,没有三四年的基本功,不学习操作系统内核的最后几个部分是不容易成功的,但是你的工资是嵌入式系统四层中最高的。
驱动层比较适合电子、通信、自动化、机电一体化、信息工程专业的人,尤其是计算机偏架构。除了硬件层所具备的基础学科外,还应该非常精通数据结构和算法、操作系统原理和编译原理。
3、操作系统层,对于目前的操作系统层来说,可能只能说是简单的移植,很少有人是从编写的操作系统中来的,或者说是没有手脚的编写操作系统。这项工作大部分是由驾驶工程师完成的。操作系统负责调试系统任务,管理磁盘和文件,嵌入式系统的实时性非常重要。据说,XP操作系统花了微软300个人两年的时间才完成,而总工作量是600人年。中科院软件所的操作系统,估计要几百年才能出来。所以这部分工作相对来说意义不大。
4.应用层相对容易。如果能调用windows下的编程接口函数,只会改变操作系统下的编译开发环境。如果Jave参与编程也是如此。嵌入式系统中涉及算法的都是由专业的算法人来处理,并不一定要归入嵌入式系统的范畴。但如果涉及到嵌入式系统下的嵌入式数据库、基于嵌入式系统的网络编程以及基于某个应用层(如SIP、H.323、Astrisk)的协议应用开发,就比较复杂和困难。
第三,目标和定位。
先有目标,再定位。
学习ARM,从硬件角度来说,一方面是学习接口电路设计,另一方面是学习C语言的汇编和板级编程。从软件角度来说,需要学习基于ARM处理器的操作系统层面的驱动和移植。这些对于初学者来说一定是很清楚的,无论是从硬件上,还是从操作系统对应用的熟悉程度上,但是不管你学的是什么,只要不是操作系统级别以上的纯API的应用编程,硬件寄存器应该是可以理解的,板级汇编和C编程应该是可以理解的。所以针对嵌入式系统的硬件层和驱动,ARM的接口电路设计,ARM的C语言和汇编语言的编程调试开发环境还是需要掌握的。
所以对于新手来说,要把握好方向,自己的目标是什么,想去什么层次。然后,我们将开始学习ARM相关嵌入式系统的两个实用层面:硬件层和驱动层。无论我们学好哪一门,都会很有前途。
如果要从嵌入式系统的应用层面去走,可能离ARM等系统还很远。应该重点关注嵌入式操作系统的环境应用和相应的开发工具链,比如WinCe操作系统下的EVC应用开发(类似于windows下的VC)。要想有所突破,要依靠一些音视频协议,比如VOIP领域基于SIP或H.323协议的应用层开发,或者基于嵌入式网络数据库的开发等。
对于新手来说,要量力而行,不要因为司机工资高就以此为方向。要结合自己的特点。在那个级别,有嵌入式系统四个级别的专家,当然专家也有高薪。我在硬件层工作。以前个人所得税从我一个月工资里扣了近三千块。当然,我一方面扮演了工程师的角色,另一方面也扮演了监工和角色。我一个人干了两个职位。可能跟我PK硬件的人很少,让我拿那么多工资。
第四,开发系统选择。
很多初学ARM的人都希望有一个自己能用的系统,但是生活中会有一个误区,认为处理器版本越高,性能越高越好,就像很多人觉得ARM9和ARM7好一样。我觉得新手在这方面还是要理性一点。开发系统的选择最终取决于他们的嵌入式系统方向,是做驱动开发还是做应用,还是做嵌入式系统的硬件层设计和板级测试。如果要从操作系统层面或者应用层面去做,无论是驱动还是应用,当然处理器的性能越高越好,但是这个东西是很难自己学会的,不是几个月或者半年两年就能做好的。
从某种意义上说,拜托,ARM7和9的区别就在于在一些功能指令集上更丰富,主频更高,比如286和386。对于用户来说,可能并没有发现什么,只是觉得速度有点快。
ARM7更适合想从硬件层面走的人,因为ARM7系列处理器的MMU很少,很容易控制。比如S3C44B0可以轻松关闭缓存,内部接口寄存器也很好理解。各种接口可以由硬件程序或AXD单步命令行指令控制。基于51单片机的思想,很容易理解他,把他当成32位单片机,从而消除了很多51工程师想成为嵌入式系统硬件ARM开发工程师的困惑,这样就不会被业内一个不真正懂嵌入式系统的烂公司带到操作系统层面,让他们望而却步,让行业更加缺乏这方面的人才。
嵌入式系统在硬件设计和软件驱动上都非常注重接口。选择平台还取决于处理器的外部资源。接触外部资源越多,越熟悉,未来就业成功的几率就越高。这就是招聘中提到的“相关技能”,因为一个人不可能在短短几年内接触到所有的加工商。雇主使用的处理器对我们来说可能是全新的。就拿台湾省几十家小公司生产的ARM处理器来说(市场价几千万),也是非常好用的。但是这些处理器并不通用,所以使用这些处理器的公司只能招聘有相关工作经验的人。相关工作是什么?硬件方面是外围接口设计,软件方面是操作系统中相关的接口驱动和应用开发经验。我做生意已经将近十年了。2000年ARM出现的时候,我一天就开始做ARM7,然后直接上了Xscale(这个板在ARM10-11之间)。我做了五年,招了几百多人面试。这些方面我还是深有体会的。
个人觉得三星的S3C44b0比较适合新手。为什么这么说?因为接口资源丰富,技术成熟,资料多,应该很适合初学者。如果有问题,可能很容易找人帮忙解决。因为大部分人都比较熟悉,就像51单片机一样,有N多位专家可以帮你,相关问题可以很快得到解答。不过业内认为这胳膊烂了,但对于新手来说,是好事。
所以开发系统的选择取决于自身未来的发展方向、开发板接口资源以及行业的普适性。
动词 (verb的缩写)如何看待培训?
首先说一下我自己。本人从业近十年,从国内嵌入式系统行业起步,一直站在嵌入式系统行业的最前沿。我设计过很多高端嵌入式系统平台产品,为很多公司提供过解决方案。离职前为从事网络电话的美国公司设计IP-PBX。做过项目经理、项目总监、技术总监、部门经理,积累了很多人脉,积累了多年经验。考虑到学生就业和公司招聘不匹配,公司招不到人,学生和刚毕业的工程师不好找工作,所以我们成立了智天星科技有限公司,开展嵌入式系统的教育培训。
因为一线科研人员接触不到一线老师,国内缺乏嵌入式人才,国外大学的技术领先于行业公司,而国内的情况是行业公司的嵌入式系统技术遥遥领先于大学。为了搭建行业与高校之间的桥梁,为大学生带来先进技能,为学生打造就业竞争的王牌,为行业工程师实现自我创造的机会,我辞去了年薪20多万的工作,接受嵌入式系统培训。
对于培训来说,就是花钱买时间。很多工程师喜欢自学,认为培训不值得。这也是可能的。纯粹为了赚钱的训练当然不会太值钱,但是对于力量型训练,他们可能会损失很多。不知道他们有没有算过这笔账。如果一周的培训能给他们带来两年自学就能掌握的知识,那么培训后他们会花三个月到半年的时间消化培训内容。这样他至少会省下一年半的时间去学习其他的东西或者重新到另一个高度工作,那么最迟两年后他就会拿到与他级别对应的工资,也就是工资与级别的关系比同组人缩短了一年,月薪至少是1000元,然后培训费用至少是1000元,这也省下了一年,不管是不是休闲,继续。
另一方面,新人的培训相当于提前给自己买了失业保险,有师傅领着他们入道。今年暑假我们班最小的学生是大二,他今年才大三。他这学期刚学了单片机,但是现在在ARM的编程工作已经很丰富多彩了。毕业一年多会失业吗?
再者,通过培训,你可以知道很多业内普通人不知道的东西,同时也给自己找了一个高手。比如两个工程师分别用S3C2410和PXA255做手持设备,两个人都工作了四年,然后出去找工作。他们之间的工资差别可能最多是两倍。为什么?这是不为业内普通人所知的规则。2410是民品,被业界烂透了。做产品的时候对成本很敏感,当然对人才成本也很敏感。PXA255是英特尔的东西。一个255的CPU可以买三个2410,一直被业界定义为贵族产品。用的公司都是大公司或者为军队服务的公司,不在乎成本。
我觉得给自己找了一个好老师是真的,因为同级别的工程师之间存在潜在的竞争关系,很多人不愿意把自己知道的东西教给别人,这就意味着他会失业,也就是所谓的教会学徒饿死,而对于我们来说,不存在这种关系。我在嵌入式系统平台的设计上已经达到了一定的程序。目前我在国内技术上很难突破自己,所以很多东西都是对大家开放的。比如我不说界面设计中提到的顺序界面,我觉得只有10%的人能知道。
6.成为高级嵌入式系统硬件工程师的技巧。
至于硬件,有几个方向。简单信号分为数字信号和模拟信号。模拟很难做,通常需要很长时间的经验积累。单一的电阻或电容不够精确,可能会使信号偏差很大。所以,年轻人做的少。随着技术的发展,出现了数字模拟电路,比如手机的Modem射频模块,都采用了成熟的成套芯片。当时全球只有两家公司有这项技术,觉得自己模拟功能不强的人不适合做这个。如果他们真的能拿到手机的射频模块,只要达到一般水平,他们的月薪可能在15K以上。
另一个是数字部分,大体方向可分为51/ARM单片机、DSP和FPGA。国内FPGA工程师大多在ic设计公司从事IP核的前端验证,前途并不明朗。就算是一个IC前端验证工程师,也要好几年才能胜任。DSP的硬件接口比较定型,如果不靠近驱动或者算法,前途不会太大。而ARM单片机内容较多,行业产品占用量大,应用人群广,所以就业空间极大,而接口设计是最能体现硬件设计水平和水平的,是每个高级硬件工程师互相PK,判断水平的依据。界面设计最重要的是时序,而不是简单的连接。比如PXA255处理器的I2C速度需要100Kbps。如果一个I2C外围设备连接到它,设计将不可避免地失败。这样的情况很多。比如51单片机可以连接总线上的LCD,但是为什么这个LCD不能挂在ARM总线上,Winband的SD卡控制器可以连接ARM7总线,但是为什么这个控制器不能连接ARM9或者Xscale处理器?这些都是问题。所以接口不是简单的连接,要看时机和参数。一个优秀的硬件工程师,应该能够在没有参考方案的情况下,设计出性价比更好的产品。根据现有方案,也需要进行适当可行的削减,但不是随机的。我遇到过一个工程师,在方案里把DC芯片从5V换成1.8V,直接换成LDO,有时候会烧好几个CPU。前几天有人让我帮他们优化他们之前基于PXA255平台的手持GPS设备的程序。我问了一下情况。地图存储在SD卡中,SD卡与PXA255的MMC控制器之间的SPI接口导致地图读取速度非常慢。这种情况是设计的严重缺陷,不是程序问题,所以我提了几点建议让他们更新再试。所以,想要成为一名优秀的工程师,需要把握系统的完整性,了解现有的电路。换句话说,给你一套电路图,你能看懂多少?如果80%以上不懂,说明你远不是一个优秀的工程师。其次是电路的调试能力和图纸核对能力,但最基础的能力还是原理图设计、PCB图和逻辑设计。这是指硬件设计工程师。从上面的硬件设计工程师中,我们还可以划分出ECAD工程师,也就是专业的PCB制图工程师和EMC设计工程师,帮助人们解决EMC问题。硬件工程师是板级测试工程师,也就是有很好C语言知识的硬件工程师。在电路板调试的过程中,他可以通过自己编写的测试程序来验证硬件功能。然后交给基于操作系统级别的驱动开发者。
总之,硬件的内容很杂,我练一练就会成为高手。我经常给人做方案评估,很多资深硬件工程师设计的东西经常被我否定,所以工程师这样做就会得罪一些人,但是硬件确实有很多不为人知的地方,这让很多资深硬件工程师很困惑。
嗯,高级硬件工程师必须具备那些技能。首先,他们必须掌握EDA设计的辅助工具,如ProtelORCADPowperPCBMaplux2ISE和VDHL语言,并且必须能够使用这些工具进行绘图和画板进行逻辑设计。然后是界面设计和图纸审核能力,然后是调试能力。如果他们能去做总体方案设计,基本就能成为高级工程师。
硬件靠经验和积累。十年磨一剑,百年磨一针。