




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(1)关于嵌入式系统献给热爱此道的初学者们前言网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。一、嵌入式系统的概念着重理解“嵌入”的概念主要从三个方面上来理解。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内存,1G10或10G1的以太网口或Febre channel的光通道。IXP系列应该是目标基于arm体系统结构下由intel进行整合后成Xscale内核的最高的处理器了。2、从软件上前,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到ROM中。而在定制操作系统内核时所选择的应用程序组件就是完成了软件的“嵌入”,比如WinCE在内核定制时,会有相应选择,其中就是wordpad,PDF,MediaPlay等等选择,如果我们选择了,在CE启动后,就可以在界面中找到这些东西,如果是以前PC上将的Windows操作系统,多半的东西都需要我们得新再装。3、把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的ROM中就实现了一个真正的“嵌入”。以上的定义是我在6、7年前给嵌入式系统下自话侧重于理解型的定义,书上的定义也有很多,但在这个领域范围内,谁都不敢说自己的定义是十分确切的,包括那些专家学者们,历为毕竟嵌入式系统是计算机范畴下的一门综合性学科二、嵌入式系统的分层与专业的分类。嵌入式系统分为层,硬件层、驱动层、操作系统层和应用层。1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C语言。2、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同Windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP操作系统是微软投入300人用两年时间才搞定的,总时工时是600人年,中科院软件所自己的女娲Hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。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协议的应用层开发,或是基于嵌入式网络数据库的开发等等。对于初学者来讲,要量力而行,不要认为驱动层工资高就把它当成方向了,要结合自身特点,嵌入式系统四个层面上那个层面上来讲都是有高人存在,当然高人也对应的高工资,我是做硬件层的,以前每月工资中个人所得税要被扣上近3千大元,当然我一方面充当工程师的角色,一方面充当主管及人物的角色,两个职位我一个人干,但上班时间就那些。硬件这方面上可能与我PK的人很少了,才让我拿到那么多的工资。四、开发系统选择。很多ARM初学者都希望有一套自己能用的系统,但他们住住会产生一种错误认识就是认为处理器版本越高、性能越高越好,就象很多人认为ARM9与arm7好,我想对于初学者在此方面以此入门还应该理智,开发系统的选择最终要看自己往嵌入式系统的那个方向上走,是做驱动开发还是应用,还是做嵌入式系统硬件层设计与板级测试。如果想从操作系统层面或应用层面上走,不管是驱动还是应用,那当然处理器性能越高越好了,但这个东西自学,有十分大的困难,不是几个月或半年或是一年二年能搞定的事。在某种意义上请,arm7与9的差别就是在某些功能指令集上丰富了些,主频提高一些而已,就比如286和386.对于用户来讲可能觉查不到什么,只能是感觉速度有些快而已。ARM7比较适合于那些想从硬件层面上走的人,因为ARM7系列处理器内部带MMU的很少,而且比较好控制,就比如S3C44B0来讲,可以很容易将Cache关了,而且内部接口寄存器很容易看明白,各种接口对于用硬件程序控制或AXD单步命令行指令都可以控制起来,基于51单片机的思想很容易能把他搞懂,就当成个32位的单片机,从而消除很多51工程师想转为嵌入式系统硬件arm开发工程师的困惑,从而不会被业界某此不是真正懂嵌入式烂公司带到操作系统层面上去,让他们望而失畏,让业界更加缺少这方面的人才。而嵌入式系统不管硬件设计还是软件驱动方面都是十分注重接口这部分的,选择平台还要考察一个处理器的外部资源,你接触外部资源越多,越熟悉他们那你以后就业成功的机率就越高,这就是招聘时所说的有无“相关技能”,因为一个人不可能在短短几年内把所有的处理器都接触一遍,而招聘单位所用的处理器就可能是我们完全没有见过的,就拿台湾数十家小公司(市价几千万)的公司生产的ARM类处理器,也很好用,但这些东西通用性太差,用这些处理器的公司就只能招有相关工作经验的人了,那什么是相关工作经验,在硬件上讲的是外围接口设计,在软件上讲是操作系统方面相关接口驱动及应用开发经验。我从业近十年,2000年ARM出现,我一天始做ARM7,然后直接跑到了Xscale(这个板本在arm10-11之间),一做就是五年,招人面试都不下数百人,在这些方面还是深有体会的。我个人认为三星的S3C44b0对初学者来说比较合适,为什么这么说哪?因为接口资源比较丰富,技术成熟,资料较多,应该十分适合于初学者,有问题可能很容易找人帮且解决,因为大多数人都很熟悉,就如同51类的单片机,有N多位专家级的人物可以给你帮忙,相关问题得以很快解答,所然业界认为这款arm都做用得烂了,但对于初学者来,就却是件好事。因此开发系统的选择,要看自己的未来从来目标方向、要看开发板接口资源、还要看业界的通用性。五、如何看待培训。首先说说我自己,我目前从业近十年,与国内嵌入式系统行业共同起步,一直站在嵌入式系统行业前沿,设计过多款高端嵌入式系统平台产品并为众多公司提供过解决方案,离职前为从事VOIP的美资公司设计IP-PBX,历任项目经理、项目主管、技术总监、部门经理,积累众多人脉,并集多年经验所得,考虑到学生就业与公司招人的不相匹配,公司想招人招不到,而学生和刚毕业的工程师想找份工作也不太容易,于此力创知天行科技有限公司,开展嵌入式系统教育培训。因一线的科研人员和一线的教师不相接触,导至国内嵌入式人才缺乏,国外高校的技术超前于业界公司,而国内情况是业界公司方面的嵌入式系统技术要远远领先于高校。为架构业界与高校沟通的桥梁,把先进技能带给高校学子,为学生在就业竞争中打造一张王牌,并为业界工程师快速提升实现自我创造机遇,我就这样辞去了外企年薪20多万的职位,做嵌入式系统方面的培训了。对于培训来讲,是花钱来买时间,很多工程师都喜欢自己学,认为培训不值,这也是有可能的,纯为赚钱的培训当然不会太有价值,但对于实力型的培训他们可能就亏大了,有这样一笔帐不知他们算过没有,如果一个一周的培训,能带给他们自学两年后才能掌握的知识,在培训完后他们用三个月到半年时间消化培训内容,这样他会省约至少一年半的时间来学其它的或重新站在另一个高度上工作,那么他将最迟一年后会拿到他两年后水平所对应的工资,就是在工资与水平对应的关系上比同批人缩短一年,每月按最少1千计,再减去培训费用至少多1.0万,同时也省了一年时间,不管是休闲也好,再继续提高也好,总之是跑到了队伍的前面了。另一层面上讲,对于新人的培训相当于他们为自己提前买了份失业保险,有师傅会带领他们入道,我今年暑假时班里最年轻的一个学生是大二的,今年才上大三,这学期才刚学单片机,但现在arm方面的编程工作已经搞得有声有色了,再过一年多毕业,他还会失业吗?再者通过培训,你可以知道很多业界不为常人所知的事,同时也为自己找了个师傅,就比如说,两个工程师分别用S3C2410和PXA255来做手持设备,同样两人都工作四年,再出去找工作,两人工资可能最多可相差一倍,为什么?这就是业界不为常人所知的规则,2410属于民品,被业界用烂了,做产品时成本特敏感,当然也对人才成本敏感了,PXA255是intel的东西,一个255 CPU能买三个2410,一直被业界定义为贵族产品,用的公司都是大公司或为军方服务的公司,不会在乎成本,只要把东西做好,一切都好说,但这方面做的人也少啊,因为开发系统贵啊。对于说为自已找了个好师傅,我想是这样的,因为同级工程师间存在着某此潜在的竞争关系,有很多人不愿意把自己知道的东西教给别人,这意味着他将要失业,就是所说的教会徒弟,饿死师傅,但对于我们这些人就不存在这样的关系了,我是在嵌入式系统平台设计上走到了一定程序,目前在国内这块的技术上已经是自己很难再突破自己,因此很多东西我对大家都是OPEN的,就比如说下面那部分关于接口设计中所提到的时序接口东西,我要是不讲,却使是高级硬件工程师我想也几乎只有10%的人能知道吧。六、成为高级嵌入式系统硬件工程师要具备的技能。首先我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通,或去网站看看.他们的方面上我只能说是知道些,但不是太多,初级的问题也可以问我。对于硬件来讲有几个方向,就单纯信号来分为数字和模拟,模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化,比如手机的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设计的辅助工具类如ProtelORCADPowperPCBMaplux2ISE、VDHL语言,要能用到这些工具画图画板做逻辑设计,再有就是接口设计审图能力,再者就是调试能力,如果能走到总体方案设计这块,那就基本上快成为资深工程师了。硬件是要靠经验,也要靠积累的,十年磨一剑,百年磨一针。(2)无疑嵌入式系统开发是目前相当热门的领域,因为它涉及到的范围实在是太广了,从消费电子到工业应用,从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(通用异步收发器),你只需要接一个TTLRS232的电平转换芯片即可完成串口的设计,当然对于USB口,处理器里面会集成USB Controller,你可以直接把USB接口引出。对于嵌入式系统来说,核心在软件部分,硬件难度并不大,一般出问题也相对比较少。你只要在官方的DEMO板(或者国内某些开发板厂商提供)的原理图的基础上修改一下,然后布成你自己的板子就可以了。当然布线也有些地方要注意一下,对于SDRAM,其地址线和控制线要尽量等长,其数据线也要尽量等长,当然对于低速的SDR SDRAM来说,频率一般为100/133MHz,这个等长可以做的不严格,但是也不要相差太多。但对于高速的DDR SDRAM来说,布线要注意的就更多了,等长要做的非常严格。一般对于arm平台,多数支持的是SDR SDRAM,很多POWPC和coldfire平台会支持DDR SDRAM.只要你完整调试一块板子,基本就掌握了硬件方面的问题,其他的嵌入式平台在硬件方面都很类似。嵌入式系统设计的精华还在于它的软件方面,接下来我会尝试作一下叙述。技巧浅谈WinCE平台USB摄像头驱动开发流程由于良好的性能、低廉的价格和灵活方便的特性,USB 摄像头正被广泛的集成到嵌入式系统中。例如,通过USB 摄像头WinCE系统可以很方便地得到实时图像,这对某些要求实时图象监控的嵌入式系统是一个很不错的选择。但是由于嵌入式硬件平台的多样性,以及WinCE对USB设备驱动开发只提供了底层支持,再加上许多摄像头厂商尚未提供WinCE下的USB摄像头驱动,这对初级开发人员在开发WinCE USB摄像头程序时是一个难点。前段时间,公司委派我负责一个嵌入式项目,项目要求是在WinCE平台上集成USB摄像头驱动和视频采集程序。这个项目的关键是要集成USB摄像头驱动,并高效的把摄像头设备进行初始化以取得一幅完整的图像。幸好我以前开发过WinCE USB的主从设备的驱动程序。但虽然如此,我还是花了一些时间来调整系统的稳定性和可靠性。在这里我分享在这次项目实践中得到的经验和教训,希望大家能少走弯路。一. 什么是USB设备驱动程序开发?随着USB设备的普及,USB设备驱动开发在嵌入式系统变得越来越重要了。为了支持不同类型的硬件可以连接到WinCE平台上,微软提供了具有定制接口的流接口驱动程序模型。WinCE的USB外围设备一般是使用流接口驱动程序。流接口驱动程序是指通过系统提供的文件系统API与应用程序交互;WinCE内核系统会通过设备管理器来完成对流接口驱动程序的加载、卸载等管理工作;而流接口驱动程序则会通过调用USBD模块提供的接口函数实现与底层USB设备通信。因此,在进行USB设备驱动程序开发之前,我们必须先了解USB设备驱动的结构和分类。(1)主机与USB摄像头的通讯结构USB摄像头驱动程序主要是利用系统提供的底层接口配置设备和摄像头设备进行通讯。因此,WinCE的USB摄像头驱动分为两层:USB Client设备驱动程序和底层的WinCE函数实现层。而底层的函数层本身又由两部分组成,即通用串行总线驱动程序(USBD)模块和较低层的主控制器驱动程序(HCD)模块。HCD负责最底层的处理,USBD模块实现较高的USBD函数接口。因此,USB摄像头驱动主要是利用USBD接口函数和外围USB摄像头打交道。一般来说,主机和USB外设之间的通讯是由在主机端通过USBD模块和HCD模块使用的PIPE访问一个通用的逻辑设备来完成。也就是说,USBD和HCD是一组抽象出来用于访问USB设备的逻辑接口,它们主要是负责管理USB外设的连接、加载、移除、数据传输和通用的配置。其中HCD是由主机控制和驱动的,是为USBD提供底层的功能访问服务。而USBD则是由USB总线驱动的,位于HCD的上层,是利用HCD的服务提供较高层次抽象的功能。由于HCD和USBD都是面向一致的逻辑设备接口,因此如果嵌入式系统中拥有多种USB物理外设的话,那么就需要有唯一对应的外设驱动程序,也就是要有最上层的PIPE所连接的物理设备和USB设备驱动程序。有了对这个结构的认识,那么我们在进行USB设备驱动程序开发时首先要写的就是最上端的USB摄像头客户端驱动程序,在WinCE的样例程序中它也被称为USB Client Driver。它是工作于USBD之上,所以实际上我们的工作就变成了利用USBD提供的接口针对特定的物理设备来完成USB设备驱动程序。(见图)(2)流驱动程序的分类和函数结构WinCE驱动程序是介于内核系统和物理设备之间的一个代码层,它的主要作用是为内核系统提供一个接口用来操作不同的外围设备,包括物理设备和虚拟设备。驱动程序提供给内核系统的接口一般可以分为:本地驱动(Native Drivers)和流驱动(Stream Drivers)。我从这次项目实践中得到的经验是,WinCE下的所有驱动都可以归类到这两个里面,二者必居其一。流驱动是指通过为内核系统提供流接口函数来实现驱动外围设备,如XXX_Init()、XXX_Open()、XXX_Read()、XXX_Write()、XXX_Close()等。这一类的驱动由Device Manager来管理,它是通过调用ActivateDeviceEx()函数来实现加载流驱动的。ActivateDeviceEx()的参数是注册表中相应的键,用来设定加载流驱动的属性,如Index、Order、Prefix等等。流驱动加载成功后,应用程序就可以通过调用CreateFile()、ReadFile()、WirteFile()等函数来访问流驱动设备了。而与流驱动相反,本地驱动提供给内核系统的不是标准的流接口,而是事先约定好的特定接口。因此不同的本地驱动设备,接口也是不一样的。在WinCE中,常见的本地驱动有LCD显示驱动、触摸屏驱动、鼠标和键盘驱动及打印机驱动等。从这里可以看出,本地驱动主要是涉及与人机界面相关的驱动。它们是由GWES来管理的,由于他们在注册表中有各自相应的配置信息,因此它们会在系统启动时自动加载。简单的说,就是本地驱动是由内核系统操作和调用的,一般的应用程序是不能访问和调用的。在上一段描述中我们提到自动加载的概念,这是从驱动加载时间来区分的。主要分为两种:一是系统启动时自动加载;二是需要时才加载。一般来说,本地驱动都是在启动时自动加载的。而需要时才加载的方式,顾名思义就是想加载时才加载、想卸载时就可卸载。USB设备的驱动加载都是属于需要时才加载的驱动,例如USB摄像头的驱动程序。而从驱动的接口来看,USB摄像头驱动又属于流驱动接口。但相对于普通的流驱动接口,它增加了几个特有的接口函数:如USBDeviceAttach()、USBInstallDriver()、USBUnInstallDriver()等。在这次项目的调试中,我们发现需要时才加载的驱动程序有一个非常实用的好处,就是能在不修改嵌入式内核系统的情况下,应用程序可以动态加载该驱动以完成对硬件的操作,而操作完成后又可卸载其驱动程序以节省有限的内存。(3)USB设备驱动程序入口点函数分析大部分USB外围设备由于功能性的原因会更适合使用流接口驱动结构,所以一般都会采用加载式流接口驱动程序模型来开发USB设备驱动程序。流驱动是指通过流接口函数来实现驱动外围设备的。因此,编写流驱动程序实际上就是对各种流函数进行调用。又由于USB摄像头驱动程序主要是和USBD打交道,所以我们必须详细的了解USBD提供的函数。让人感到幸运的是在WinCE下微软已经提供了通用串行总线驱动程序(USBD)模块、USBD接口函数全集、样本主机控制器驱动程序(HCD)模块。所以,我们只需要根据USB摄像头的硬件特性,利用USBD提供的不同函数就能实现流接口函数与外围摄像头设备的交互。就能大大的节省开发时间,从而能更快速地进行嵌入式开发。二.USB摄像头流驱动的实现过程WinCE系统下的 USB 摄像头驱动程序的编写不同于在 Windows系统下的编写,因为在WinCE中对USB设备驱动开发只提供了底层支持。所以,在 WinCE系统下必须要根据所选择的USB摄像头的硬件特性自行编写驱动程序。根据我在这次项目中得到的实践经验,具体可以分为以下三个步骤:(1)创建USBD函数控制模块从上述的WinCE USB设备驱动模型及结构分析图中,我们可以清晰的看到主机和USB外设之间的实现方式。因此,我们首先需要编写USB Client Driver。也就是说,我们首先需要利用USBD提供的接口针对特定的物理设备来完成USB摄像头客户端驱动程序。虽然WinCE 没有提供USBD的标准机制,但是编写USBD 可供采用的方法有:是使用流接口函数;是使用现有的WinCE 应用程序编程接口(API);是创建用户指定的API。根据在这个项目的多次实践经验,我在编写 USB摄像头驱动时采用了流接口驱动模式,该驱动程序的位置是位于 USBD 协议栈层上,属于控制具体设备功能的客户端驱动程序。然后,我把流接口驱动程序的流接口函数设计为匹配系统的文件系统API函数形式。通过这种机制方式,USB摄像头就可在流接口的管理下通过文件系统API暴露给应用层,这样应用层就可把USB摄像头作为一种特殊的文件进行操作,从而达到对USB摄像头的控制。(2)创建控制USB摄像头的各种流接口函数从结构分析我们可知,所有的USB设备驱动程序必须在它们的DLL库设置一定的入口点函数与USBD模块进行适当的交互。设置入口点函数有两个作用:一是使得 USBD 模块能与外部设备交互;二是使得驱动程序能创建和管理任何可能需要的注册键。因此,在编写USB摄像头驱动程序时有一个重要的步骤,就是要创建和实现三个入口函数 USBDeviceAttach(),USBInstallDriver(),USBUninstallDriver()。实现这三个入口函数的主要目的是为了使客户端驱动与系统的 USBD协议栈进行联系。因为在USB摄像头接到主机后,USBD模块会调用这个函数来初始化USB设备,取得USB设备信息和配置USB设备,并且申请必需的资源。USBInstallDrive是在第一次加载USB设备驱动程序时首先被调用,它使得驱动程序能创建需要的注册键。但需要值得注意的是,USB设备驱动程序不是使用标准的注册表函数,而是使用RegisterClientDriverID()、RegisterClientSettings()函数来注册相应的设备信息。USBUninstallDriver则是在用户删除USB设备驱动程序时调用,负责删除注册键并释放其它相关资源。同样,它是通过调用UnRegisterClientSettings()和UnRegisterClientDriverID()函数来删除由驱动程序的USBInstallDriver()函数创建的所有注册键。因此,我们在驱动程序中需要严格按照这三个函数的原型来实现,否则就不能为设备管理器所识别。(3)在注册表中配置USB摄像头驱动信息USB摄像头一般是使用需要时才加载的方式来加载的,因此在设备加载时会先检查设备的相关信息。在WinCE系统中,这些相关的设备配置信息都是存储在系统注册表中的。所以,内核系统会先访问注册表以获得必要的相关信息。例如,USBD模块会使用一组跟踪驱动程序和设备的注册键来定位正确的驱动程序。如果注册表信息与 USB 设备信息符合,USBD就会加载此驱动程序,否则 USBD 就不会加载此程序。因此,编写USB摄像头驱动程序的最后一个关键步骤,就是要正确的在注册表中配置相关的USB 摄像头驱动信息。技巧Windows CE中Boot Loader的启动流程和开发经验Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统。在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬件平台生成。一般来说,Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。其中,0AL开发最基本的一步是板级支持包(BSP),而BootLoader设计则在BSP开发中具有极为关键的地位。1什么是BootLoader嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM中并执行。(1)什么是板级BSP?BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。不同的操作系统对应于不同形式的BSP,例如WinCE的BSP和Linux的BSP相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。所以,BSP一定要按照该系统BSP的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。(2)什么是Boot Loader在BSP中有一个重要的组成部分就是BootLoader,它是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。一般来说,在嵌入式世界里BootLoader 是严重地依赖于硬件的,因此想建立一个通用的 BootLoader 几乎是不可能的。不同的 CPU 体系结构有不同的BootLoader,而且除了依赖于 CPU的体系结构外,BootLoader还依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 结构而构建的,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,通常也都需要修改 BootLoader 的源程序。2BootLoader在PC机与嵌入式的区别比较(1)引导程序在PC机和嵌入式上的区别一般来说,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作。在桌面系统中,有以下几种设备可以作为启动设备使用:硬盘、USB盘、光盘驱动器、还有网卡的Boot ROM等。但无论选择了哪一种启动设备,操作系统都会去将该设备起始地址的内容读入内存,BIOS将控制移交给引导装载程序。如果启动设备是IDE硬盘,这时通常将引导装载程序装入第一个扇区(通常被称做主引导扇区,MBR),然后将内容读入内存再运行。在嵌入式平台上,引导装载程序是在硬件上执行的第一段代码,通常将引导程序放置在不易丢失的存储器的开始地址或者是系统冷启动时PC寄存器的初始值。在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成,引导程序完成自己的任务后,也将控制权移交给操作系统。因此,BootLoader是最先被执行的程序,所以就必须包括加电初始化程序。(2)BSP在嵌入式和桌面Windows中的区别其实运行在PC机上的桌面Windows或Linux系统也是有BSP的,只是PC机均采用统一的X86体系架构,这样操作系统的BSP相对X86架构是单一确定的,不需要做任何修改就可以很容易支持OS在X86上正常运行,所以在PC机上谈论BSP这个概念也就没什么意义了。而对嵌入式系统来说情况则完全不同,目前市场上有多种结构的嵌入式CPU(如X86,arm,MIPS等),而且为了性能的需要,外围设备也会有不同的选择和定义。因此,一个嵌入式操作系统针对不同的CPU会有不同的BSP,又即使同一种CPU,由于外设的差别其BSP也会不一样。所以根据硬件设计编写和修改BSP,是保证嵌入式系统正常运行的一个重要环节。(3)嵌入式BSP与PC机主板BIOS的区别PC机主板上的BIOS首先是负责在电脑开启时检测、初始化系统设备、装入操作系统并调度操作系统向硬件发出的指令。它的Firmware代码是在芯片生产过程中固化的,一般来说用户是无法修改。然后,为下载运行操作系统做准备,把操作系统由硬盘加载到内存,并传递一些硬件接口设置给系统。在OS正常运行后,BIOS的作用基本上也就完成了,这就是为什么更改BIOS一定要重新关机开机。从这个角度来说,PC机BIOS的作用就象嵌入式系统中的Bootloader,都是最底层的引导软件,初始化主板的基本设置,为接收外部程序做硬件上的准备。但与Bootloader不同的是,BIOS在装载OS系统的同时还传递一些参数设置,而Bootloader只是简单的装载系统。尽管BSP的开始部分和BIOS所做的工作类似,可是大部分又和BIOS不同,作用也完全不同。因为BSP还包含和系统有关的基本驱动,程序员可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP中。而BIOS程序是用户不能更改和编译编程的,只能对参数进行修改设置,当然更不会包含一些基本的硬件驱动。3Boot Loader的启动流程大多数 BootLoader 都包含两种不同的操作模式:启动加载模式和下载模式。启动加载模式也称为自主模式,即 BootLoader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。而下载模式则是目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。这种模式通常在第一次安装内核与根文件系统时被使用,或系统更新时使用。一般嵌入式系统的Boot Loader较为常用的是启动加载模式,它的加载流程也是我们要重点讨论的内容。(1)启动部分启动部分主要是实现初始化硬件的功能。在参考板的BootLoader目录下,会发现一些.s文件,可能会是init.s或者是reset.s等,这样的文件是CPU加电后最先执行的代码。接着Oal.exe通过Startup函数完成硬件的初始化,StartUp 函数是Boot Loader的入口函数。该函数一般是使用汇编语言编写,与CPU关系非常紧密,能完成初始化CPU、内存等核心硬件。Startup.s代码与硬件平台的Bootloader启动代码共用。如果是热启动,即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。在系统硬件初始化完毕之后,Startup调用OALStartUp函数,OALStartUp函数主要完成将OEMAddressTable表传递给内核,然后调用KernelStart函数跳转到内核。因此,这部分工作是BootLoader的一大重点。(2)主控部分StartUp 函数初始化CPU等核心硬件并跳转到Main函数后,系统就会转入C语言代码执行环境。这时函数分为3个模块:BLCOMMON、Download Function、FLASH Function。其中BLCOMMON模块是由微软提供的,执行一些逻辑上的功能,因此建议开发人员不要对其进行修改。而Download Function、FLASH Function中的函数与硬件平台息息相关,因此对于每种硬件平台都要将函数的实现进行修改。其中,BLCOMMON库是与BootLoader程序链接在一起的,BLCOMMON库的入口点为BootloaderMain函数,它是Startup汇编函数完成后跳转至该入口的。Main函数的主要任务时调用BLCommon中的 BootloaderMain()函数,这是BootLoader的主控函数,它控制了BootLoader的完整执行流程。这部分代码由C语言实现,是BLCOMMON代码的一部分,它可以用来执行比较复杂的操作。比如检测内存和Flash的有效性、检测外部设备接口、检测串口并且向已经连接的主机发送调试信息、通过串口等待命令、启动网络接口、建立内存映射等汇编无法完成的工作。(3)下载部分一般在平台调试完毕后,可以在不用人工干预的情况下自动加载CE,这也是BootLoader的功能之一。而在调试阶段时,这需要通过Loader所支持的命令来进行操作的,借助于这些命令不仅可以完成硬件平台的部分测试,还能完成CE的BootLoader程序最为重要的一个功能-下载CE映像。如果说硬件调试功能可以由其它的程序代替而不放入BootLoader中,但是下载映像文件却是BootLoader必需的功能。CE映像文件通常叫做nk.bin,它是Windows CE二
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石大学前儿童保育学课件1-7眼睛耳神经
- 云安全与边缘计算的协同防护-洞察阐释
- 遗传学课程内容更新与跨学科融合的创新模式
- 激励社会力量参与老年助餐服务的可行路径
- 心理健康课思维导图
- 2025至2030年中国波导合分路器行业投资前景及策略咨询报告
- 2025至2030年中国水瓶座图案拼图行业投资前景及策略咨询报告
- 2025至2030年中国气密测试机行业投资前景及策略咨询报告
- 2025至2030年中国橙柑桔清洗打蜡机行业投资前景及策略咨询报告
- 2025至2030年中国木炭烘干机行业投资前景及策略咨询报告
- 2024 - 2025学年浙美版一年级下册美术期末考试试卷及答案
- 口腔合伙人合同协议书
- 2025年中国车载显示行业市场前景预测及投资价值评估分析报告
- DB32T3436-2018 智能信包箱运营管理服务规范
- 地下工程施工安全防范措施
- 商业银行领导力提升培训心得体会
- 校招中建八局面试题目及答案
- 高效规划优化工业园区的基础设施布局
- 新能源汽车基础知识培训课件
- 客户入厂安全培训
- 浙江省医疗服务价格项目目录
评论
0/150
提交评论