做嵌入式,如果爱就全心投入,否则就放弃!

不少人或许还并不是很清晰地知道什么是嵌入式,IEEE对它定义的原文是:DevicesUsedtoControl,MonitororAssisttheOperationofEquipment,MachineryorPlants。从一个嵌入式软件工程师的角度来看,简单地说,就是对一些硬件进行编程,使其完成既定功能的操作。

接下来我就结合自己的亲身经历,谈一谈对嵌入式学习、择业以及发展前景的一些感想。

下面是创客学院的免费的课程资料,想学的小伙伴们自取哈

http://www.makeru.com.cn/video/1863.html?s=144282

01 6个对话让你重新认清真相!

嵌入式是个大坑一直很火。但是也有人跳出来说,嵌入式不是大坑。嵌入式究竟是不是个大坑呢?今天就听一下21ic 资深网友 icecut 是怎么看的!

有90%的人,觉得嵌入式是个大坑。因为他们赚钱少,刚毕业也就赚5000元/月,而互联网就可以拿到一万/月。工作任务简单,用一些简单的 c 语言写着永远大不了的代码。重复地做相同的事情。每一个新产品看起来都差不多,但是每次都要学不一样的东西,比如换一个adc 芯片,用的不同的厂家,所有的软件都不一样。甚至相同厂家也有这种情况,比如M3和 M4的 mcu,都是 arm,内核不同,片内外设就不一样,就要重新学片内外设的操作,投入非常大,却得不到应有的回报。不如去转互联网。你可以什么都不会,就去 github 之类的网站找个例程,随便改改,差不多满足需求,老板觉得过得去,用户觉得还能用。你就能拿别人的作品赚自己的工资。前期投入就是花2w 元,跟某机构学一下套路,然后给你一个3年经验的离职证明和3年前的一张毕业证。而这些人就成天喋喋不休的来炫耀,自己赚钱多,自己笨没关系,照样复制粘贴就赚钱。

你是不是也在羡慕这种人呢?可是你已经毕业多年,没有体力去加班干互联网的工作。甚至没有2w 元的存款去买套路和假的工作证明。甚至你已经习惯了脚踏实地干活,不会在面试上吹嘘。。。。。你羡慕着别人赚钱,你默默的接受被嵌入式坑的日子。。。。

而20%的人,又觉得嵌入式是可以拯救的。比如小 i 的观点,他认为嵌入式是下一个爆发地。你想想网店最后不还是在做实体店么?京东是沃尔玛投资的,最后京东又投资了永辉。互联网基于手机的日子快要过去了。随着互联网公司的裁员和倒闭,他们的好日子快结束了。当然,物联网发展还是蜗牛爬,嵌入式的未来还需耕耘。

在过去的几年里,小 i 一直在帮助大家进步。所以有许多认识可以跟大家聊。

  1. 过高地估计了自己,错误的估计了行业。这是我与一个二三线城市学生的对话。他们理解了一点嵌入式技术,就觉得自己比大多数同学水平高了。不需要再去听我的。他们觉得那些嵌入式技术就会在招聘会上胜出。过高的自信,让我真的无言以对。而我看来,他们的水平,离着能干活至少需要有一年的实践。所以他们肯定是觉得自己被坑的。如此牛逼的自己,却干这么简单却做不好的任务。

  2. 这是一个与一线二本学生的对话。当然小 i 也来自二本学校。我那时候也是一直在自学,花掉了好多钱。买原件买板子,顺便也在学校的小作品里赚点钱。现在学校有钱了,这种活动很多。实验室的设备也更新了,并且随便用。每一个人都在忙,忙的都听不进我的指点。我也算一个学术型工程师了。可是他们做着不稳定的实验,从来没心做好一个作品。因为稳定这两个字,付出太大了。他们没有耐心去完善。 可以他们自己觉得更加自信,甚至许多人还不怎么懂就去参加各种竞赛。当然也有一些竞赛称为了灰色产业链的最后一环。自己做代码和板卡卖给学生,还真赚钱。有人要证书,有人要金钱,何乐而不为的交换呢?

  3. 这是一个与毕业一年的初级工程师的对话,他来自二线城市,通过加班抗住现有的工作。一个问题调试好几年确不得要领,却是当年学校里的佼佼者。我告诉他嵌入式行业是个会者不难,难者不会的的领域。我给他一个提示,让他能够不用加班的完成任务,谁不想让自己的工作更加舒适呢?他已经能认识到嵌入式不是大坑,而是自己技术上太多欠缺。实验室产品和稳定的产品,是20%和80%的距离。而优秀的产品,最后的20%,付出的要超过100%的努力。新手,熟手和高手,就是20%,80%和100%。代码在小 i 手中游刃有余,bug 在小 i的眼里,没有藏身之处。而这些,可能新手觉得不就是代码嘛,你写的我能看懂,也没什么高深之处。而 bug 在新手的眼里就是云深不知处了。熟手的眼里,小 i的代码是规范的,思想是严谨的。而 bug 在熟手的眼睛里是若隐若现的。你若急躁,它便消失。你白天在找,晚上也在找。可是,总要很久才能找到。从20%到80%你需要一个严格的领导,和一个加班的心态。实践到了就熟悉了。最后的20%你需要一个严谨的导师,把你打回原形,重新来过。人生若只如初见,一切只能从头再来。因为你曾经积累的经验,都没有用。在此也要感谢我工作中的老师。一位足矣。而80%这座山,挡住了90%的人,多少风流人物,就挂在了这个山头。我说你不会,你入门的都不会,你说你会了,你都做过很久了。佛曰:放下。只有放下了你自己,才能接受整个世界。三人行必有我师,可是你总是想,三人行,你是别人的老师。你是被嵌入式坑的那个老师啊。你在努力,但是怕爬不出这个坑。而这个孩子,谦虚谨慎,努力的认真的学习着。会好的,总有一条路,让你爬到岸上看风景。

  4. 这是一个与一线城市的资深工程师的对话,来自一流学校。很少人,是这么过来的,他们的眼里没有熟手这个概念。若做必是最好的。当时我所在的公司招聘,约他晚上过来面试,在一个小会议室里,一群被坑了千百遍的土鳖组成的面试团队听他在上面侃侃而谈。我以为他们又请到了高手外援。。。。。。从他那里,我知道了一些书,都来自全球顶尖公司的技术大师或者顶级高校的重量级教授。这些书永远成不了畅销书,也永远进不了排行榜。不要问我是什么书,因为你买了,也只能当神供着。如果你能力够了,书自然会与你偶遇。路迢迢其修远兮,你只抱怨不求索。

  5. 这是与心的交流。对得起自己,就对得起世界。我学习的时候,还流行教会徒弟饿死师傅。而我喜欢一个新的分享的世界。去年,给21ic 提供了三个视频,stm32从入门到精通, 小 i 教你学 usb, linux 驱动教程。在线学习如日中天,我的每一个视频都对得起我的心。当年我要是这么学,就会更快更好。谈感情伤钱,这是我的廉价视频。后面会推出符合我讲述知识等价的视频。好东西一定是贵的。

  6. 最后写给那些坑了这个行业的人,不好好写代码,把 bug 留给别人,别人加班给你调试 bug,让整个产品延期。我曾经被邀请参加一个无线遥控产品的调试,根本不懂无线通信的人,随便做了一个产品。明天就要演示了。租了好大的展厅去开发布会,可产品就是距离不够。。。。许多人,坑了嵌入式,却在说嵌入式坑了你。。。

02 嵌入式学习需要肯下功夫

嵌入式应该属于门槛比较高的技术方向,因为你所要打交道的不只是软件,很多的时候还需要了解硬件的知识,只有了解它的工作原理,才能正确地对其进行编程。一些错误的理解可能会导致运行结果与预期相去甚远,所以说嵌入式是一项软硬件紧密结合的技术方向。

作为一名嵌入式工程师,需要了解的知识包括如下方面:硬件部分,电路结构、芯片逻辑设计、时序等;软件部分,操作系统、编译原理、汇编语言、高级语言等等。要学习的知识可谓多之又多,想在短时间内掌握这些知识并不容易。在过往的经历中,确实见过不少同学缺乏足够的耐心,或者早早失去兴趣,从而放弃了嵌入式行业,转投其他领域。

但是,从某种角度来说,嵌入式又是相对简单的,因为所见即所得。只要对硬件进行一些简单的编程,就可以看到一些特定的行为,及时的反馈结果也是非常的直接。从嵌入式软件来讲,一些简单的嵌入式系统并没有大型软件那么高的复杂度,几个特定行为的实现不过是对一些寄存器进行编程而已,所以从简单系统入手,有助于建立起对嵌入式学习的信心,我也曾经是从0到1,对此有着深刻的体会。

从容易到困难,是学习的一般规律。这个过程没有问题,但是必须强调的是,从一个初级嵌入式工程师到高级嵌入式工程师,甚至是资深嵌入式工程师,并不是一件容易的事情,这中间会遇到一些瓶颈,需要克服很多困难,只有不断地提升自己的能力,才能面对后面复杂的嵌入式系统。

举个例子,作为一个嵌入式软件工程师,也许刚开始的时候只要能够配置硬件的寄存器,然后完成其正常的行为,就可以让一个足够简单的嵌入式系统正常工作。但随着工作的进行你会发现,你面对的并不全是简单的所见即所得的硬件,比如多核非对称系统,包含一个MCU(可能是ARM,通用处理器),再加一个DSP(专门做信号处理的处理器),它们之间的通信就比较复杂,你需要学习共享内存、学习信号量、学习生产者消费者模型,而实际上两边各有不同的操作系统,情况会比描述得更为复杂。

也就是说,嵌入式工程师在跨入一个新的阶段的时候需要学习大量的知识,之前遗漏的或者当时认为有难度暂时忽略的知识,都将在此时补课回来。不过,这些内容虽然看似量大,但并不难理解,因为它并不具备大型互联网软件的复杂度,由于设计模式的原因,嵌入式领域用到的无外乎那么几种,当然做上层嵌入式应用的除外。学习起来,完全可以按部就班,有条理地对知识进行组织,因为调用关系十分明确。

03 选择嵌入式,何必犹豫?

就目前的情况而言,步入嵌入式领域的人才确实有所减少,很多人或许抱有这样的观点:嵌入式不如做上层软件变化多,方向有些狭窄,就业不容易,收入在计算机行业内也不算理想……

事实上,我们不得不承认,当前国内情况确实如此。主要有以下几个原因:首先,嵌入式不是当前最流行的技术,目前最火热的技术当属机器学习和大数据。其次,嵌入式公司在国内创业的并不占多数,嵌入式行业的就业基本限制在芯片公司和移动设备公司。最后,嵌入式的投入产出比不够理想,影响到了嵌入式从业人员的薪资待遇水平。

针对这几个问题,我来谈谈自己的看法。

01 嵌入式从业者需要与时俱进

首先,流行的技术是应该学习的,这个观点我十分赞成,不过,这与从事嵌入式行业并不矛盾,因为我完全可以结合当前的主线附加一些支线学习任务,比如学习机器学习的相关知识,而嵌入式目前也在这个领域大有可为。举个例子,做inference芯片,帮助诸如TensorFlow、Caffe这样的工具训练出的网络,能够加速跑在移动设备上。另一个例子是Google的TPU,从训练的角度帮助提升速度和效率。显然,如果你选择做嵌入式,不但没有和这个时代脱节,而且不断在跟最流行的技术进行交流。

最流行的技术总是在更新换代,学习的速度需要更快,而嵌入式用到的大部分基础知识实际在最近一些年并没有本质的变化,而所谓的学习新内容不过是学习一些新的应用场景,但是万变不离其宗。

最流行的技术,也意味着从业的人员数量很大,在如此多的竞争者中脱颖而出并不容易,如果想出类拔萃,除了努力或许还需要一些天赋。

02 嵌入式就业随“心”所欲

嵌入式公司中创业数量少这个问题,实际上是相对于互联网创业公司而言的。近年来,我们能看到很多做智能家居的公司层出不穷,这对嵌入式从业人员来说是利好的消息。这意味着,需要大量的嵌入式工程师来做一些基础工作,而且很多工作是基于一些相对成熟的解决方案来实现的,所以门槛相对没有那么高。

另外,智能手机的几个巨头,也可以作为嵌入式人员从业的目标。要维持一定的出货量,这样的公司势必要拥有大量的工程师以支撑多条产品线,所以人员缺口自然也比较大。

而那些想要做得更加底层,更想去造轮子而不是做汽车的嵌入式工程师,个人建议你找一家芯片公司,从Bootloader开始到上层应用,无所不及,相信一定可以满足一个技术极客的需求。当然,日后还可以把你的代码贡献给开源社区,帮助提升开源软件的质量,成就感可以得到更大的满足。

03 把握好现在,定会有美好未来

与互联网公司相比,嵌入式从业人员的薪资度的确并不讨喜,但是这也要看你的水平级别。一个优秀的嵌入式工程师,完全能够做到衣食无忧。况且,试想,是在一个人员紧缺的行业里更容易出类拔萃,还是在一个竞争激烈的领域更加容易?

在嵌入式行业,如果热爱,就全身心投入,否则就放弃。很多时候方向固然重要,但绝非全部。打个比方,每个工程师都有自己的船,你就是船长,但目的地并不是只有一个。虽然大海茫茫,你没有一张航线图,但是只要一直向前走,由于目的地足够多,最后你总能到达其中一个,即便这个目的地并非最优,但也足够受用。倘若一味地追求最优,不断地切换航线,而对于这片大海,如果没有十分精准的GPS,那么最后很可能你还在原地打转。

因此,我认为,是否选择嵌入式,当下是最重要的,未来可以思考,但并不见得是关键。正如《新世界灵性的觉醒》一书的作者所说:觉醒不发生在未来,只发生在当下。

所以,我们把握好现在,才是一切!

04 如何学好嵌入式?

关于如何进行嵌入式的学习,分享一些个人的经验。

笔者身为一名软件工程师,对于硬件并没有非常深入的了解,所以只谈谈如何学习嵌入式软件。说到这里可能有很多人会提出一个问题:是应该更重视理论基础,还是多做项目多动手? 对于这个问题我的回答是:两者都很重要!

听起来好像是没什么指导意义,但这确实是我这些年进行嵌入式开发的切实体会。

首先说说理论基础学习。嵌入式的软件开发不同于一般的软件开发,如果你做过3~5年的纯软件编程再转向嵌入式,就会发现,很多时候软件出的问题其实是硬件的不可靠造成的。如何对这些问题进行定位并解决呢?

我认为,这需要相当扎实的理论基础,当然,有经验会事半功倍。为什么这么讲? 因为在嵌入式开发中,你遇到一个问题之后,可能没有办法像开发其他软件那样,换一个方法照样可以实现同样的功能,而是卡在那里,止步不前,直到找到问题的根本原因,业内称之为rootcause。

这时,就需要一步一步进行排查,如果理论基础不扎实,对于一些知识点模棱两可,那么在看问题的时候可能没有办法搞清楚导致问题发生的原因所在,比较含糊、似懂非懂的记忆会让人在一个问题上大费周章。我也曾经有在某些不感兴趣的知识点上看个大概、浅尝辄止的经历,其结果就是卡在某个问题上,不得不回去补课,知识夯实之后再回过头来解决问题。

做一段时间研发就会发现,莫非定律在嵌入式领域发生得非常频繁,即怀疑可能会出问题的点,一定会出问题。也就是说,在不了解原理的情况下进行程序编写,似是而非的代码导致的问题终有一天会爆发,到那个时候,势必需要花更多的时间了解其根本原理。

理论基础主要是指编译原理、操作系统、数据结构与算法。如果不懂编译原理,那么有可能在遇到栈溢出、符号或调用无法找到等问题时无所适从。操作系统理解得不透彻,可能就会在中断、进程线程调度、内存使用等方面碰壁。数据结构与算法的薄弱,则会让你在想要实现一些功能时把数据组织得比较差,性能上会出现问题。

如果立志做一名嵌入式工程师,我认为基础再多巩固也不为过。而对于多做项目这个问题,应该是说做得越多越好,毕竟纸上谈兵不是嵌入式工程师的角色。这些项目可以来自于实验室、公司,乃至于开源社区。

最开始的时候不必瞄准非常专注的方向,因为你并不知道什么更适合你。说到适合我是这样认为的,每位工程师可能在不同的领域有天赋,如果选择的方向适合,那么将展现出你非凡的能力(当然,我说的是普通工程师,不排除某些天才可以在每个领域都出类拔萃)。当做了很多模块之后,再选择一个方向深入研究,努力成为这个领域的专家,此时既有方向和目的性,又不会因为过于狭窄的知识面而导致管中窥豹、盲人摸象。

多做项目的另一个好处是,可以有更多的机会与他人合作、沟通交流,很多时候一个人钻牛角尖、不得要领,却可能在他人的一句提示下茅塞顿开。Opensource就是一个很好的例证,众人拾柴火焰高。

05 嵌入式从业之路,前景无限

关于嵌入式未来的发展方向,这个话题比较大,因为未来的事情难以预测,尤其是在这样一个日新月异、瞬息万变的时代。从短期来看,我认为,嵌入式开发的方向主要有:

01 移动终端

手机仍然在不断发展,更加智能化应该是一个共同的方向。目前,越来越多的解决方案都加入了当前最火

热的人工智能、机器学习模型的inference加速芯片在手机里面,使得训练完备的模型能够运行在移动终端。无论你是学机器学习算法,还是学嵌入式编程,这里都是一片新天地。

02 智能家居

目前涌现出越来越多的智能家居设施,比如空调、净化器、扫地机器人等等,这些无疑方便了人们的生活,而如何添加一些更易用的功能就成了一个新的挑战。作为嵌入式从业者,完全可以从这个方向切入,不断创新。

03 VR和AR

这个可能并不是大众市场,它们代表的是娱乐方向。我们可以参考游戏机的发展,从掌机到红白机,再到SEGA、土星、PS、XBOX,其实都是在完成一件事情,让游戏更加真实。AR和VR更是如此,让人身临其境,得到沉浸式的体验,有朝一日,或许《黑客帝国》中的故事真的会发生。嵌入式工程师在这里或许会成为游戏规则的制定者,你准备好了吗?

莫非斯给的两颗药丸,你选择红色还是蓝色? 选蓝色就继续前进,选择红色就进入matrix。最后,向选择红色药丸的嵌入式工程师们致以崇高的敬意!

05 另一个工程师眼中的嵌入式

一.工程师眼中的“嵌入式系统”

在工程师看来:着重理解“嵌入”的概念,主要从三个方面来理解:

1、从硬件上,将基于CPU 的外围器件,整合到CPU 芯片内部,比如早期基于X86体系结构下的计算机,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 channel 的光通道。IXP 系列应该是目标基于ARM 体系结构下由Intel 进行整合后成Xscale 内核的最高的处理器了。

2、从软件上,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到ROM 中。而在定制操作系统内核时所选择的应用程序组件就是完成了软件的“嵌入”,比如WinCE 在内核定制时,会有相应选择,其中就是 wordpad,PDF,MediaPlay 等等选择,如果我们选择了,在CE 启动后,就可以在界面中找到这些东西,如果是以前PC 上的windows 操作系统,多半的东西都需要我们得新再装。

3、把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的ROM 中就实现了一个真正的“嵌入”。 以上的定义是我在6、7年前给嵌入式系统下自话侧重于理解型的定义,书上的定义也有很多,但在这个领域范围 内,谁都不敢说自己的定义是十分确切的,包括那些专家学者们,因为毕竟嵌入式系统是计算机范畴下的一门综合性学科。

二.嵌入式系统的分层及对口专业要求

嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。

1、硬件层:是整个嵌入式系统的根本。如果现在单片机及接口这块很熟悉,并且能用C 和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD 的逻辑设计的,同时还要对操作系统内核及其调度有相当的熟悉。但硬件平台是基础,增值还要靠软件。

硬件层比较适合于电子、通信、自动化、机电一体、信息工程类专业的人来搞。需要掌握的专业基础知识有: 单片机原理及接口技术、微机原理及接口技术、C 语言等。

2、驱动层:这部分相对而言比较难。驱动工程师不仅要能看懂电路图,还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导致其它任务不能运行。若不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,这样可能连个初级的驱动工程师的水平都达不到,所写的驱动在应用调用时就如同windows 下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几遍,不是太容易成功的,但其工资在嵌入式系统四层中是最高的。 驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞。 当然除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通。

3、操作系统层:对于操作系统层而言目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP 操作系统是微软投入300人用两年时间才搞定的,总时工时是 600人/年;中科院软件所自己的女娲Hopen 操作系统估计也得花几百人/年才能搞定。因此这部分工作相对来讲没有太大意义。

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协议的应用层开发,或是基于嵌入式 网络数据库的开发等等。

对于初学者来讲,要量力而行,不要认为驱动层工资高就把它当成方向了,要结合自身特点,嵌入式系统四个层 面上无论哪个层面上来讲都是有高人存在,当然高人也对应的高工资。我是做硬件层的,以前每月工资中个人所 得税要被扣上近3千大元。当然我一方面充当工程师的角色,一方面充当主管人物的角色,两个职位我一个人干, 但上班时间就那些。硬件这方面上可能与我PK 的人很少了,才让我拿到那么多的工资。

四.如何选择合适的开发系统

很多ARM 初学者都希望有一套自己能用的系统,但他们往往会产生一种错误认识,就是认为处理器版本越高越好,性能越高越好,就象很多人认为ARM9比ARM7好, 我想对于初学者在此方面以此入门还应该理智,开发系统的选择最终要看自己往嵌入式系统的哪个方向上走,是做驱动开发还是应用,还是做嵌入式系统硬件层设计与板级测试。如果想从操作系统层面或应用层面上走,不管是驱动还是应用,当然处理器性能越高越好了,但这个东西自学,有十分大的困难,不是几个月或半年或是一年二年能搞定的事。

在某种意义上讲,ARM7与ARM9的差别就是在某些功能指令集上丰富了些,主频提高一些而已,就比如286 和386。对于用户来讲可能觉察不到什么,只能是感觉速度有些快而已。

ARM7比较适合于那些想从硬件层面上走的人,因为ARM7系列处理器内部带MMU 的很少,而且比较好控 制。就比如S3C44B0来讲,可以很容易将Cache 关了,而且内部接口寄存器很容易看明白,各种接口对于用硬件 程序控制或AXD 单步命令行指令都可以控制起来。基于51单片机的思想很容易搞懂,就当成个32位的单 片机,从而消除很多51工程师想转为嵌入式系统硬件ARM 开发工程师的困惑,从而不会被业界某些不是真正懂 嵌入式烂公司带到操作系统层面上去,让他们望而生畏,让业界更加缺少这方面的人才。

而嵌入式系统不管硬件设计还是软件驱动方面都是十分注重接口这部分的,选择平台还要考察一个处理器的外部资源,你接触外部资源越多,越熟悉他们,以后就业成功的机率就越高,这就是招聘时所说的有无“相关技能”,因为一个人不可能在短短几年内把所有的处理器都接触一遍,而招聘单位所用的处理器就可能是我们完 全没有见过的,就拿台湾数十家小公司(市价几千万)的公司生产的ARM 类处理器,也很好用,但这些东西通用性 太差,用这些处理器的公司就只能招有相关工作经验的人了,那什么是相关工作经验,在硬件上讲的是外围接口设计,在软件上讲是操作系统方面相关接口驱动及应用开发经验。我从业近十年, 2000年ARM 出现,我一开始做ARM7,然后直接跑到了Xscale(这个板本在ARM10-11之间),一做就是五年,招人面试都不下数百人,在这些方面还是深有体会的。

我个人认为三星的S3C44b0对初学者来说比较合适,为什么这么说? 因为接口资源比较丰富,技术成熟,资料较多,应该十分适合于初学者。有问题可能很容易找人帮且解决,因为大多数人都很熟悉,就如同51类的单片 机,有N多位专家级的人物可以给你帮忙,相关问题得以很快解答,所然业界认为这款ARM 都用得烂了,但对于初学者来,却是件好事。

总的来说,开发系统的选择,要看自己的未来从业目标方向,要看开发板接口资源,还要看业界的通用性。

五.成为高级嵌入式系统硬件工程师要具备的技能

对于硬件来讲有几个方向,就单纯信号来分为数字和模拟。模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化。 比如手机的Modem 射频模块,都采用成熟的套片,而当年国际上只有两家公司有此技术,自我感觉模拟功能不 太强的人,不太适合搞这个,如果真能搞定到手机的射频模块,只要达到一般程度可能月薪都在15K 以上。

另一类就是数字部分了,在大方向上又可分为51/ARM 的单片机类,DSP 类,FPGA 类。国内FPGA 的工程 师大多是在IC 设计公司从事IP 核的前端验证,这部分不搞到门级,前途不太明朗,即使做个IC 前端验证工程 师,也要搞上几年才能胜任。DSP 硬件接口比较定型,如果不向驱动或是算法上靠拢,前途也不会太大。而ARM 单片机类的内容就较多,业界产品占用量大,应用人群广,因此就业空间极大。而硬件设计最体现水平和水准的就是接口设计这块,这是各个高级硬件工程师相互PK、判定水平高低的依据。而接口设计这块最关键的是看时序, 而不是简单的连接,比如PXA255处理器I2C 要求速度在100Kbps,如果把一个I2C 外围器件,最高还达不到100kbps 的与它相接,必然要导致设计的失败。这样的情况有很多,比如51单片机可以在总线接LCD,但为什么这种LCD 就不能挂在ARM 的总线上,还有ARM7总线上可以外接Winband 的SD 卡控制器,但为什么这种控制器接不到ARM9或是Xscale 处理器上,这些都是问题。因此接口并不是一种简单的连接,要看时序,要看参数。 一个优秀的硬件工程师应该能够在没有参考方案的前提下设计出一个在成本和性能上更加优秀的产品,靠现有的方案,也要进行适当的可行性裁剪,但不是胡乱的来,我遇到一个工程师把方案中的5V 变1.8V 的DC 芯片,直接更换成LDO,有时就会把CPU 烧上几个。前几天还有人希望我帮忙把他们以前基于PXA255平台的手持GPS 设备做下程序优化,我问了一下情况,地图是存在SD 卡中的,而SD 卡与PXA255的MMC 控制器间采用的SPI 接口,因此导致地图读取速度十分的慢,这种情况是设计中严重的缺陷,而不是程序的问题。因此我提了几条建议,让他们更新试下再说。

因此想成为一个优秀的工程师,需要对系统整体性的把握和对已有电路的理解,换句话说,给你一套电路图你能看明白多少,看不明白80%以上的话,说明你离优秀的工程师还差得远。其次是电路的调试能力和审图能力,但最最基本的能力还是原理图设计、PCB 绘制、逻辑设计这块。这是指的硬件设计工程师,从上面的硬件设计工程师中还可以分出ECAD 工程师,就是专业的画PCB 板的工程师,和EMC 设计工程师,帮人家解决EMC 的问题。硬件工程师再往上就是板级测试工程师,就是C 语言功底很好的硬件工程师,在电路板调试过程中能通过自已编写的测试程序对硬件功能进行验证。然后再交给基于操作系统级的驱动开发人员。 总之,硬件的内容很多很杂,硬件哪方面练成了都会成为一个高手,我时常会给人家做下方案评估,很多高级硬件工程师设计的东西,经常被我一句话否定。因此工程师做到我这种地步,也会得罪些人,但硬件的确会有很多不为人知的东西,让很多高级硬件工程师也摸不到头脑。

那么高级硬件工程师技术技能都要具备哪些?首先要掌握EDA 设计的辅助工具类如Protel OR CADPowper PCBMaplux2ISE、VDHL 语言,要能用到这些工具画图画板做逻辑设计,再有就是接口设计审图能力, 再者就是调试能力,如果能走到总体方案设计这块,那就基本上快成为资深工程师了。

深入了解各种器件特性,选择最合适的处理器、外围器件、操作系统和软件库,尽可能地优化软件设计,最贴切地满足应用需求,以获得最好的系统性价比,是嵌入式系统设计开发的精髓。

硬件是要靠经验,也要靠积累的,十年磨一剑,百年磨一针。

不过最后提醒大家:追求技术不是人生的唯一目的,切不可把它当成喜悦的唯一源泉,平时身边有很多美好的事物都值得用心去珍惜。呵呵,我已经在担心自己的智力是否会在30岁到来之前枯竭了.好好珍惜短暂的大学生活,好好珍惜自己的青春,不要整天呆在实验室,左手键盘右手烙铁的。

欢迎大家加群,一起探讨其中的奥妙
做嵌入式,如果爱就全心投入,否则就放弃!_第1张图片

你可能感兴趣的:(做嵌入式,如果爱就全心投入,否则就放弃!)