嵌入式开发那点事之二

2013/07/30 16:34
阅读数 258
第二回   第一节

这是第二回,从今天开始讨论技术。如果没看到第一回的,建议先看第一回(贴吧里面的帖子标题是:打算写部嵌入式的章回体,"普渡众 生". 这是第一回,百度贴吧首发),第一回讲的是嵌入式的应用。为什么要看第一回呢,原因在于:嵌入式是实践性很强的技术,属于工程实战派,对于嵌入式技术的学 习,很重要的一点是要学以致用。我的观点(当然REER嵌入式学院的观点也是)是:学了不用,还不如不学。原因在于:其一,根据遗忘规律,理论的东西过不 了几个晚上就忘了,因此,这样的学习是浪费时间、浪费精力、浪费金钱。其二,真正要掌握知识,必须要做。俗话说:纸上得来终觉浅,绝知此事要躬行,就是这 个道理;第三,知识只有用于实际应用,才有价值,否则,唯一的价值就只剩吹牛了。

言归正传。

先来回顾一下嵌入式的概念:


嵌入式系统针对某个应用的,软硬件个裁剪的,对成本、功耗、体积等有严格要求的计算机系统。


从这里可以看得出来,嵌入式系统本质上就是一个计算机系统。


PC也是一个计算机系统,因此,从这一点来说,本质上嵌入式和计算机是一回事。既然这样,我们先从大家熟悉的PC入手进行分析。


PC的层次结构相信大家都非常清楚吧:


------------------------
应用层
------------------------
文件系统
------------------------
操作系统内核
------------------------
BIOS
------------------------
硬件(主板)
------------------------

在 这个层次结构中,硬件就是PC的主板,上面包含很多元器件,如CPU,内存,硬盘,显卡,网卡......等。BIOS,就是上电运行的第一个程序,也就 是上电后看到的字符界面, 他完成两个功能,第一是初始化硬件,第二是把操作系统从硬盘加载到内存运行。BIOS运行完之后,就轮到操作系统跑了,操作系统大家都知道 吧,windows xp / windows7 / redhat / ubuntu等等.如果真想做嵌入式开发的话,强烈建议安装一个linux操作系统(ubuntu就不错)。从开发的角度,操作系统内核还可以再细分一 下,这个我们后面说,先别搞复杂了,免得晕。在操作系统层,最下面是操作系统内核。BIOS运行结束后,会启动操作系统内核,内核启动结束后就进入文件系 统,我们的应用程序就是放到文件系统里面的。

这是PC的层次结构,既然嵌入式系统也是计算机系统,因此,嵌入式也应该是这样一个层次结构:

------------------------
应用层
------------------------
文件系统
------------------------
操作系统内核
------------------------
Bootloader
------------------------
硬件(主板)
------------------------

嵌 入式的层次结构与PC有一点不同,从下往上数的第二层:PC叫BIOS,而嵌入式叫Bootloader.什么是Bootloader 呢?Bootloader就是boot + loader,boot就是初始化,loader就是加载,加载内核到内存运行,因此,bootloader和BIOS其实就是一回事(当然,BIOS的 功能比Bootloader要负责很多,因为BIOS中有很强大的配置功能),只是叫法不同而已.

清楚这点后,我们再从开发层面来比较一下两者的区别。

先说PC,以IBM的笔记本为例。


这 台笔记本的开发,硬件(主板)是IBM做的(不管是自己开发的还是外包的,反正你IBM要负责开发好),Bootloader也是IBM开发的,操作系统 内核是微软开发的,驱动可能是IBM开发的(也可能是微软,我不清楚,发正不需要我们来开发)、文件系统也是搭好的。对于绝大多数人来说,唯一需要做的, 就是上层应用层开发,比如web开发,vc,vb,java,.net开发等等。


而嵌入式系统就大不一样了。前面说了,嵌入式是针对某个 应用的计算机系统,因此,不同的嵌入式系统,针对的是不同的应用场合。应用不一样,需求也就不一样。比如POS机和数码相框,POS机需要打印机,数码相 框就不需要打印机。既然需求不一样,那么硬件也就相应的不一样,硬件不一样了,软件也就不一样了(硬件要工作至少需要驱动吧),因此,要开发一个嵌入式系 统,从最底层的硬件到最上层的软件,都需要我们开发。


具体而言,开发一个嵌入式系统需要做的工作有:

1 针对具体的应用开发硬件(最终表现为一块可用的PCB板,元器件都在PCB板上,PCB板是印刷电路板的意思)。

2 针对具体的硬件开发或移植Bootloader.

3 针对具体的硬件对操作系统源码进行修改,从而让操作系统能顺利启动运行。这一步通常叫操作系统移植。

4 针对具体的硬件,开发或移植设备驱动程序。

5 搭建文件系统。

前面的都容易理解,文件系统为什么还需要搭建呢?原因有两方面:第一,嵌入式上的处理器,一般来讲,都不是x86的处理器,而是arm,mips,ppc 等,而pc上的程序是针对x86处理器的,由于不同的体系结构指令集不一样,因此,PC上的应用程序在arm上是运行不起来的。 第二,PC上的文件系统都很大,而嵌入式的存储空间有限,因此,直接把PC上的文件系统搬到嵌入式上,也装不下,就算装的下,也不这么做,因为文件系统里 面很多东西是没用的,没用的放上面干什么呢?白白浪费空间。空间就是成本啊。因此,需要去裁剪。基于以上两点,一般的处理方法是:从零开始搭建嵌入式文件 系统(当然你可以从开发板或评估板上抄,这是可以的)

6 针对具体的应用开发应用程序

从上面可以看出,开发一个嵌入式系统,说白了就是开发一个计算机系统,这就是嵌入式的技术魅力所在,很有意思吧?

因此,嵌入式开发与纯软件开发相比,不管从哪方面来说,都不在一个层次。

基于这个层次结构图,我们再说说公司里面嵌入式工程师是如何分的。

一般来讲,嵌入式工程师分为两大类:嵌入式硬件工程师 和 嵌入式软件工程师。

嵌入式硬件工程师的工作就是开发完成嵌入式硬件系统。包括硬件选型,原理图设计,PCB设计,外协加工采购,以及硬件调试。很多公司会根据这个再进一步细化。

嵌 入式软件工程师的工作就是软件层的开发工作,包括:和硬件工程师一起调试裸板,Bootloader开发和移植,操作系统开发和移植,设备驱动程序开发和 移植,嵌入式文件系统搭建,嵌入式应用程序的开发。如果再细分一下的话,嵌入式软件工程师又可以分成系统开发工程师和应用开发工程师。系统开发工程师的工 作就是把整个平台搭好,包括:调试裸板,Bootloader开发和移植,操作系统开发和移植,设备驱动程序开发和移植,嵌入式文件系统搭建等。而嵌入式 应用开发工程师就不用说了,就是应用层开发,不要觉得应用层开发容易,应用层开发也是不容易的!

当然这不是固定不变的,我就见过有的公司把硬件、调板,bootloader和驱动划分到一起(我们一个学员的公司),这个就要看具体的公司情况了。

今天先说到这,明天开始一层一层分析。

关于这个部分的内容,有问题的请在后面留言,有时间的话我尽量帮你们解决。

---- 这里是首发,如要要转载的话,请带上原创哈:REER嵌入式学院(杨)


第二回   第二节

今天开始一层一层的说。

先说最底下的,也就是嵌入式硬件开发。

在进行硬件开发之前,首先需要确定硬件,即针对这个应用产品,具体用哪些硬件来实现,这就是所谓的硬件选型。硬件选型的一个重点,是确定CPU,也就是CPU选型,这样做的原因在于:只要CPU确定了,其他的东西就好确定了;CPU不确定,其它东西就没法确定。

那么如何确定CPU呢?还是要先回到需求。

为了描述的方便,这里假设以做一个数码相框为例进行说明。

要 做一个数码相框,首先需要确定你的数码相框是个什么样子,比如: 多大的显示屏?按键操作还是触摸屏操作?时否支持usb?时否支持wifi? 是否支持sd卡等等。这是硬件方面的需求。除了硬件外,还有软件方面的需求,比如是否支持播放视频?如果要播放视频,视频播放是标清还是高清?图形界面用 Android还是用QT等等,这些需求需要先确定,需求确定后,才能确定相应的硬件与软件。

假设需求已经确定下来了,下面干什么呢?根据之前所说的,要先确定CPU,CPU是硬件选型的核心。

由于这个东西是要当产品做的,因此,一个基本原则就确定下来了:在满足功能及性能要求的情况下,成本越低越好。因此,能用A8搞定的,就不用A9,能用ARM11搞定的,就不用A8。除非你对盈利不在乎,那是另外的说法。

再 就是,选择CPU的时候,尽量采用SOC,SoC是System on Chip的缩写,通俗的说就是片上系统,也就是一颗芯片里面,除了CPU之外,还集成了很多外设,如LCD控制器,TS控制器, USB控制器等等,选择用SoC的好处处在于,如果不用Soc,而是用裸CPU的话,你就得像PC一样,再加一块桥片,这样一来,一系列的问题就出现了, 比如:成本高了,体积大了,功耗也大了等等,这是我们说不希望的,因此,选型的时候尽量选择用SoC. 一般而言,不同的SoC,针对的细分市场不同,比如,有的Soc针对的是网络市场,有的Soc针对的是音视频应用市场,有的Soc针对的是消费类电子市 场,有的SoC针对的是工业控制市场等等,针对不同的市场,其外设的种类以及性能也不一样。比如针对工业控制的Soc,内部对各种总线应该考虑的比较充 分,而音视频处理就一般般,甚至没有;针对网络应用的Soc,其网络处理功能就会很强大,同样可能也不会有很强的视频处理功能;因此,对于这款数码相框来 说,我们应该选择一款针对消费类电子的SoC。其次,你选择的SoC最好包括你所需的全部外设。为什么呢? 我们举个例子,假如你选择的SoC没有包括LCD,那么为了支持LCD,你还要再额外加块LCD芯片,这样一来,成本,功耗,体积都上去了,甚至连可靠性 都变差了,不合算啊不合算。

当前,应用于嵌入式的CPU,主要有ARM,POWERPC,MIPS等体系结构的。这几种体系结构,大家可 能对ARM比较熟悉,对PowerPC和MIPS就相对陌生一些了。PowerPC和MIPS其实是非常优秀的体系结构,PowerPC应用于通信和军工 较多,而MIPS技术很NX的说,但市场做的不好,因此,听说过MIPS的人不多也是有道理的,曾经,AMD出了个AUxxxx系列的MIPS体系结构的 SoC,非常不错的!如AU1200,AU1550等等,有兴趣的可以去找些资料看下。另外,值得一提的是,国产CPU 龙芯就是基于MIPS指令集的。

以上几种体系结构中,ARM的市场占有率是最高的,也是最为大多数人熟知的。2003年的时候,在北京和ARM当是中国区的总裁谭军博士聊了几次,了解到他们的市场做得好是有道理滴,这个话题这里就不多说了哈!

ARM 主要是因为针对消费类电子设备而崛起的,因此,像我们这个数码相框,选择用ARM处理器不失为一个不错的选择。一说到ARM处理器,大多数人头脑里就是三 星三星,其实三星也就只是其中一家做ARM CPU的公司啦,除了三星之外,还有很多NB的公司,如TI,Freescale等等。三星的东西,个人认为拿来做个学习板啊,做个要求不高的消费类电子 啊什么的还是凑合吧。

这里要说下ARM这个词。ARM这个词其实有好几个方面的含义:

1) ARM是一种体系结构,从这个层面来说,ARM和X86,PowerPC,MIPS等是一个概念。

2) ARM是一个公司。这个公司是ARM公司,英国的。这个公司设计CPU,但是不生产CPU,不生产CPU那高什么赚钱呢?人家赚钱的方式NB得很,靠的是 卖知识产权,比如ARM公司把ARM核卖给三星,三星买到这个核以后,根据市场定位再加上一堆外设,从而做成一块CPU(就是一SoC), 然后给这个CPU取个名字,叫S3C6410啊,或者是S3C2440啊什么的,这就是你看到的CPU啦。然后,三星每卖一块CPU,就给ARM公司分一 点钱,这样,三星就帮ARM赚钱了,除了三星外,ARM还卖给其他公司,如果TI,Freescale等,这样,一大把NB的公司帮ARM赚钱,想想都嫉 妒(题外话:200x年早期,中国兴起了CPU热,想当年,北大还把ARM核买过来做了一款CPU,有谁知道叫什么名字的,举个手:) )

3) ARM是CPU,也就是大家常说的ARM CPU,如S3c6410等等,现在你明白了,其实就是一个SOC而已。

除 了功能,成本,之外,还要考虑资源的丰富程度。现在假如选了个CPU,结果发现软硬件资源少得可怜,那恭喜你,你的产品研发进度有问题了!本来三个月可以 完成的,结果整了三年没出来,不赔死就怪了。除了这个之外,还要考虑采购和供货情况。如果不考虑的话,产品研发完了,测试也没有问题了,就等着生产后卖出 去数钱啦,结果供应商告诉你,这块芯片停产了,就等着哭去吧!

所以说,要做个产品出来,真不是那么容易的,要考虑的东西很多。

选来选曲,吵来吵去,最后才好不容易终于把CPU确定下来了。CPU确定下来后,其他元器件就好确定了,甚至软件层面的开发也基本可以确定了。

从这里我们可以看得出来:

1) 公司用什么CPU,是根据具体产品来确定,不同的公司,用的CPU可能不一样,同一个同事,不同的产品也都有可能不一样,因此,对于嵌入式开发学习而言, 用什么开发板其实不是太重要,重要的是要系统掌握嵌入式开发的原理和知识。这样的话,到了公司后,随便给你一块cpu,你都能很快搞定,这才叫真正掌握了 嵌入式开发。千万别给我说,你学的时候用的是s3c6410,学完后你就只会这块处理器,其它的一概不会,这样的话,那就说明你还没掌握。

2) 做产品跟玩学习板是两概念。企业要的是产品,产品开发更实验板开发是两概念,除了功能外,更多的是非功能性因素,因此,你应该通过学习,尽力学习和积累企 业所需的经验,这样,你才会成为企业喜欢的人。对于着急找工作的人来说,这应该做的是找机会接触和参与企业实际项目的开发训练,这才是真有价值的。

今天先写到这,欲知后事如何,且听下节分解。

---- 这里是首发,如要要转载的话,请带上原创哈:REER嵌入式学院(杨)


第二回   第三节

到现在为止,我们对硬件选型做完了,接下来就要开始进行硬件设计了.


硬 件选型中,我们的核心是要确定CPU,CPU确定后,一般来说,需要购买一块评估板,也就是大家常说的开发班。开发板所带的资源可以帮我们节省很多开发工 作。这是必须的,对于产品研发来说,要考虑上市时间。本来一款很好的产品,如果开发了2~3年还没有出来,机会就过去了,没有市场了也就可以去喝西北风 了. 这个开发板跟大家常听说的学习板虽然差不多,但还是不是一概念。学习板都是玩玩的,跑起来就完了,哪管你稳定不稳定,好不好,如果拿这种态度去做产品研发 的话,卖多少赔多少!


大家可能有个感觉,在我的讲解中,始终不离口的是产品产品产品,这是必须的,产品是唯一目标,必须学以致用,这才 是学习嵌入式的目标.还是之前那句话,学了不用不如不学。再多说一句,围绕培训是否有用这一观点,说有用的有,说没用的也有。我的观点是,培训是有用的, 但前提是要找对培训机构(比如RE.ER嵌入式学院,顺便打个广告哈:) ), 培训是成本最低的学习方式(除非你认为时间不是钱),不信的话自己去算。那么,培训的核心是什么呢:是实践和项目开发.这个靠自学是搞不定的。好了,不扯 远了,有机会我再开个专题谈论一下我关于培训的观点和认识(希望我开专题讨论培训的请在后面跟帖).

硬件选型确定了,开发板也搞定了,下面就是设计了。这时候硬件工程师开始表演了.


硬件工程师表演的第一个节目是原理图设计。所谓原理图设计,简单通俗的说,就是从逻辑和电气方面,怎么把元器件连接起来。

比如lcd的哪个引脚接到cpu的哪个引脚上,要不要加个电阻,要不要加个电容什么的,这个一般都根据评估版来整,相对来讲不是太难。

原 理图设计完了后,接下来表演PCB设计,这里的pcb不是操作系统里面程序控制块的意思哈,而是印刷电路板。pcb设计要做的事情就是在原理图的基础上, 如何把元器件放在电路板上,以及具体如何走线等。现在的核心版几乎至少都是6层板了,底板好多也都是4层板,因此,在学校里面只学了单面板或双面版的同 学,要认识到还有差距哈, 如果想学习画多层板的话,也可以到我们RE.ER嵌入式学院来,我们有专门的多层PCB设计课程,这门课程学完后,要求实际画一块四层板出来(达到投板生 产的要求),之所以这里要提出来,主要是国内除了我们RE.ER嵌入式学院外,做嵌入式硬件设计培训的太少了。PCB设计其实还是蛮重要的,PCB布线不 好,很容易导致产品不稳定,对于单面板和多面版,可能考虑的不多,但对于高频和高速的板子,就得格外小心了,而很多东西,是书本上没有的,只能靠经验.

PCB 设计结束后,接下来就是生产了,对与大多数公司而言,没必要还要自己搞个工厂,直接找个专业的pcb生产厂家就可以了。国内有那么3~4家做快板的,基本 都在深圳,上海也有一家,具体名字我就不说拉. 我们RE.ER嵌入式学院自己做的AM1808 CPU核心版,找的是深圳的,从发出到拿到手,7天,还是挺快的. 在等PCB板的过程中,可以采购元器件,如果用到了国外的元器件,需要提前购买。我们当时采购的cpu,要从香港拿货,就耽搁了没有预料到的时间(因为海 关乱七八遭的事)。元器件到了,板子也好了,就是焊接了。对于BGA封装的,一般需要机器焊,一般人搞不定(我就认识一牛人,手工焊BGA,但焊的过程是 不会让你看到的:),有意思).

焊接结束后,一款板子就好了,初步调试调试,没问题了,就交给嵌入式软件工程师。硬件工程师的工作就算完成90%了,剩下的10%是需要配合软件工程师。以后的所有工作,就都属于嵌入式软件工程师了。

这 里额外说点职业相关的话题。很多人说,嵌入式的核心是软件,这是有道理的。从刚才这个过程也看得出来,一旦硬件做完后,除非另外新产品开发外,就这个产品 而言,基本没什么事了,就算有事,也差不多都是体力活了,比如组织生产阿,测试啊什么的. 只有软件在不停的做不停的做不停的做,各种应用各种软件各种应用各种软件等等,因此,软件工程师的需求量远大于硬件工程师。还有一个就是,整个感觉就是硬 件工程师的工资没有软件高,这是个奇怪的现象,就好比测试工程师的工资没有开发工程师高一样(其实真正的测试工程师要比开发工程师NB,但国内反过来了, 难怪国内的企业做的产品都很很狗shi,当然,产品质量除了测试外,设计和开发是非常重要的,RE.ER嵌入式学院自己开发了一套产品研发管理系统,很 NX的,以后有时间可以找个专题讲下,看看"完美"的嵌入式产品开发是怎么开发的)

好了,23:15了,收工。欲知后事如何,且听下回分解。

---- 一个字一个字的敲还是蛮辛辛苦苦的,如要要转载的话,请带上原创哈:RE.ER嵌入式学院(杨老师)

展开阅读全文
打赏
0
11 收藏
分享
加载中
更多评论
打赏
0 评论
11 收藏
0
分享
返回顶部
顶部