无疑嵌入式系统开发是目前相当热门的领域,因为它涉及到的范围实在是太广了,从消费电子到工业应用,从8位的单片机到32位处理器,嵌入式系统俨然成为不可缺少的一环,且有愈演愈热之势。那么该如何学习和开发嵌入式系统呢?需要具备哪些知识和技能?需要怎么去提高?
首先声明,我并非嵌入式方面的高手,远远不是,只是接触过一些嵌入式系统的开发,参加过一点培训,并跟高手有过一些交流,在此把我所知道的东西呈现给大家,不求深,但求全而系统,力求给开发者和学习者一些方向性的建议和指导,如果能给广大热爱嵌入式开发的朋友一些启发和帮助,我愿足矣!
8位的单片机大家都比较熟悉,在此不再赘述,下面主要谈一下32位机的开发,而且我会主要以linux操作系统为主来阐述。广大初学者最常问的一个问题可能就是:该如何学好嵌入式系统呢?这就跟过去大学里面过英语四六级时问到的一样:该如何学好英语呢?其实同英语一样,嵌入式系统一定要去在实战中演练,要去用,在实践的过程中解决问题,获得经验,慢慢才能成为一个高手,如果只是学而没有练,永远都只能是纸上谈兵,一遇到实际问题便束手无策。
嵌入式系统开发包括这几个方面:硬件,底层软件,应用软件。在这几个方面里,硬件和底层软件结合比较紧密,底层软件和应用软件又交互影响,所以嵌入式系统的硬件和软件结合比较紧密。公司一般也不会硬件人员、底层软件人员和应用软件人员三拨人分的很清楚,常常是有些人硬件加底层一块做,应用有人单独做,或者应用加底层一块做,这个可以灵活调配,当然你如果能力强,也可以整个硬件加底层加应用都拿下,但在公司里,就算你都能做,时间上也来不及,产品开发周期都比较短。一般比较好的模式是有人负责硬件和底层软件,有人负责应用软件。负责硬件和底层的人员以电子方面的硬件类专业毕业的人为多,而应用软件人员以计算机等偏软的专业为多。当然专业不是问题,我只是陈述一下大概的现实情况,主要还是看你自己的兴趣、能力、经验积累和机会,
下面我分开叙述一下这几方面的开发要点。
嵌入式系统的硬件比较简单,通常是你选定一款处理器之后,要找到这款处理器的DEMO板(即开发板)的电路图。比如你选的三星的S3C2410,那么三星公司自己会做一款S3C2410的开发板,当然你不必向三星买这块开发板,因为芯片原厂的开发板价格都比较昂贵,如果你选定了这颗芯片,可以向三星索取它的开发板的资料,包括硬件和底层软件资料。当然为了加快开发速度,你可以购买一个国内的厂商做的开发板,因为国内会有很多开发板厂商依据三星官方的这款S3C2410的开发板的资料,经过修改和增减,做成比较实用一些的板子,而且价格会低很多。当然你也可以不买开发板,直接去网上搜索一些资料,对于做的越成熟用的越多的处理器,网上的资料就越多,你如果选的比较冷门的处理器,网上的资料就会很少甚至没有,这时你就只能去购买开发板或者向原厂索取一些资料了。对于象S3C2410这样的处理器,网上你可以找到它的开发板的原理图、PCB图以及底层软件,总之应有尽有,因为这款处理器已经做滥了,传到网上的资料也相当多。
刚才说到的是硬件开发方法的问题,到底具体的嵌入式硬件包含哪些东西呢?说穿了就是最小系统+外围接口。最小系统也就是必不可少的部分,小到不能再小了,再少东西就不能工作了。具体包含以下元件:处理器,晶振,电源,程序存储器(ROM或者FLASH),数据存储器(RAM)。外围接口非常丰富,多种多样,要视具体应用增加或者删减。
对于最小系统很好解释,晶振你可以用无源晶振或者有源晶振都可以,一般处理器的电源至少有两种,一个是外围接口电压,或者叫I/O电压,一个是核心电压,也叫core电压。外围接口电压可能有多种,一般是3.3V、2.5V等,核心电压一般会低一些,比如1.8V、1.5V、1.3V等等,不同的处理器的核心电压也会不同。一般的嵌入式处理器都会集成有RAM和ROM的接口,RAM一般是SDRAM,ROM一般是FLASH。你SDRAM和FLASH的型号选定之后,和处理器的提供的接口相连就可以了。
外围接口丰富多样,每一个嵌入式平台需要的接口也不尽相同。主要包括:串口(RS232,RS485),USB口,网口,I2C接口,SPI接口,AUDIO接口,LCD接口等。这些是比较常用的,很多平台基本上都会包括这些接口。其他一些诸如蓝牙,WIFI,PCI等等,在一些平台上也会提供。一般是处理器里面集成了这些总线接口的控制器(controller),你直接把你的接口设备连到处理器上即可。比如对于串口,几乎所有的嵌入式处理器里面都会集成有几个UART(通用异步收发器),你只需要接一个TTL--RS232的电平转换芯片即可完成串口的设计,当然对于USB口,处理器里面会集成USB Controller,你可以直接把USB接口引出。
对于嵌入式系统来说,核心在软件部分,硬件难度并不大,一般出问题也相对比较少。你只要在官方的DEMO板(或者国内某些开发板厂商提供)的原理图的基础上修改一下,然后布成你自己的板子就可以了。当然布线也有些地方要注意一下,对于SDRAM,其地址线和控制线要尽量等长,其数据线也要尽量等长,当然对于低速的SDR SDRAM来说,频率一般为100/133MHz,这个等长可以做的不严格,但是也不要相差太多。但对于高速的DDR SDRAM来说,布线要注意的就更多了,等长要做的非常严格。一般对于ARM平台,多数支持的是SDR SDRAM,很多POWPC和coldfire平台会支持DDR SDRAM。
只要你完整调试一块板子,基本就掌握了硬件方面的问题,其他的嵌入式平台在硬件方面都很类似。嵌入式系统设计的精华还在于它的软件方面,接下来我会尝试作一下叙述。
对于底层软件,说它是底层主要是因为跟硬件关系密切,而与其相对的应用软件就可以不关心硬件的细节。它主要包括bootloader和内核,有人说了,还有设备的驱动程序呀。是的,驱动程序也是底层软件,但它是内核的一部分,也就是驱动程序最终是要和内核编译在一起的,之所以有时候把内核和驱动程序分开来说,是因为驱动程序这一块比较大,相对内核其他部分比较独立。
技能准备方面主要设计到C语言,当然bootloader和内核里面会有些汇编,但多数的开发工作并不需要去动这些汇编代码。如果要做底层软件,C语言一定要过关。然而内核代码里面的C语言又跟标准C不同,在语法等方面存在一些差异,而且C语言标准库在内核里面是不能用的,内核有它自己的库函数。比如在应用层中,打印函数是printf,而在内核里面,相应的打印函数是printk,这是内核自己的库中的函数。另外,在内核代码中经常会看到一种以“_t”结尾的数据类型,比如dev_t,这也是内核特有的数据类型,表示这种类型是内核对用户隐藏的类型,不希望用户进行修改,以免造成一些麻烦。但差异归差异,内核源代码毕竟是C语言的骨架,所以你如果有良好的C语言基础,学习内核会更得心应手一些。
先说说bootloader,它的功能类似于个人电脑的bios,主要是完成硬件自检和初始化,并加载操作系统。也就是说,它的生存期只是从系统上电到操作系统运行之间的这段时间。
它包含哪些东西呢?bootloader里面一般同时有汇编代码和C代码,如果你要详细了解它的运行机制,可以去找些相关的资料和源代码来看,在此不再赘述。它里面主要是硬件初始化和检测的一些代码,并包含一些硬件的基本驱动程序,比如串口、网口等。为什么说是基本驱动程序呢?比如某个bootloader支持用网口下载内核,那么它必须要能驱动网卡以使其完成下载功能,但也仅仅是驱动网卡下载内核这个简单的任务而已,对于网卡的其他一些复杂的功能并不支持也不需要支持,真正能实现网卡全部功能的驱动程序包含在内核里面。
Bootloader可以分为专用的和通用的两类。专用的即只能用于某一种或某一类平台,比如vivi这种bootloader只支持三星的s3c2410/2440等几款处理器,是专门为三星的ARM开发的一款bootloader。通用的bootloader主要有UBOOT、Redboot等,其中UBOOT用的最多的一种,其通用是因为它支持各种各样的平台,比如ARM、Powerpc、Xscale、Mips等,很多款处理器都支持。其版本有1.1.1、1.1.2、1.1.4、1.1.6、1.2.0等,其中1.1.1是比较老的版本,但现在仍有不少产品在用,1.1.6是比较常用的一个版本,1.2.0是比较新的版本。是选择新版本还是老点的版本要根据你的需求来,并不是越新越好,当然新版本支持的平台会多一点,会修改一些以前版本的bug,但同时也会带来一些新的bug。如果新版本中新增的特性对你来说毫无用处,那么选择老点的版本反而是个好的选择,
因为比较成熟,出了问题可以找到的解决办法也比较多。
有人会混淆bootloader和BSP(board support package)的概念,比较这两个概念有点关公战秦琼的味道了,因为这两个东西其实是运行在不同阶段的,前面说过,bootloader是在操作系统启动之前运行的,而BSP是嵌入式linux系统的一部分,是和操作系统同时运行的,它是硬件和操作系统内核之间的接口,使内核跟具体的硬件平台关联起来,或者说使内核可以运行在某种硬件平台上。很多情况并不需要开发linux下的BSP的,因为有些内核已经包含了很多平台的BSP在里面,你只需要直接编译该内核并根据你的硬件做些修改就可以了。
嵌入式系统开发比较重要的一块就是嵌入式操作系统的开发,下面我会做大概的探讨。
lou zhu shou lei,
du zhe zhou hui.
lun tan xing wang,
shou ru wang qian.
Re: [分享] 嵌入式系统开发要点全面剖析
好!嵌入式系统开发要点全面剖析
Re: [分享] 嵌入式系统开发要点全面剖析
lou zhu shou lei,
du zhe zhou hui.
lun tan xing wang,
shou ru wang qian.