嵌入式开发学习心得(共8篇)
嵌入式开发学习心得
就我个人而言,从最开始对嵌入式一窍不通到现在越学越感兴趣,当然相应在嵌入式方面的提高也是很明显的。学习嵌入式越来越成为我学习中的一部分,现在把我的学习过程的心得体会与大家一起分享,希望那些和我一样对嵌入式想学而又迷茫,不知从哪入手的同学朋友有所帮助。基础知识
嵌入式开发很大一部分靠C语言,尤其在底层驱动等用的很多,当然在应用开发还用到诸如C++等其他语言,但我想对于一个初学者有C基础就足够了,等到学到一定程度再去扩展。所以C 基础是学嵌入式的前提。
关于C语言需要知道基本的语法,什么是结构体,什么是共用体,有什么区别,不用强记一些实际中用的很少的东西。C++要知道什么是类,怎么定义,继承,接口,要深刻理解,当然基本语法也是必不可少的。
操作系统原理也需要基本理解和掌握的,我记得我上课的时候不以为然没有认真学习,后来发现很多的东西都是在这个课上讲到的。什么时间片啊,任务调度啊,都是在那里知道的。
Linux基本命令的使用(vi编辑器必须会用,因为在终端修改文件的时候只能用这个),我们现在很多的人都习惯用鼠标了,很少用到命令,我学习嵌入Linux就强迫自己去改掉这个习惯了,Linux用命令操作一是效率高,二是功能非常强大,远非图形界面能比的了的,其实我们用图形界面的操作都要转化为命令传给硬件的。Linux文件系统的管理要清楚,哪个目录存放是什么东西,有什么用,文件权限管理等。单片机知识的学习
我觉得单片机、嵌入式等这一类都有很大的相似性,知识功能不一样,但工作的原理、控制原理都和大的相似。就我个人而言,能比较快的进入嵌入式的学习与提高,很大一部分依赖于对单片机的原理有较深入的学习和理解,单片机比较简单,学习起来相对比较容易,所以我建议想学嵌入式的同学,可以和我一样从单片机入手,那样不仅可以理解这些微处理器、微控制器的操作与控制原理,当然还可以顺便学学汇编语言,这对后面的嵌入式学习都有很大的帮助。
看书不要希望一次就会,一次就明白是什么意思,也不要死记硬背,看不明白也没关系,以后遇到了知道去哪里去找就可以了,以后遇到的多了,也就记住了,遇到的少的,忘记也就忘记了。还有,不要直接阅读Linux内核源代码,看一些自己把头撞破也想不明白的事,一开始很打击我的积极性,要循序渐进,刚开始我就从学习做led开始的,接着学习做个串口,慢慢的就开始学着做硬件编解码了。学习开发板
我在刚开始学习嵌入式时就买了一块学习板,现在的开发板不是很贵,给很我们初学者减轻了经济负担。看再多的视频,看再多的书,也不如自己动手试一下,看着很简单的东西,做起来就可能遇到很多的问题,遇到问题找到原因,解决问题,只有这样才能学到东西,记得我第一次写led的驱动,想自己试一下,网上也有人写过相关的代码,可是自己一试,就出了好多的问题,那个led弄了我一天才把led灯点亮。所以不要眼高手低。不要好高骛远,要脚踏实地
我拿到开发板时,很兴奋也很激动,想法自然也很多,想用开发板实现自己的这个想法,实现那个想法,然后又不知道从何下手,然后就去论坛中发一个贴,“那个什么什么怎么实现啊,哪位大侠能详细说一下啊,跪求!”,然后等着别人去回复。我觉得有想法是好的,我们要实现自己的想法也是有前提的,首先,我们对这部分知识了解吗?如果不了解就去Google一下(最好别用百度,不太好用),了解了一些,也就大概知道要怎么做了。如果再遇到问题,再去发贴问,这样也显得我们有一点点水平啦。比如自己连串口是什么都不太清楚呢,就问串口通信怎么做啊,就是人家把代码给我们,我们也不明白是怎么回事啊。多看代码,多写代码
见多识广,熟能生巧。多看代码,要从代码中读出代码的意思来。自己平时也要多写代码,多练习(这一点我做的不好,写的少)。
个人觉得这是最重要的一种做法。这东西没自己亲手做,程序没亲手写,没有进行调试等,都是很难学到东西,因为很多东西感觉看的都懂,其实真正做起来就什么都不会了。因此买块板来自己做,这样才能真正将所学的应用到实际中去。而且这样做印象才能深刻,死记硬背原理及规则不但不可行还会拖垮你的学习兴趣,自然学不下。
为了推动移动数字嵌入式系统产业的发展,支持国内外高等院校、研究机构、产品厂商的嵌入式系统的技术研发和技术学习,深圳市爱国者嵌入式系统科技有限公司于2009年在此开辟技术园地,为期一年。正式推出R&D aigo EMD系列移动多媒体/移动数字电视/无线网络WiFi/全球定位导航嵌入式系统开发与学习平台,欢迎交流。同时针对高等院校还可提供S D K配套资料的讲解、学习与培训,安排工程师协助老师按照课程要求设计实验指导书,针对具体要求提供部分硬件设计更改和实验指导书按要求设计,并且可与高校建立联合教学实验室,共同推动嵌入式系统学习与科研。
E M D系列S D K功能简介
·用于嵌入式移动多媒体开发与学习
·用于GPS开发与学习
·用于嵌入式移动数字电视开发与学习
·用于无线网络WIFI/Bluetooth开发与学习
·用于嵌入式linux内核开发与学习
·用于嵌入式linux应用软件 (产品界面) 开发与学习
应用范围
不仅可以用于高校教学和技术培训,而且可以用以开发医疗仪器、消费电子、工业控制、军事应用、汽车电子、多媒体等嵌入式终端设备的技术开发。
E M D系列S D K产品简介
1.R&D aigo EMD1001 ARM9/Linux/Multilmedia/WALN SDK
2.R&D aigo EMD1002 ARM11/Linux/Multilmedia SDK
3.R&D aigo EMD1003 ARM11/Linux/GPS SDK
4.R&D aigo EMD1004 ARM11/Linux/DTV SDK
5.R&D aigo EMD1005 ARM11/Linux/WIFI SDK
SDK平台套件的技术资源提供
1.Linux内核源代码
2.平台各个硬件驱动源代码
3.硬件驱动设计学习指导书及驱动测试程序源代码
4.基于EmTK的linux UI界面开发环境
5.丰富的UI开发例程及实验指导书
6.实验教学培训
联系电话:0755-26037899
近年来,因汽车设备中的软件出了问题导致的召回事件时有发生,很多企业都因为产品中软件的质量问题,而对整个业务造成了重大的伤害。对于嵌入式产品来说,产品中软件的质量至关重要。物联网强调的不是一个孤立的解决方案,而是一个更大的系统组件——可以通过定制或者调整来满足个人用户或企业的个性化需求。为了实现这一目标,必须借助软件、微电子原件、传感器和机械技术等创新成果的全面整合。
嵌入式软件系统结构越来越复杂,嵌入式软件的开发也变成复杂的系统工程。早期的嵌入式系统开发者多是电子工程、自动控制等领域的工程师,软件基本上都是用汇编语言实现的。近年来,随着物联网的发展,嵌入式系统的功能要求也越来越多样化,而安全性、可靠性、响应速度、功耗等要求也越来越高,从软硬件系统与平台选择、设计、开发到测试与集成,整个过程都是软硬件并行交互进行的,因此,嵌入式软件开发已经成为一项很复杂的系统工程,其开发必须遵循系统工程和软件工程的要求。
IBM软件集团Rational全球系统平台开发及嵌入式系统副总裁Meg Selfe表示:“企业在打造软件开发与交付实力时,不仅要着眼于功能创新,还应以系统工程的视角,使得软件构件与日趋复杂的电子、电气、机械等子系统智能融合,并且与其他智慧的系统实现高度互联,软件开发环境和平台正是实现软件创新的基础。以汽车行业为例,通用汽车基于Rational平台上进行软硬件的开发,从设计到上市仅用了29个月。而在过去,这样的新车项目需要花费5到10年时间才能投放市场。”据了解,众多国内汽车厂商正在采用Rational产品来开发嵌入式应用程序,用自主创新的信息技术更好地管理客户和市场需求,并进行建模编程,完成自动化的功能测试,用户可借助Rational的软件开发技术有效实现开发过程中的投资回报最大化。
据了解,IBM在嵌入式方向关注五个重点领域,即汽车、飞机航空、电子业、核电等能源行业、电信行业,分为产品本身的发展、产品与产品之间的互动,以及系统上的系统这三个层次。Rational以Jazz平台为基础的协同和集成软件平台为嵌入式软件开发提供了一个良好的交付平台,它有助于企业专注于软件开发,创造出更加强大的差异化功能。此外,Rational还提供了一些重要的系统工程解决方案,比如需求工程、整合变更管理、模型驱动系统开发和产品组合管理等,帮助企业更好地管理软件开发的成本与交付时间,确保制造商在正确的时间将产品推向市场。
在复杂的嵌入系统软件开发过程中,好的软件开发方法和软件治理手段对提高产品的质量是非常必要的。因此,嵌入式软件开发必须磨练内功,才能跟上瞬息万变的信息化社会步伐。
联联看
广东物联网实施意见出台
广东日前正式出台了《关于加快发展物联网建设智慧广东的实施意见》,进一步细化了未来广东在加快物联网发展及推动智慧广东建设方面的内容和措施。目前,广东正在重点实施智慧广州、智慧深圳等智慧城市试点,和智慧南海、智慧石龙等智慧城镇试点。
对于“十二五”时期物联网的发展目标,《意见》表示,到2012年,广东物联网产业总产值超1000亿元,规模以上企业超过1000家,发明专利受理和技术标准超过1000项,机器对机器(M2M)应用终端数量超过1000万台。到2015年,在无线射频识别(RFID)、传感器、短距离无线通信和网络、M2M和嵌入式系统等重点设备制造领域将建成一批产业集群,形成国内重要的产业基地;培育一批在国内具有较大影响力的系统集成企业,扶持一批具有创新商业模式的网络运营服务企业,集聚一批具有自主知识产权、占领技术高端的创新型企业。
《意见》指出,在技术方面,将重点突破物联网芯片、RFID、光纤传感、各种传感器融合、嵌入式智能装备、物联网IP组网等关键技术,以及物联网的相关标准、交换接口、信息安全、云计算协同等共性技术。
《意见》表示,将选择一批技术先进、带动和支撑作用强的物联网重大项目纳入广东省重点项目规划和年度实施计划,并大力推进实施。充分利用现有战略性新兴产业、产学研、技术改造、现代服务业等财政专项资金,支持物联网发展。同时,支持物联网核心技术研发和产业化,开展公共服务平台建设,扶持物联网重点项目应用试点。
在广东,汇集着一大批与物联网产业相关的信息技术产业的上市公司,包括东信和平、远望谷、中兴通讯、长城电脑、飞马国际、怡亚通、沃尔核材、粤富华、长园集团、智光电气、科陆电子、远光软件、广电运通、御银股份、超声电子、世纪鼎利、达华智能等。
物联网产业“十二五”规划构架已成型
物联网“十二五”规划课题组核心成员日前透露,由工业和信息化部主导的《物联网产业“十二五”规划》已完成起草工作,现已进入最后论证阶段,其基本构架已成型。
根据国家“十二五”规划纲要,智能电网、智能交通、智能物流、智能家居、环境与安全检测、工业与自动化控制、医疗健康、精细农牧业、金融与服务业、国防军事是物联网产业重点发展的十大领域,《物联网产业“十二五”规划》或将对这些领域给出针对性的专项规划。
如何学习嵌入式系统(基于ARM平台)
前言
网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。也请大家不要轻易转载。
一、嵌入式系统的概念
着重理解“嵌入”的概念
主要从三个方面上来理解。
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与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%的人能知道吧。
六、成为高级嵌入式系统硬件工程师要具备的技能。
首先我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通,或去网站看看/ ”,而且出版社还提供了一个非常好的路线图:http:///guide/guide_linux.php。
四、选择一个适合你的Linux发行版本:目前全球有超过1百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,Redhat Linux 和Debian Linux是网络管理员的理想选择。对于英语不是很好的读者红旗Linux、中标Linux这些中文版本比较适合。现在一些Linux网站有一些Linux版本的免费下载,这里要说的是并不适合Linux初学者。
五、养成在命令行下工作: 一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,您未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也能操纵几千公里以外地远程系统。
六、选择一个适合你的Linux社区: 随着Linux应用的扩展,出现了不少Linux社区。其中有一些非常优秀的社区:www.linuxforum.net(国内最高水平GNU站点)、http://www.chinaunix.net/(中国最大的Unix技术社区),但是这几个论坛往往是Linux高手的舞台,如果在探讨高级技巧的论坛张贴非常初级的问题经常会没有结果。
七、勤于实践: 要增加自己Linux 的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个 Linux 发行版本,然后进入精彩的Linux世界。相信对于你自己的 Linux 能力必然大有斩获。此外,人脑不像计算机的硬盘一样,除非硬盘坏掉了或者是资料被你抹掉了,否则储存的资料将永远而且立刻的记忆在硬盘中。在人类记忆的曲线中,你必须要不断的重复练习才会将一件事情记得比较熟。同样的,学习Linux 也一样,如果你无法经常学习的话,学了后面的,前面的忘了。你对Linux命令熟悉后你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。当然你不需搭建所有服务,可以慢慢来。需要说明的是这个Linux网络对于初学者有两三台计算机即可,其中一台计算机最好安装Windows系统。自己多动手,不要非要等着别人帮你解决问题。
八、如何得到联机帮助:和私有操作系统不同,各个Linux的发行版本的技术支持时间都较短,这对于Linux初学者是往往不够的。其实当你安装了一个完整的Linux系统后其中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。
1.主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。
2.查阅经典工具书和Howto,特别是Howto是全球数以万计的Linux、Unix的经验总结非常有参考价值通常40%的问题同样可以解决。
九、在Linux论坛获取帮助:如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人,Linux高手更具有鼓励新手的文化精神。如何在Linux社区获得帮助,需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问,否则只会得到到草率的回答或者根本得 不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。最好先搜寻一下论坛是否有您需要的文章。这样可以获得事半功倍的效果。下面笔者在论坛看到的一个好问题:“安装红旗4.0 后,系统紫光输入法自带的双拼方案和我的习惯不一样,如何自定义双拼方案解决?谢谢?”这个问题很简练,笔者五分钟后就给出了解决方法:“首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑/usr/local/unispim/unispimsp.ini,最后重启动计算机,生成新的unispimsp.ksc”另外得到回复后如果问题解决,向帮助过你的人发个说明,让他们知道问题是怎样解决的,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。下面看看一个让人无法回答的问题:“救命各位高手,向你们请教一些问题:如何在Linux下配制HTTP、FTP、Samba、DNS、DHCP、Sendmail服务器,谢谢” 这样的问题我想即使Linux高手也很难快速准确精练的回答你。你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。可能你会遇到这种情况,对于一个问题会出现不同内容回答,这时你需要通过实践来验证。另外把这个问题放在其他Linux社区请求帮助也是一种选择。如果得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。另外发问的时候一定要注意到某些礼节。因为Linux社区是一个松散的组织、也不承担回复每个帖子的义务。它不是技术支持。
十、用Unix思维学习Linux:Linux是参照Unix思想设计的,理解掌握Linux必须按照Unix思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。
十一、学习专业英文:如果你想深入学习Linux,看不懂因为文档实在是太难了。写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志和网络上发表。安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
十二、最后是Linux学习的路线图: 1. 掌握至少50个以上的常用命令。
2. 熟悉Gnome/KDE等X-windows桌面环境操作。
3. 掌握.tgz、.rpm等软件包的常用安装方法
4. 学习添加外设,安装设备驱动程序(比如网卡)5. 熟悉Grub/Lilo引导器及简单的修复操作。
6. 熟悉Linux文件系统和目录结构。
7. 掌握vi,gcc,gdb等常用编辑器,编译器,调试器。Linux下编程,主要是选用一个文本编辑工具(如vi eclipse nano gedit等)编写,再用GCC编译链接,最后用gdb调试。8. 理解shell别名、管道、I/O重定向、输入和输出以及shell脚本编程。9. 学习Linux环境下的组网。
十三、深入学习linux的大致方向
1.文件系统:linux的相关的系统设定,各种linux环境下的软件的使用与调试。这类知识是基础,但并不简单,学好了,绝对可以当讲师的。
2.网络服务:linux这种类UNIX的操作系统其另一个作用域是网络服务器。linux本身自带几乎所有网络上的用得到的服务,可以充当任何网络服务器,比如DNS、DHCP、ftp、NFS、Proxy等等。而且其特点是,所有这些服务的配置与设定都可以通过文本形式的配置文件进行配置。所以学好linux下网络服务的配置与使用,完全可以当CIO(首席信息官)了,因为已经具备linux网络工程师的能力了。3.软件设计:linux是开源的大环境,也是较原始的编成环境,其下的C/C++、PHP等都是比windows下更纯语言。但linux下高级的开发环境较少,不像VC等工具好使,所以linux下的软件工程师要具备的知识更多。要是学好了linux下的软件设计,也算编成是高手了。
linux这三大块知识的学习不相互影响,但也有相互依赖和促进的作用,想深入某一个领域,不见得要其它领域都掌握,但建议也对其它领域也有所涉及,会有事半功倍的效果。
十四、学习嵌入式linux的三个方向
1、嵌入式linux应用软件开发
2、linux内核的剪裁和移植
3、嵌入式linux底层驱动的开发
无论选择哪一方向,基本的linux的知识是需要具备的,其他还需要掌握的知识有ARM(最常用的一款嵌入式处理器)和C语言编程,每一方面知识的掌握熟练程度都最终决定了个人进行嵌入式linux开发的综合能力。
嵌入式Linux学前建议(初学者必读)
目前,Linux作为嵌入式系统的主力军,广泛应用于消费类电子、工业控制、军工电子、电信/网络/通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。随着嵌入式行业的迅猛发展,嵌入式Linux凭借其系统发展的成熟度、市场应用的高份额也受到更多工程师朋友的青睐,越来越多的企业和研发机构都转向嵌入式Linux的开发和研究,这使得嵌入式Linux在新兴的嵌入式操作系统领域内也获得了飞速发展和广泛应用。而对于那些希望尽快进入嵌入式行业从事产品研发的朋友们,选择嵌入式Linux方向作为切入点无疑是最好的途径之一。
近期,有许多面临毕业、找工作的大学生来到华清远见嵌入式培训中心咨询了解有关嵌入式Linux方向的学习安排。在与他们交流沟通的过程中,被问到最多的几个问题就是“如何做好嵌入式Linux学习前的准备?”,“学习嵌入式Linux需要补习哪些基础课程?”,“嵌入式Linux开发跟普通软件开发在学习方法上有什么不同?”,“项目实战环节多吗?”,“有专业人员带领吗?”,相信这些也是很多准备入行的初学者都会关心的问题,为了帮助大家做好嵌入式Linux的学前准备,我们对这些常见的问题逐一进行解答,提供给大家参考,希望能够有所帮助。
1、如何做好嵌入式Linux学习前的准备?
要成为一名合格的嵌入式Linux工程师,就需要系统的学习软、硬件相关领域内的知识,需要在最开始就掌握开发的规范和原则,养成良好的工作习惯。为了确保学习的效果,华清远见安排的整个课程体系是非常集中、高效的,这就要求准备参加嵌入式Linux就业课程学习的同学要调整好自己的时间,务必要确保在4个多月的学习时间内能够高度集中精力。在整个集中学习过程中,既要保证课上认真听讲、实战演练的时间,也要保证课下继续实战演练、查阅资料的时间。只有经过这种高强度的、实战为主的训练,才能够在比较短的时间内掌握规范的嵌入式开发工作流程,让自己符合嵌入式企业对应岗位的需求。
除了在学习时间上要做好充分的准备之外,在学习的心态和方法的调整上也要做好准备。许多朋友只了解嵌入式Linux方向美好的发展前景,只关注高收入、就业机会多等热点,却忽略了学习过程本身。为了能够让集中培训的效果发挥到最佳,建议大家在学习开始前更多地去了解嵌入式产品研发的特点、所需要掌握的技术规范和工作要点,关注需具备基础的补充和学习,从而为后续的强化学习过程做好心态上的准备,毕竟态度往往决定了最后做事的结果。
2、学习嵌入式Linux需要补习哪些基础课程?
嵌入式Linux工程师的学习需要具备一定的C语言基础,因此面对许多朋友只是在大一或者大二学习过C(还不一定认真学了,呵呵!),之后基本就不再用过的情况,建议大家在来华清远见学习之前先复习一下C语言基础这块。要提醒大家的是,复习时不能只关注基本语法,对于常用的数据存储及处理方式,例如:数组、结构体等也要关注,有条件的话一定在机器上亲自敲敲代码、分析理解一下具体案例代码编写的思路,让自己慢慢进入一名嵌入式开发人员的状态。
此外,在时间允许的情况下,建议大家看一下有关计算机操作系统工作原理以及计算机组成原理等方面的专业书籍。对于进程、线程、任务调度、总线、I/O等基本概念及工作原理有一个初步的了解和掌握,这部分知识的准备对于后续更好地学习嵌入式Linux系统开发将会起到很好的帮助作用。
3、嵌入式Linux开发跟普通软件开发在学习方法上有什么不同?
要成为一名成功的嵌入式软件开发人员,程序的设计能力是首要技能,这一点与普通的软件开发人员的要求是一样的。但是作为“软硬兼施”的嵌入式开发,则要求大家不仅要了解较底层软件的工作过程和工作原理(例如操作系统级、驱动程序级软件),在软件开发的专业水平上也需要充分考虑软件设计的时间和空间效率,这样才能设计出高性能嵌入式程序。
因此面对相对复杂的嵌入式系统的研发过程,在学习的过程中需要更多关注完整的知识体系结构的建立。特别是对于原理性知识的掌握程度则相对普通的软件开发人员提出了更高的要求。因此在学习的过程中,“要知其然,更要知其所以然”。
同时由于一直以来嵌入式行业中专业人才的紧缺,许多经验性的东西都有待交流和分享,因此充分关注与每一位讲师的实际经验交流就显得至关重要。华清远见的每一位专业讲师都拥有多年的嵌入式Linux开发经验,他们在各自擅长的领域内都有很多值得分享和交流的体会,因此通过他们课堂的讲解、示范,通过充分的交流沟通,无疑可以大大缩短在行业中摸索的时间,记住不要以为原理性的东西通过看书就能解决,借助这些行业高手的透彻分析,才能让你的学习过程更有价值、更加实用。
4、华清远见的课程体系中项目实战环节多吗?有专业人员带领吗?
由于大多数人对嵌入式开发过程的陌生,因此实战环节的训练就显得格外重要。在嵌入式Linux课程学习的每个阶段,都需要在专业人员的引导下,通过全真的案例设计与实现来巩固所学的知识点。同时我们要求大家尽可能在课堂上多出问题、多暴露问题,只有这样,才能通过专业人员的及时帮助和指导,最高效地掌握解决实际问题的方式和方法,积累足够的技术经验和项目经验。
同时也只有通过最终综合项目实战环节的密集训练,才能够逐步建立起嵌入式产品开发的工程化概念。在这个过程中,除了可以达到所学知识综合、实际应用的目的,还可以让大家更真实地体验到如何编写工程化程序?如何在设计中与团队协作开发?如何为后续有效地升级与维护做好准备?如何编写规范的文档等?而这些体验都将为后续真正从事企业内工程化的软件设计做好充分的准备。
在嵌入式系统的大门前,我只能算是刚刚看到这个大门的台阶,但这段小小的距离让我受益颇多,现将其中心得奉献出来,欢迎高手前辈们指正,以供刚接触的新人参考。
在写之前,想先写一句话,千万不要以为你是天才,所谓天才即胜别人N倍的人,如果你真认为你是天才,请以天才的标准来要求自己,将自己付出和别人的比例以N:1来进行。
(1)学习与生活心态
很多朋友都是在刚步入大学校门开始接触计算机或者其他。大学是一个很让人迷茫颓废的地方,可能你在高中踌躇满志,但在大学的管理机制下却心态渐糜。能够在大学(大一)里找到自己人生之志的同学有多少?目标要明确,不要得过且过,不要追逐热门的东西。
不管在什么时候,心里都要有自己的信念和理想,不要被其他东西左右了自己。要从兴趣和竞争出发,因为这才是你产生动力源的地方。学东西时,要让自己先喜欢上它,要学会享受学习它的时间,喜欢乔___的都知道,乔老爷子最常说的一句就是要享受比赛的时间。
因为只有你喜欢上了它,享受了它,才不会被它所产生的压力压倒自己,不要产生一种厌恶的心理。而且心态要调整,不要一味的蛮学,死学,在没有什么兴趣学的时候可以先玩几天,在回过头来,或者用其他的方式来转换。要抱着一种十年方能磨一剑的心理,扎扎实实从基础开始,不要为高速开发的一些现象所迷惑,那些都只是软件的功劳。
我个人认为搞编程,英语和数学很重要,大家一定要时时的抓,至于怎么抓那就是另外一回事了,当然其他的知识也要汲取,可以多接触点天文,地理,人文方面的东西来补充自己。转换的生活方式。要学会生活,在人的一生中,都会遇到一些很不开心的事,或者大大小小的意外,孙子兵法里面一句大意就是说,战场上要会将劣势转成优势,即最大的劣势很可能就是你的优势所在。
一个打击你可以把他变为前进的动力,不必为了一点挫折和捶胸顿足,不必为了一点小事争吵不休。空闲的时候可以躺下来看看天,你就会明白自强不息,厚德载物之理。(看到一些为了失恋或者其他而堕落的人真的很难受和可惜) 。
要给人以帮助。别人有困难时或者一些举手之劳在自己解决范围内的尽力帮之,这对自己不会损失什么,相反在对方心里能够树立你的形象和增加好感。记住,给人之恩时也是给你自己铺路,这个世界不是靠你一个人可改变的。
(2)编程语言的选择 语言的争论。很多初学择,老是在学习何种语言上举棋不定,试问,中国牌子有几个不被骂的,试问,世界上哪部影片没人说他坏话的?术业有专攻,各司其职,每个语言的出现肯定都有自己价值和领域的范围,不同的只是价值和领域的高级和大小。
就像高,矮,胖,瘦组成一个“型”。但是技术是进步的,这个进步也是在旧的基础上。放心,技术再飞跃也不会今天奔I,明天扣肉的迅速,在学习的同时也要时时关注整个语言界的走势(貌似哪个伟人说的与时俱进),保持一种同步曲线的前进。语言能干什么?能问这句话,很欣慰。
表明你是从基础学起才会问出这样的话来。但换而言之你一开始对这门语言调查的信息不足。庙算者胜,对自己身边的事物了解是非常重要的,这也能说明说你的教材或者教导你的人不够充分。如果是我对新手交流,我会花足时间让他明白这门语言是什么,能干什么,整个体系等等。
这样在学的时候,对同一条语句上的理解你可能跟别人就不一样了, 因为你知道这门语言的体系架构,你可以从更多的特性角度去挖掘使用它。提高自己对语言阅读能力。如何快速的进步?可以告诉你没有一步登天的办法,但是也可以告诉你如何让你快速掌握你所学的技术。多读他人代码,多领悟他人思维,多给自己出难题,多几种方法来解问题,多将语言的思想和身边的事物联系起来。想想你是怎么掌握普通话的,方法就不具体说了。
编程的思维。计算机是充满诱惑的东西,很多人都说热爱计算机,那只是它的表面,你热爱的只是他的一种扩展性的东西。能学计算机我很高兴,因为计算机从某种意义上来说将空间的距离给消除掉了。这里没有流血,没有牺牲。你可以以一种艺术家的思维来塑造它,可以以侦探的逻辑思维来解决它,可以以一种战争狂人的思维来摧毁它。
1. 代码是软件开发的基础
编码是软件开发过程中最基本、最底层的技艺,然而也是最重要的技艺。任何一个领域的专家都需要花费大量的时间来进行基本技艺的锻炼,木匠需要花费大量的时间来锻炼他们对各种工具的掌握,厨师则需要练习刀工和火候。程序员也是一样的,对我们来说,语言的各种特性必须要了然于胸。而对软件的管理也需要从代码做起。
从到现在,国内兴起了一股软件工程热,需求管理、配置管理、甚至CMM。面对纷至沓来的各种方法学、UML、OOA,大家似乎已经热衷于这些概念本身了,却往往忽略了软件开发中最基本的元素:代码。在和很多软件组织的接触过程中,我们认为大多数组织急切需要的并不是这些工程理论,不是说这些理论不重要,而是这些组织的症结不在于此。很多的组织连代码的质量都管理不好,又何谈其它呢?代码管理是基础的基础,从管理的角度上来看,任何一个组织的管理都需要一个从上至下的管理过程,有基层的管理人员,也有高层的管理人员。对代码的管理就是软件开发中的基层管理,它起到的作用就是能够把需求、设计的思路贯彻到最终的代码中。
“管理无大事”。对软件的管理也是一样,大部分的问题都是由于很小的原因引起的。例如,一个产品如果后期在debug上花费了大量的时间,那么,这种现象是由于什么原因引起的?一种可能的原因是前期的代码设计中对代码质量的把握不严。每一次代码功能的演化并不会产生太多的问题,但是当代码累积越来越多的时候,问题也就慢慢出现了。那么如何解决呢?可以加强QA的力量,也可以引入复审,还可以引入单元测试。总之,要有一种方法对代码进行控制。
软件的开发过程就象是一部精密的机器,任何一个环节的变化,都会对其它的环节产生影响。把软件过程按照瀑布的形式进行划分是一种分解的处理思路,但同时我们还应该看到不同活动之间的相互影响。软件开发中的生命周期模型也是一个层次模型,从业务建模一直到软件实现,需要跨越数个层次,同样会出现执行不力的情况,例如,代码设计偏离需求、偏离设计的情况比比皆是。
如何避免这种情况呢?这就需要我们从源代码的角度,反思其上游的实践活动,是否足以约束代码设计?就拿XP来说,他解决这个问题的方式是尽快的进入代码开发阶段,从代码开发中发现问题,并在下一轮的开发中解决。这种思路是正确的,但XP毕竟是方法论,他不会告诉你过于细节的东西,尽管XP已经提供了大量面向代码的实践。因为方法论的抽象级别比较高,使得他必须舍弃部分的细节。而这篇文章告诉你的,就是这些细节。就像我们在下一节中讨论的例子,需要在代码中加入对异常的处理,那么,异常的源头在哪里呢?是需求,在需求中,我们发现了一些业务的非正常的处理序列,发现了一些业务实体的限制性的要求,所以在代码实现中,就需要有相应的异常处理。在例如,一个优秀的异常处理,还需要让客户端程序员了解可能发生的异常,以保证不同代码间正确的集成。
2. 面向对象的代码
面向对象的代码已经在现在的软件开发中占据了主流的位置,面向对象的思路也有其优势所在,就像后文所讨论的,面向对象代码有着非面向对象代码的很多优势,而软件业中很多新的思潮的产生,也都是基于面向对象语言的,所以我们关注的代码将是面向对象代码。
面向对象的思想来自于抽象数据类型。对于面向对象来说,它最重要的改进就是把世间万物都描述为对象,而类则描述了同一种对象的特征,而不是像传统的开发方法那样,按照机器指令的执行顺序来进行设计。当然,面向对象代码最终仍然是要按照时序来执行的,但是从程序员的角度看来,面向对象代码更侧重于对象之间的交互,多个对象各司其职,相互协作以完成目标。而面向对象技术的发展,也是朝着更加贴近我们世界观的方向发展。从这点来看,有人说完全没有程序设计经验的人学习面向对象可能会更加的容易,因为他不需要从原先的时序程序的桎梏中摆脱出来,但这未必是事实。面向对象决不是一种简单的程序设计思路。这是我们的观点,也会在下文中反复的论证。
和所有的职业一样,程序员,或者是面向对象程序员,始终坚持的一点就是严谨。你会看到各种各样优秀的代码,但那决不是一次能够写成的,要不断的尝试,不断的改进。为什么重构和测试优先是敏捷方法中很重要的一项实践?因为程序员不是神,他们需要慢慢改进他们的代码。虽然罗马不是一天能够建成的,但是在编写面向对象代码的过程中,有一些实践是需要坚持的,它体现了我们所说的严谨。
3. 编写并管理面向对象的代码
编写优秀的面向对象代码并不是一件容易的事情,优秀的OO代码如行云流水,糟糕的OO代码让人觉得浑身起鸡皮疙瘩。编写优秀的OO代码要求程序员有一定的自我修养,能够以抽象的思路看待问题,找到问题的核心并对问题域进行分解。它强调的是一种解题的思路,但这个解不是唯一的。
典型的例子是设计模式,设计模式确实给了我们以很大的启发,通过它,我们能够了解到优秀的代码是如何用于解决实际问题的。但是是不是你必须在软件中照搬设计模式呢?如果你这么做,那么你对设计模式的理解仍然不够。我曾和在建筑行业的朋友聊起Christopher Alexander的建筑的永恒之道。他很兴奋的告诉我,那确实是一本很好的书,能够引发人很深的思考,但是现在也有另外的一种观点,认为美仍然是无形的,应该发自建筑师的内心。对这句话我思考了很久,其实建筑是给人使用的,因此最重要的是它能都给人带来的价值,隐含在其中的那种活生生的气质,这是建筑师文化底蕴的外在表露。所以,Christopher Alexander在那本书中的目的,也是为了找到一种总结自己观点的方法,来总结自己对人文的认识。至于现在大家对他的思路提出了质疑,那也是一件好事,这说明大家对建筑之道的认识到了新的高度。建筑是这样,软件中的模式也是一样的,我也曾热衷于研究模式的使用,直到某一天我猛然惊醒,与其沉迷于模式的表面形式,为什么不去研究隐藏在它背后的文化底蕴呢?武侠小说中常说无招胜有招,模式的应用也应当到达这个境界,你如果可以在不经意间应用模式的思想,那又何必拘泥于模式的形式呢?
编写优秀OO代码虽难,但还有更难的事情,就是让整个开发团队都产出优秀的OO代码。我们刚才说了,OO对问题的解不是唯一的,但各个不同的优秀解汇集到一起,可能就是一个糟糕的解,这是风格和架构的问题。你如何在团队中制定制度,营造氛围,让优秀OO代码成为团队最终的成果?这些问题,在我看来,要比CMM难得多,这个问题并不是靠花钱就能够解决的。如果能够解决这个问题,这个团队的创造力一定是惊人的。
4. 面向对象软件开发过程
普通的软件开发过程和面向对象开发过程有着很大的不同。回想我们在非面向对象中开发过程中,最经常采用的任务分配方法就是以软件模块为单位,这样的好处是分配简单,不同任务之间耦合程度低,容易操作。坏处是几乎无法做到重用,也缺乏整体性的设计。而面向对象软件开发则不同,它是以类、类集合作为基本单位的。类之间关系错综复杂(虽然我们提倡低耦合的设计,但类之间的关系仍然是相对复杂的)。这种情况下程序员之间相互协作的要求就非常之高,这种关系如果处理恰当,则能够完全体现出面向对象的威力,否则,那将会是一场大灾难,面向对象的软件开发过程要养成一些好的习惯:
4. 1 尽量简化和稳定客户端。
个人编程可以是一种享受,但团队开发始终是一项严谨的职业活动,因此多考虑别人,不要设计复杂的接口,虽然你省事了,但这会给理解和使用你的接口和人造成障碍。
4.2 准备一份简洁的文档,并保持更新。
随便一种形式的稳定,可以是代码,可以是UML图,也可以是纯粹的文字(估计没几个程序员喜欢这种形式)。只要它能够传达你的代码的目的,那就足够。记住,更新代码后,同时更新你的文档。过期的文档不仅是废纸这么简单,它会给其它人造成麻烦。切记!
敏捷开发方法强调快速迭代、持续集成、以人文本, 简化了重型软件工程方法的过程和规约, 使得开发更加灵活, 可以适应软件需求的变化性和不确定性。由于嵌入式系统具有面向应用、软硬件结合、要求高可靠性等特点, 使得其需求较为复杂, 而且随着嵌入式产品规模不断扩大, 新技术不断出现, 开发周期不断缩短, 嵌入式系统开发需要突破传统开发方法, 可以将敏捷开发方法与嵌入式系统开发方法结合, 从而提高嵌入式系统的开发水平和软件质量。
在嵌入式系统的开发中, 可以使用多V模型, 它将开发过程分为多个“V”字, 经历原型阶段、模型阶段和产品阶段三个阶段。多V模型与敏捷开发方法一样, 采用多次迭代的方法, 持续开发出可运行的软件, 可以很好地应对需求的变化和增删, 大大节省嵌入式软件开发的时间和成本。
本文首先简要介绍了敏捷开发和多V模型, 然后将多V模型作为主体, 将敏捷开发的价值观和实践原则作为具体应用原则, 形成一套体用结合的嵌入式软件开发方法, 然后将这个方法应用到嵌入式温室网关开发之中, 并详细介绍其开发过程。
2敏捷开发开发方法与嵌入式多V开发模型的结合
2.1敏捷开发方法简介
敏捷开发方法的“敏捷”思想是从制造业的“敏捷制造”引入的, 强调的是软件开发方法的适应性, 也就是可以适应软件需求的模糊性、不确定性和易变性等特点, 简化了传统的重型软件工程方法中的强调周密的计划、面面俱到的文档、充分完整的需求分析和技术评审, 取而代之以适应性而非预测性, 以人为本而非以过程为导向, 以面对面的交流而非文档交流, 以客户全程参与而非依赖固定的软件开发合同约定。
2.2嵌入式系统的多V开发模型简介
在嵌入式系统中, 通常需要对系统的基于“应用为中心”的需求, 进行软件和硬件进行协同设计, 使得项目存在较多的不确定性, 因此, 嵌入式系统的开发需要一个探索和验证的过程, 多V模型正是适应这一需要而提出的, 如图1所示。
从图1可以看出, 嵌入式多V模型的模型阶段、原型阶段和产品阶段是相互紧密衔接的, 每一个阶段都要经历需求分析、系统设计、开发实现、系统测试、系统发布等几个步骤, 但前一个阶段的系统发布阶段是后一个阶段的需求分析的起点。这样的设计方法, 可以将前一版本软件中的缺陷, 在后一版本中加以解决;多次迭代的方法, 也使得新的需求或者变动的需求, 可以方便地增加到后一版本的软件之中, 不断清晰客户的需求, 不断完善软件的功能, 起到事半功倍的效果。
2.3敏捷开发方法与嵌入式多V开发模型的结合
敏捷开发方法和嵌入式多V开发模型都采用了多次迭代的模式, 然而敏捷开发方法是一套方法论, 提供了其价值观和实践原则, 没有规定具体的软件开发步骤。因此, 可以把多V模型作为嵌入式软件开发的主体过程, 而将敏捷开发的多次迭代、持续集成、结对编程、特色会议体系等作为应用措施, 融合到其中, 使得两者形成有机的结合。
将多V模型和敏捷开发方法相结合, 可以得到以下的嵌入式系统开发流程。
(1) 开发分为模型阶段、原型阶段和产品阶段, 每个阶段都起于需求分析, 对需求进行细化, 根据重要性赋予不同的优先级;然后再进行系统设计、实现和测试。测试的结果以及新的或变动的需求, 作为下一个阶段的新的起点。
(2) 在模型阶段中, 软件开发主要进行建模及其分析, 硬件方面则主要绘制和仿真原理图。
(3) 在原型阶段中, 硬件设计按照设计、制作和测试进行短周期迭代开发;软件设计则可以基于通用开发平台进行开发, 将原型系统提交给客户使用, 收集客户的反馈意见。
(4) 在产品阶段中, 要实现软硬件的集成, 并完成系统的集成测试、系统测试等工作, 并将系统提交给用户使用, 根据反馈意见和测试结果, 进行多次迭代, 最终获得最后的产品。
(5) 每一个开发阶段, 都由开发人员、测试人员以及客户代表组成相关开发或测试团队。
(6) 每一个开发阶段, 都应将敏捷开发方法的结对编程、面对面交流、短周期迭代、实时反馈、特色会议制度、测试驱动开发等基本原则和方法应用其中。
3嵌入式温室网关软件设计
为了对能够更加详细地介绍敏捷开发与多V模型相结合的软件开发方法, 下面以智能温室系统的嵌入式网关开发为例, 说明该方法的具体应用过程。
3.1需求分析
在精准农业的应用中, 智能温室系统具有重要的作用, 可以对作物的生产提供准确的监测和精细的管理, 具体来说, 应主要实现以下功能。
(1) 对温室内环境进行监测, 包括温湿度、气体浓度、土壤环境、作物生长状况、病虫害发生情况等;
(2) 当温室内环境参数偏离正常值时, 能自动或手动驱动设备进行调节, 以便其恢复到允许范围之内;
(3) 允许操作人员使用终端软件或浏览器, 进行本地或远程地查看温室内实时数据, 以及操作温室内设备。
针对上面列出的功能需求, 进行分解可得到表1所示的分析表。
从表1可以看出, 网关功能分为七个大项, 每个大项又包含多个子项, 且每个子项都有一个根据重要性来划分的优先级, 数值越大优先级越低。对于模型阶段, 根据表1给出的功能需求进行建模和分析。对于原型阶段, 则应当利用通用开发平台实现优先级为1级和2级的功能, 并根据客户需要选择性实现3级部分或全部功能, 如应确定是否需要Web服务器, 以及采用嵌入式Web服务器, 还是采用传统Web服务器等。在产品阶段, 必须将客户使用意见、前阶段测试结果、新增需求等作为需求分析的输入项, 调整表1内容, 最终确定系统需求, 以此作为产品阶段的基础。
3.2系统设计与实现
为了保证嵌入式网关的实时性, 其软件应设计成基于多任务的形式。首先进行数据流分析, 将可并行处理的内容独立成为一个任务, 并确定任务之间的数据交换接口, 得到任务结构图, 然后对每个任务进行详细设计, 最后, 把设计转化为编码实现。
结合用户要求及表1的需求分析, 可以得到图2所示的任务结构图。图中虚线框内的两个任务是可选的任务模块, 由此可以形成两个设计方案, 它们都包括传感器数据采集任务用于采集环境参数, GUI任务处理图形界面操作, 环境调节任务和灌溉任务用于执行环境参数调节功能, 信息处理任务负责信息的收集、处理和转发等功能, 数据存储任务负责实现数据的存取, 无线通信任务负责与传感器节点进行通信。
两个方案不同之处在于方案1中, 采用了嵌入式Web服务器, 因此它有网络服务器任务, 网关可直接接入网络, 提供远程访问服务;而方案2中, 根据客户新的需求, 增加了摄像头任务, 用于对温室进行实时监控, 同时, 方案2采用了传统Web服务器, 使得无线通信任务不仅仅要与传感器节点通信, 还要与计算机进行无线通信。可在原型阶段分别实现这两套方案, 然后提交给客户试用, 根据客户的反馈意见, 最终确定在产品阶段使用哪套方案, 并把试用过程中发现的问题, 在产品阶段的开发中加以解决。
3.3系统测试
嵌入式系统的测试需要采用交叉测试的方法, 首先应考虑在不同开发阶段采用不同的测试环境。原型阶段采用基于宿主机的测试方式;模型阶段应根据测试的硬件需求情况, 选择采用目标机或宿主机环境;产品阶段则主要使用目标机进行测试, 以便获得接近真实使用环境的结果。
对于嵌入式温室网关的测试, 原型阶段主要应采用模拟和仿真的方法, 并由开发团队、客户和相关专家组成评审小组, 进行论证和评审;模型开发阶段和产品阶段, 则要根据所选择的需求情况, 制定测试方案, 实施包含单元测试到验收测试的完整测试, 并收集客户反馈的各种意见, 作为下一版本的需求分析起点。
4结论
将敏捷开发方法与嵌入式多V开发模型相结合, 可以适应嵌入式系统面向应用、需求多变的特点, 发挥多次迭代、持续集成的优点, 形成以嵌入式多V模型为主体, 敏捷开发方法为应用措施的开发方法, 将这个开发方法应用到智能温室的网关开发中, 实际应用证明, 该方法可以应对需求的变化性, 提高软件的可靠性, 节省开发成本。
摘要:敏捷开发方法因其“敏捷”的特点, 通过快速迭代和持续集成等方法, 与嵌入式系统开发的多V模型相结合, 可以很好地满足嵌入式系统面向应用、软硬件协同设计等的需要。本文在研究敏捷开发方法与嵌入式多V开发模型相结合的软件开发方法的基础上, 按照模型设计、原型设计和产品设计三个阶段, 对嵌入式温室网关的软件进行了需求分析、系统设计和系统测试等。
关键词:敏捷开发,嵌入式网关,智能温室多,V模型
参考文献
[1]谢东强.敏捷软件开发的双迭代模型[J].计算机应用与软件, 2012, 29 (06) :176-178, 198.
[2]荣国平, 刘天宇等.嵌入式系统开发中敏捷方法的应用研究综述[J].软件学报, 2014, 25 (02) :267-283
[3]康一梅, 张永革等.嵌入式软件测试[M].北京:机械工业出版社, 2008:48-51.
嵌入式系统通常是一个包含微处理器的特殊计算机系统,是一个较大系统或设备的组成部分,它在很大程度上决定了设备的功能特性。许多具备数字接口的设备如微波设备、录像机(VCR)和汽车等都会用到嵌入式系统。有些嵌入式系统需要使用操作系统,有些则用单个程序实现整个逻辑,但所有嵌入式系统提供的功能都要比通用计算系统更专业些。嵌入式系统功能包括:
1、监视环境-从输入传感器读取数据,然后处理数据并显示结果
2、控制环境-产生并向激励器发送命令。
3、转换信息-转换并处理收集到的数据。虽然通过传感器和激励器完成与外部世界的交互是嵌入式系统的重要特点,但这些嵌入式系统还提供适合它们所在设备的特殊功能。嵌入式系统一般用来执行控制程序、有限状态机和信号处理算法。这些系统还必须检测内部计算环境和周围电磁系统中发生的故障并对此做出响应。嵌入式系统特性:
嵌入式系统的设计挑战是使嵌入式系统的独特性能与设备的特殊约束条件相一致。以下是一些嵌入式系统的重要特性:
1、特殊应用系统-嵌入式系统不同于通用处理器,它针对特殊应用进行了优化。
2、反应性系统-反应性计算的意思是系统(主要是软件部分)根据传感器信息对环境作出响应,并利用激励器控制环境,同时系统速度能与环境速度同步。
3、分布式-嵌入式系统的一般特征是多个通信进程在多个通过通信链路链接的CPU或ASIC上运行。
4、异类性-不同的嵌入式系统一般具有不同的结构,以便在处理严格设计约束的嵌入式系统时能够提供更好的设计便利性。
5、苛刻环境-许多嵌入式系统并不工作在受控的环境中,因此它们必须能够经受过热、振动、冲击、电源波动和其它恶劣的物理环境条件的考验。
6、系统安全性和可靠性-由于嵌入式系统复杂度和运算量的不断增长,需要更多地考虑系统安全因素。
7、小型化、重量轻-为了达到便携目的,许多嵌入式系统的重量必须设计得很轻。
8、成本敏感性-不同的嵌入式系统对成本的敏感性有很大的不同。
实时系统的特性
实时系统要求在外部环境指定的时间间隔内对来自环境的激励信号作出响应(包括物理时间的过渡)。从输入时间到输出时间的延迟必须足够小,以满足可以接受的时间值。通常实时系统需要对环境作出连续及时的响应
计算的正确性不仅依赖于结果,而且取决于输出发生的时间。一个实时系统必须满足有限响应时间约束条件,否则会产生严重的后果。如果后果是性能的劣化而不是故障,那么这种系统可以看作是一个软实时系统。如果后果是系统发生故障,那么这种系统就是一种硬实时系统。
实时系统有反应式和嵌入式两种类型。反应式实时系统会与环境发生连续的互作用,而嵌入式实时系统主要用于控制大型系统中安装的特殊硬件。
嵌入式系统开发生命周期
许多系统设计工程师都会经历硬件/软件协同设计的过程,此过程中硬件与软件将同时进行开发。理解硬件与软件功能相互之间的关系及界限有助于确保设计要求得到完整正确的理解和实现。
早在设计要求的定义与分析阶段,系统开发人员就必须与设计工程师协同分配硬件或/和软件方面的要求。这种分配的依据是早期系统仿真、原型设计和行为建模结果、工程师自己的经验以及上文提及的各种因素权衡结果。一旦分配结束,就可以立即着手具体的设计和实现。实时系统开发中软硬件的并行设计会使用到各种分析技术,包括:
1、硬件与软件仿真;
2、硬件/软件协同仿真;
3、可调度的建模技术,如速率恒定分析;
4、原型设计和渐进式开发。
可以在各种抽象层次使用的仿真技术主要用于开展早期的性能评估。低层仿真可以用来为总线宽度和数据流程建模,这对性能评估是非常有用的。高层仿真可以满足功能的交互,并促成硬件/软件权衡研究及有效性设计。利用仿真可以将一个复杂的系统向下抽象成基础组件和行为。仿真还助于解决功能性问题(数据与算法)、行为(进程排序)或性能问题(资源利用、吞吐量和时序)。
理解设计要求
在作执行任何类型的处理器评估时,首先要详细理解用户的功能和非功能性要求。功能性要求通常比较容易获得,而非功能性要求较难定量测量。但对于实时系统来说,定义响应时间这样的要求是非常重要的。实时要求可以有以下几种:
1、激励-激励(S—S):到系统去的两个激励之间的实时关系;
2、激励-响应(S—R):一个激励与来自系统的一个后序响应之间的实时关系;
3、响应-激励(R—S):一个响应与到系统去的一个后序激励之间的实时关系:
4、响应-响应(R—R):来自系统的两个响应之间的实时关系。
S-R和R-R关系定义了对指定系统的时序要求。这种情况下所实现的功能必须足够快(或足够慢)才能满足时序要求。S-S和R-S约束暗示系统必须能够从环境(可能是一个用户或另外一个系统)中检测出特定时序约束的破坏。这些约束与功能的快慢没有关系,相反它们能够检测出某些遭到破坏的时序约束并采取必要的措施。
因此要从最初系统要求设计时就很好地理解这一点,因为S-R和R-R约束可以引导设计工程师进行代码优化,而S-S和R-S约束需要用额外的软件来检测和响应时序冲突。
处理器选择
嵌入式实时系统比较适合用于系统优化。由于这些系统主要用来解决范围相对较窄的问题,因此硬件和软件能够得到最佳优化,并很好地应用于单一设备。这样做的目的是要在软硬件最佳折衷状态下开展系统设计。影响这一阶段设计的主要因素是处理器的选择、软硬件的分割和总体系统集成。
在为嵌入式实时系统选择处理器时需要考虑以下几个方面:
1、性能:处理器必须有足够的性能执行任务和支持产品生命周期。
2、实现:根据具体应用情况,处理器可能需要被高度集成。在DSP应用中可以有好几种选择,专用集成电路(ASIC)就是其中的一种。这些器件可以被用作BSP协处理器,但对于许多通用信号处理来说显得不够灵活。另外可以选择精简指令集计算机(RISC)处理器。这些处理器的时钟速度特别快,但可扩展性不是很强,而且会发生其它实时(可预测性)问题。现场可编程阵列(FPGA)是一种快速器件,能够快速高效地完成某些DSP功能,但与DSP相比开发难度比较大,因为在DSP中一个简单的程序就能完成相同的功能。如果是主信号处理应用,则最好采用性能强大功耗
也较大的通用处理器。如果需要快速升级信号处理应用,采用DSP等可编程器件比定制的硬件方案要更好些。
3、工具支持:支持软件创建、调试、系统集成、代码调整和优化工具对整体项目成功与否非常关键。
4、操作系统支持:嵌入式系统应用需要使用有帮助的抽象来减少其复杂性。针对处理器系列产品作过优化的商用操作系统(OS)能够缩短设备开发周期和上市时间。
5、过去的经验:拥有处理器或处理器系列产品的开发经验可以减少可观的学习新处理器、工具和技术的时间。
6、仿真支持:循环精确仿真对某些类型的应用来说非常重要,特别是数字信号处理应用中许多功能正确性验证都是采用仿真技术完成的。嵌入式系统的软硬件协同设计模型也促使处理器仿真器成为开发流程中一个非常有用的工具。
7、应用支持:应用支持有多种方式,从通过热线或网站取得的应用专家支持,到预打包的软件和应用框架,甚至完好的测试平台。一些DSP处理器能够提供外围器件的驱动器、板级支持包和其它“启动帮助组件”。有了这些软件组件后,应用开发师就无需再编写器件驱动器等“无附加值”的软件,相反,他们可以把精力放在具有附加值的功能开发上,使他们的产品能独树一帜。
8、成本:嵌入式应用对成本特别敏感,而产品成本的稍许差别都可能导致市场的失败。
9、功耗:市场上有许多依靠电池工作的便携嵌入式实时系统,此时电池寿命将成为系统的重要参数。这种情况下应该考虑使用针对便携式应用优化的低功耗器件。
10、传统代码:如果选中的处理器需要设计人员编写与现存代码的接口,将会导致整个设计流程的严重滞后。因此需要选择一款代码兼容的器件来避免或减少这一步骤造成的影响。
11、算法复杂性:某些处理器能够非常高效地处理某类算法,因此最好选择能够与应用最佳匹配的处理器。例如,具有许多控制代码的有限状态机应用应该映射为类似ARM处理器的RISC器件。编码、解码和回波抵消等信号处理应用应该映射为数字信号处理器,或具有信号处理加速器的某种器件。
12、上市时间:项目的完成时间会加快处理器的选择过程,这一过程与先前讲述的几个关键事项密切相关,如Os的可用性、其它软件组件以及便携性问题。
设计还是购买?
是自己设计还是购买成品呢?如果有可能不重新设计,价格也比较合理的话,购买要比自己开发更有利。由于嵌入式系统预算的缩减、实时操作系统(RTOS)和TCP/IP堆栈等商用技术的改进、嵌入式系统要求的扩展,采用商业性现成(COTS)技术正变得越来越普遍。采用COTS技术能够缩短开发周期中编码、调试、单元测试和代码检查阶段的时间。
然而,作出购买而非设计的决定会改变一个组织的基础开发流程。一个组织希望实现的新业务有:供应商调研和评估、产品评估以及实时的供应商交流与关系建立。产品开发的其它活动不会取消,但会作出一些改变。这些变化包括更关注如何将系统硬件与软件更好地组合在一起,而不再把重点放在模块自己内部的运作上。另外必须更侧重于兼容性、可配置性和可集成性等结构上的问题。
必须很好的理解和高效地管理由于决定采用“购买”而非“设计创建”方式所导致的结果。首先,自然是对供应商提出产品要求、产品可靠性、计划和产品文档等依赖请求。这种情况下产品要求中的灵活性会打些折扣。购买商用产品意味着接受现有的产品要求,但这种要求也许不能完美地匹配自身产品的要求,这就需要设计人员把这种缺点与COTS技术提供的成本与上市时间优势作一个理智的权衡。
因此重要的是最终用户与技术人员必须参与COTS供应商的选择,考虑的重点要放在业务需求上而非技术本身。性价比分析所要考虑的因素应包括易学性、易用性、供应商名声和长期稳定性、许可方式和培训。所有与性能有关的声明必须尽可能采用内部或外部基准或演示来到得有效性认证。为了避免可能出现的偏差,评估标准应该在收到供应商建议前就制定好。选择供应商的主要工作包括研究和理解技术标准和相当的文件、采用类似建议请求(RFP)的标准模式征求供应商的建议、对供应商建议进行评估和排序、选择供应商并签署合同。
除了评估技术外,还应对供应商本身进行评审。要充分了解供应商开业时间的长短、供应商的背景和名声、供应商的其它用户对它的评价和意见、供应商人力资源的投入和对你的计划或项目的支持情况,以及供应商对你业务和要求的理解程度,甚至对未来项目的承诺。以前软件团队认为软件开发方案遵循类似于创建架构的特定模式。提供符合一般模式的抽象方法能够使软件团队定制符合他们特殊要求的方案,同时遵循被前人证明是高效和正确的模式。
嵌入式系统供应商已经认识到需要通过提供软件组件和类似于设计模式的框架来加快软件开发进程。在DSP领域,供应商向DSP设计工程师提供包括参考框架(RF)在内的上百个以DSP为核心的软件组件用于产品和系统开发。设计完好的参考框架能够在设备开发的早期阶段让设计人员快速入门。RF内含方便易用并且适合多种应用的源代码。由此可以取消许多早期的低层设计决策,使开发人员能有更多的时间用在真正显示产品特色的代码开发上。设计人员可以选择能够最大程度满足他们系统需要的专业RF,然后集成适配的算法(可以是其它供应商出售的DSP COTS算法,或供应商自己的算法)生成适合各种终端设备的特殊应用,如宽带、语音、视频图像、生物测量和无线设施。这些RF提供百分之百的c语言源码,并且没有版税要求。
软件性能工程
许多嵌入式实时系统必须满足一系列性能目标。一般来讲,性能是一个软件系统或组件对时间要求满足程度的一种指示。这里的时间指标可以用响应时间和吞吐量来衡量,该时间值是指响应某种要求所需的时间,而吞吐量用以指示系统在特定时间间隔内能够处理的请求数量。可扩展性是嵌入式实时系统的另外一个重要指标,可以用它来衡量系统要求提高时系统能够继续满足响应时间或吞吐量要求的能力。如果在整个开发生命周期内得不到正确的性能管理,那么即使选择了正确的处理器和软件也是徒劳的。性能故障的后果是非常严重的,它可能损伤与客户的关系,造成收入下降,甚至导致整个项目失败。因此在整个生命周期内需要随时关注性能问题。性能管理可以被动或主动完成。被动方式需要采用一个较大的处理器解决性能问题,它只在系统完成构架、设计和实现后处理性能问题,在解决问题前一直处于等待状态,直到实际需要测量的事件发生。主动方式是指整个生命周期内一直在跟踪和交流性能问题,同时开发用以识别性能劣化的进程,并在性能处理中培养团队成员。
小结
【嵌入式开发学习心得】推荐阅读:
嵌入式系统开发试题07-19
嵌入式毕业论文:嵌入式系统的应用06-19
嵌入式培训总结06-17
实习总结嵌入式11-11
嵌入式应用实践总结12-17
嵌入式系统试题库09-20
构建嵌入式linux系统10-25
嵌入式笔试题及答案11-22
嵌入式系统学习心得07-11
嵌入式软件工程师年薪10-16