(文章整理自EDA365网友分享)
1.嵌入式系统的概念
主要从三个方面重点理解“嵌入性”的概念。
1、从硬件角度:将基于CPU的外围设备集成到CPU芯片中。 例如,在早期的基于实现的计算机中,如串口,都是通过外部的16C550/2串口控制芯片来实现的,而现在的串口控制芯片早已集成到了CPU中。 有些PC有显卡,大多数嵌入式处理器都有LCD控制器,但从某种意义上来说它们相当于显卡。
类ARM Intel Xscale架构下比较高端的IXP网络处理器CPU集成了PCI控制器(可配置支持4个PCI从设备或将自身配置为CPI从设备); 它还集成了3个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中,实现真正的“嵌入”。
上面的定义是我自己在6、7年前重点理解的对嵌入式系统的定义。 书上有很多定义,但在这个领域,没有人敢说他们的定义是非常准确的。 包括那些专家学者,因为嵌入式系统毕竟是计算机领域的综合性学科。
2.嵌入式系统的分层和专业分类
嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。
1、硬件层:
它是整个嵌入式系统的基础。 如果你熟悉微控制器和接口,并且会用C和汇编语言进行编程,那么从嵌入式系统的硬件层转移过来会相对容易。 硬件层也是驱动层的基础。 一个优秀的驱动工程师必须能够看懂硬件的电路图,并能自己完成CPLD的逻辑设计。 同时,他必须对操作系统内核及其调度非常熟悉。 但硬件平台是基础,增值要靠软件。
硬件层比较适合电子、通信、自动化、机电一体化、信息工程专业的人。 他们需要掌握的基础专业知识包括单片机原理与接口技术、微机原理与接口技术、C语言。
2、驱动层:
这部分比较困难。 驱动工程师不仅要能看懂电路图,还要对操作系统内核非常精通,这样他写的驱动程序才不会在系统调用时独占操作系统时间片,导致其他任务无法完成。 动作,不了解操作系统内核架构和实时调度,也不具备良好的驱动编写风格。 按照大多数书上介绍的添加驱动的方法,很多人都能做到,但即使是初级驱动工程师也不一定能做到。 无法达到水平。 当应用程序调用驱动程序时,就像我们在Windows下打开一个程序并运行它一样,当我们打开另一个程序时,它要么会中断前面的程序,要么会等待一段时间再运行它。 打开程序。 如果你想成为一名优秀的司机,你不需要三四年的经验,也不需要研究几年操作系统内核。 想要成功并不容易,但是薪资是四层嵌入式系统中最高的。
驱动层比较适合电子、通信、自动化、机电一体化、信息工程专业的人,特别是计算机体系结构专业的人。 除了硬件层的基础学科外,还需要对数据结构、算法、运算有深入的了解。 你必须非常精通系统原理和编译原理。
3、操作系统层:
对于操作系统层来说,目前只能说是简单的移植,很少有人来自于已经写好的操作系统,或者写出缺胳膊少腿的操作系统。 大部分工作是由驱动工程师完成的。 操作系统负责调试系统任务以及管理磁盘和文件,嵌入式系统的实时性非常重要。 据说微软投入了300人,花了两年时间才完成了XP操作系统。 总工时为600人年。 据估计,中科院软件所的女娲希望操作系统也花了数百人年才完成。 因此,这部分工作是比较没有意义的。
4、应用层:
相对来说还是比较容易的。 如果你知道如何在Windows下调用编程接口函数,那么操作系统下的编译和开发环境就会相应改变。 如果涉及到Java编程也是同样的道理。 嵌入式系统中涉及的算法是由专门研究算法的人来处理的,并不一定属于嵌入式系统的范围。 但如果涉及到嵌入式系统下的嵌入式数据库、基于嵌入式系统的网络编程、基于某些应用层面的协议应用开发(如基于SIP、H.323、Astrisk),那就比较复杂和困难了。
三、目标与定位
先有目标,再给自己定位。
学习ARM,从硬件角度来说,一方面是学习接口电路设计,另一方面是汇编和C语言的板级编程。 从软件角度来说,需要学习操作系统级驱动以及基于ARM处理器的移植。 这些对于初学者来说一定要清楚,要么从硬件开始,要么从操作系统对应用的熟悉程度开始,但不管学什么,只要不是操作系统之上纯粹的基于API的应用层编程硬件层面,你仍然需要能够理解寄存器之类的东西,你仍然需要了解板级汇编和C编程。 因此,对于对嵌入式系统的硬件层和驱动感兴趣的人来说,ARM的接口电路设计、ARM的C语言和汇编语言编程调试开发环境还是需要掌握的。
所以软件嵌入式设计,初学者一定要把握好方向,自己的目标是什么,要走向哪个层次。 然后开始学习ARM相关嵌入式系统比较实用的两层,硬件层和驱动层。 无论哪一层学好,你都会有光明的未来。
如果要从嵌入式系统的应用层面入手,可能距离ARM等系统还很远。 必须重点关注基于嵌入式操作系统的环境应用和相应的开发工具链,比如WinCe操作系统下的EVC应用开发(类似于Windows下的VC),想要有所突破,依赖一定的音视频协议,如VOIP领域基于SIP或H.323协议的应用层开发,或者基于嵌入式网络数据库的开发等等。
对于初学者来说,应该量力而行。 不要认为驱动层的薪资高而以此为方向。 他们应该结合自己的特点。 嵌入式系统的四个级别中的每个级别都有专家。 当然,专家也对应着高薪。 我在硬件层面工作。 以前我每个月的工资被扣了近3000元的个人所得税。 当然,我一方面扮演工程师的角色,另一方面扮演主管和人员的角色。 两人单独在这个岗位上工作,但我的工作时间仅限于此。 在硬件方面可能很少有人能和我竞争,这也是我拿这么多工资的原因。
4. 开发系统选择
很多ARM初学者都希望有一个自己能用的系统,但往往有一个误区,认为处理器版本越高、性能越高越好。 就像很多人认为ARM9和ARM7更好一样。 我认为初学者在开始这个领域时应该明智。 开发系统的选择最终取决于他们想要在嵌入式系统中走哪个方向,是做驱动程序开发还是应用程序,或者是做嵌入式系统硬件层设计和板级测试。 。 如果要从操作系统层面或者应用程序层面入手,无论是驱动程序还是应用程序,那么当然处理器性能越高越好。 然而,自学这个东西是非常困难的。 不需要几个月、半年、一年的时间。 两年内就能完成的事情。
从某种意义上说,ARM7和9的区别就是丰富了一些功能指令集,提高了主频,比如286、386。对于用户来说,可能察觉不到什么,只能感觉速度有点快速地。
ARM7更适合那些想从硬件层面走的人,因为带有内部MMU的ARM7系列处理器很少,而且更容易控制。 例如,S3C44B0可以很容易地关闭Cache,并且内部接口寄存器非常小。 很容易理解,可以使用硬件程序控制或AXD单步命令行指令来控制各种接口。 基于51单片机的思想,很容易理解为32位单片机,从而省去了很多51工程师。 那些想成为嵌入式系统硬件ARM开发工程师的人都是一头雾水,这样才不会被业内一家不太懂嵌入式系统的烂公司带到操作系统层面,把他们吓跑,让业界更缺乏这方面的人才。
嵌入式系统无论硬件设计还是软件驱动都非常注重接口部分。 选择平台时,还需要考虑处理器的外部资源。 接触外部资源越多、越熟悉,未来成功就业的机会就越大。 越高,这就是招聘时所谓的“相关技能”,因为一个人不可能在短短几年内接触到所有处理器,而招聘单位使用的处理器可能是我们从未接触过的根本没有看到。 是的,就拿台湾几十家小公司生产的ARM处理器来说吧(市价几千万)。 它们也很容易使用,但是这些东西的通用性不是很强。 使用这些处理器的公司只能招聘具有相关工作经验的人,那么什么是相关工作经验呢? 就硬件而言,是指外围接口设计,就软件而言,是指操作系统相关接口驱动和应用程序开发的经验。 我在这个行业工作了近十年。 2000年ARM出现的时候,有一天我就开始做ARM7,然后直接上Xscale(这个版本在ARM10-11之间)。 我在那里工作了五年,招募和面试了数百人。 对于这些方面我还是有很深刻的认识的。
我个人认为三星的S3C44b0更适合初学者。 为什么这么说呢? 因为接口资源比较丰富,技术成熟,资料也很多,应该很适合初学者。 如果遇到问题,可能很容易找到人来帮助解决,因为大多数人都熟悉它们,就像51型单片机,有N多位。 专家可以为您提供帮助,相关问题也可以得到快速解答。 因此,业界认为这款ARM不好用,但对于初学者来说,却是一件好事。
因此,开发系统的选择取决于您未来的目标、开发板接口资源以及行业通用性。
5.成为高级嵌入式系统硬件工程师所需的技能。
硬件有几个方向。 纯信号分为数字信号和模拟信号。 模拟比较难做,一般需要长时间的经验积累。 单个电阻或电容值的精度不够,可能会导致信号出现较大偏差,所以年轻人做的比较少。 随着技术的发展,出现了模拟电路数字化。 例如软件嵌入式设计,手机的Modem射频模块均采用成熟的芯片。 当时世界上只有两家公司拥有这项技术,他们觉得模拟功能不是很强的人不适合做这个。 如果他们真的能拿到手机的射频模块,只要达到平均水平,他们的月薪可能会在15K以上。
另一类是数字部分,一般可分为51/ARM单片机类、DSP类、FPGA类。 国内FPGA工程师大多在IC设计公司从事IP核的前端验证工作。 这部分就不搞了。在门层面,未来还不是很清楚。 即使成为IC前端验证工程师,也需要几年的时间才能胜任。
DSP硬件接口比较定型。 如果不向驱动或者算法靠拢,未来不会太好。 ARM微控制器类别内容非常多。 该行业产品占有量大,使用范围广。 因此,就业空间巨大。 最能体现硬件设计水平和水准的界面设计,是高级硬件工程师相互较量的地方。 判断水平高低的依据。 接口设计最关键的是时序,而不是简单的连接。 例如,PXA255处理器I2C需要100Kbps的速度。 如果连接一个无法达到100kbps的I2C外围设备,必然会导致设计失败。
这样的情况还有很多。 比如51单片机可以在总线上挂一个LCD,但是为什么这个LCD不能挂在ARM总线上呢? 还有一款Winband SD卡控制器可以连接ARM7总线,但是为什么这个控制器无法连接ARM9或Xscale处理器,这些都是问题。 所以,接口并不是简单的连接,它取决于时序和参数。 一个优秀的硬件工程师应该能够在没有参考方案的情况下设计出成本和性能更好的产品。 依托现有方案,进行适当的可行性剪裁,但不能一刀切。 我遇到过工程师将方案中的5V DC芯片转换成1.8V DC芯片并直接用LDO替换时,有时会烧毁CPU。 前几天,有人找我帮忙优化他们之前基于PXA255平台的手持GPS设备的程序。 我询问了一下情况。 地图存储在SD卡中,SD卡与PXA255 MMC控制器之间采用SPI接口,导致地图读取速度非常慢。 这种情况是设计上的严重缺陷,而不是程序的问题。 因此,我提出了一些建议,并要求他们更新并尝试一下。
因此,如果你想成为一名优秀的工程师,你需要掌握系统的完整性并了解现有的电路。 换句话说,如果给你一组电路图,你能理解多少? 如果你不能理解80%以上,说明你距离优秀的工程师还很远。 其次是电路调试能力和审图能力,但最基本的能力是原理图设计、PCB绘图、逻辑设计。 这是指硬件设计工程师。 从上面的硬件设计工程师中,我们还可以区分出ECAD工程师,他们是画PCB板的专业工程师,以及EMC设计工程师,帮助人们解决EMC问题。
硬件工程师的上一级是板级测试工程师,他是具有良好 C 语言技能的硬件工程师。 在电路板调试过程中,他可以通过自己编写的测试程序来验证硬件功能。 然后根据操作系统层面交给驱动开发人员。
总之,硬件的内容非常复杂。 凡是练过硬件的人都会成为大师。 我经常为他人评估解决方案。 很多高级硬件工程师设计的东西常常被我不屑一顾,所以工程师可以做我做的事情。 说到这里,有些人会觉得被冒犯了,但是硬件确实有很多不为人知的事情让很多资深硬件工程师感到困惑。
那么高级硬件工程师必须具备哪些技术能力呢? 首先,必须掌握ProtelORCADPowperPCBMaplux2ISE、VDHL语言等EDA设计的辅助工具。 他们必须能够使用这些工具绘制逻辑设计的画板,然后他们必须具备审查界面设计图纸的能力。 另一件事是调试能力。 如果你能做到整体方案设计,你基本上就成为高级工程师了。
硬件靠的是经验和积累。 十年磨剑,百年磨针。
终于花了一上午的时间整理出一个月前想写的东西。 希望对热爱嵌入式系统开发的工程师和学生有所帮助。
【如果喜欢EDA365的文章,记得关注点赞哦! 】