博客首页
注册
建议与交流
排行榜
加入友情链接
推荐
投诉
搜索:
帮助
embaka
雪地狂叟
embaka.cublog.cn
管理博客
发表文章
留言
收藏夹
博客圈
音乐
相册
文章
首页
关于作者
名与身孰亲?身与货孰多?得与亡孰病?甚爱必大费,多藏必厚亡。故知足不辱,知止不殆,可以长久。
||
<<
>>
||
我的分类
最新文章
·
无聊的星期天
·
如何成为一个优秀的程序员
·
关于嵌入式系统--献给热..
·
开源软件与自由软件
·
Richard Stallman清华演讲
·
UART串口中断学习
·
ARM7异常处理学习
·
免责说明
·
74芯片特性分类总汇
·
醉语清风
最新留言
最新评论
·
呵呵,我是13期的,今儿做..
最新收藏
统计信息
·
总访问量:2884
·
文章个数:14
·
评论条数:1
·
留言条数:0
·
网友推荐:
【置顶】免责说明
<DIV> <DIV id=art style="MARGIN: 15px" width="100%"> <DIV><FONT face="Courier New" size=3> <DIV><FONT size=3> E-mail: <A href="mailto:liu_wenbin@126.com">liu_wenbin@126.com</A></FONT></DIV> <DIV><FONT size=3> QQ: 120441853</FONT></DIV></FONT></DIV> <DIV><FONT face="Courier New" size=3> 关于博客中转载的文章,均是出于学习以及资料收集的目的,且凡属转载文章均已标明链接出处(不保证是原始出处)。博客中资料请谨慎使用,如有疑义或异义,欢迎指出,有探讨才会有进步,但如因照搬或参考文章而致使软件或硬件出现异常,请恕在下不对任何精神损失或经济损失负责,如果涉及法律责任,更请您高抬贵手!见谅见谅。<BR> 如果您是某文章的原作者,并且不希望自己的文章在此处被转载,请及时与本人取得联系,我会在第一时间予以删除。</FONT></DIV> <DIV> <DIV><FONT size=3></FONT></DIV><FONT face=黑体 size=3></FONT><BR></DIV></DIV></DIV> <DIV></DIV> <DIV></DIV> <DIV></DIV> <DIV></DIV> <DIV></DIV>
查看全文
发表于:2008-05-19 ┆
阅读(79)
┆
评论(0)
无聊的星期天
<DIV>无聊的星期天,昨天老婆出差顺便回家待两天,所以这个星期天只有我一个人过了,昨天加班,晚上很累,但是还是熬到了很晚才睡,早上果然起来的很晚,到姜秋野家已经十一点半了,加上蒋奇锋,三个人很久没有在一起吃饭了,记得以前住单身公寓的时候,几乎天天下了班都在一起吃饭,再回首都已成往事,今天三人决定吃饺子。半年前还在一个公司,现在三人已经分别在三个公司了,他俩虽然都还在一汽,但是现在也是在不同的子公司,谈起从前,都很感慨,谈着从前就会想着现在和未来,回家的路上,我心情又开始沉重了,现在我的境况很糟,在北京培训嵌入式五个月后,我选择回长春,现在刚刚进入嵌入式行业,处于起步阶段,什么我都可以忍,但是想想以后,不禁有些担心,不知道在长春,机会有多少,提升的空间会有多大,甚至到底会不会有机会和提升的空间。心情很乱,好想老婆,很想去北京。</DIV> <DIV></DIV>
查看全文
发表于:2008-08-31 ┆
阅读(62)
┆
评论(0)
如何成为一个优秀的程序员
<DIV><STRONG><FONT size=5>如何成为一个优秀的程序员</FONT></STRONG></DIV> <DIV><STRONG><FONT size=3></FONT></STRONG> </DIV> <DIV><STRONG><FONT size=3>出自:</FONT><A href="http://www.akaedu.org/pages/news_detail.php?id=294"><FONT size=3>http://www.akaedu.org/pages/news_detail.php?id=294</FONT></A></STRONG></DIV> <DIV><STRONG></STRONG> </DIV> <DIV><FONT size=3>我们的老师每天都要应对报名者和学员提出的很多同样的问题,以下是这类典型问题的汇总:嵌入式行业(或者IT业)有没有前途?我听说编程编到三十五岁就没人要了,一定要转行找出路是吗?做驱动开发和做应用开发哪个更有前途?我一开始看什么书都看不懂,怎么才能理出一个学习顺序?诸如此类。这使我迫切地感觉到,应该总结这样一份非具体技术问题的FAQ了。本文仅代表我个人观点,有问题欢迎Email: </FONT><A href="mailto:songjinshan@akaedu.org"><FONT color=#0000ff size=3>songjinshan@akaedu.org</FONT></A><FONT size=3>。 </FONT> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 在看这份FAQ之前,你必须先读完ESR的《如何成为一名黑客》(本文末尾附有中译版),该文所讲过的道理我不再重复。该文用很大的篇幅讲什么是黑客文化,虽然态度和信仰的确是成功的最关键因素,但是你肯定会想,做不做黑客跟我没关系,我只是想学个一技之长,找个好工作而已,对吧?那么肯定更希望获得一些具体的可操作的指导。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 1、各种软件技术之间是怎样的关系? <BR> 我把软件技术分为三个层次:<BR> 问题域:计算机图形学、音视频编码、信息安全、模式识别、信息检索、自然语言分析、人工智能、科学计算等;<BR> 系统集成:C++和Java等面向对象语言、Python等解释型语言、LISP等函数式编程语言、GUI、中间件、编译器与解释器、虚拟机、数据库、网络服务、并行计算、集群、Peer2Peer、系统管理等;<BR><BR> 系统功能:硬件描述语言、计算机体系结构与编程模型、指令集与汇编语言、C语言、内核、文件系统、设备驱动、网络协议、POSIX等。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 计算机最终是做什么用的呢?最终是通过问题域的各种技术为用户解决问题的,这些技术都包含很高深的算法,然而它们必须在一个平台上运行,它们需要利用平台提供的各种基础设施,比如计算能力、I/O能力和网络互联能力。系统功能和系统集成层就是用来实现这个平台的。系统功能层实现计算、I/O和网络的基本功能,系统集成层对这些基本功能做一些抽象和包装,提供更方便灵活的接口。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 2、为什么要学习嵌入式技术? <BR> 在亚嵌的学习期间,你将详细了解系统功能层的各部分是如何工作的,也会在面向对象编程、GUI、数据库、网络服务等系统集成层的技术方向进行探索。嵌入式系统可说是麻雀虽小五脏俱全,虽然没有PC和服务器那么复杂,但计算机系统的各种组成一样也不缺。因此,以嵌入式系统作为切入点开始学习软件技术是非常好的选择,避开不必要的复杂性,把握计算机系统最根本的概念和技术要点。打下扎实的基础之后,你的职业发展则完全不必局限于嵌入式领域,即使你日后做PC或服务器开发,在亚嵌所学的知识和技能同样使你终生受益。正如庖丁解牛,心中有全牛,自然就能游刃有余。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 另一方面,你一定见到各大网站都有大量的宣传,说现在嵌入式行业前景空前的好,嵌入式人才紧缺,有几百万职位空缺等等。这些说法也是对的,但我们需要更深入地理解这说明了什么问题。刚才我们说,嵌入式系统也是一个完整的计算机系统,和PC或服务器没有本质的区别,事实上,嵌入式、PC和服务器的界限已经越来越模糊了。以前的嵌入式就是单片机,只能做简单的运算处理,现在的ARM处理器性能比从前的奔腾还强,打游戏、看电影都没问题,谁能说它不是PC呢?另外有些专用的嵌入式系统已经在充当服务器的功能了,而集群技术更是可以使许多廉价的处理器组合在一起发挥大型服务器的作用。由于嵌入式越来越多地应用到电器、汽车和各种设施上,无处不在,并且与PC、服务器呈融合的趋势,所以嵌入式行业前景空前的好。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 那么,为什么说嵌入式人才紧缺呢?其实,学嵌入式系统就是学计算机系统,本质上并没有什么特殊的只有嵌入式系统才有的技术。说嵌入式人才紧缺,其实质上是说真正懂计算机的人才紧缺。现在很多学校的所谓“软件学院”培养的软件人才都是一叶障目不见泰山的:只懂J2EE和.NET,没学过C和汇编;只会调库函数sort(),而对各种排序算法一无所知;设计模式、软件工程讲得头头是道,却不知道好的软件还是要靠牛人靠智商来做的。培养人像蒸包子一样一屉一屉地出,靠软件工程搭一条生产线,然后让熟练工人站在生产线上拧螺丝,幻想着这样就能生产出好的软件,那是把软件工程和程序员的作用本末倒置了。现在嵌入式开发对程序员的素质要求更高了,以上这类“软件人才”不能胜任了,因此说嵌入式人才紧缺。亚嵌的就业班虽然只有几个月,但培养目标是有完整的计算机系统概念的软件人才,而不是只会拧螺丝的软件工人,这正得益于我们始终坚持做嵌入式培训而不是Java或.NET培训。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 3、有人说软件技术变化太快,现在学的东西过两年就要完全淘汰,是吗? <BR> 你知道这话是什么人说的吗?必然是已经被淘汰的人说的。比如Delphi、BCB、PB这些开发工具和语言,都曾经很是风光了一阵,但现在已经完全被Java和.NET取代了。那么Java和.NET会不会被取代呢,也许在相当长的时间内还不会,但是我看好Python。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 这些被淘汰的程序员有一些共同的特点:只会用鼠标拖拽控件,离开IDE就不知道如何工作,学点儿花拳绣腿的功夫就想吃一辈子,对学习新技术不感兴趣,做一天和尚撞一天钟。现在请回头看看FAQ1,在整个软件技术领域,这些变化快的技术其实只占了很小的一块,却成了这些人的全部看家本领,这样的人能不被淘汰吗?</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 与这些流行的开发工具和语言相反,很多技术和思想是很少变化的。比如,POSIX和SUS标准规定了一套系统函数接口和基本命令的语义,只有实现了这些才可以称作UNIX,因此今天的Linux、Solaris跟20多年前的UNIX在系统功能层上是基本一致的。而指导计算机科学发展的数学理论,甚至是老祖宗们在计算机还没诞生的年代就替我们想好的:布尔代数发表于19世纪,直到一个世纪后发明了计算机和数字电路才有了用武之地;数论在17世纪就出现了,一直都被数学家们当成一套好玩的理论,但只是好玩而已,直到计算机密码学诞生后才发现它的实际用处。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 各种流行的开发工具和高级语言虽然变化很快,但是底层的编程语言却非常稳定,各种操作系统的内核都是用C语言写的,以前是这样,以后也不会改变。另一方面,各种编程语言的设计思想也是非常稳定的。其实世界上只有两种编程语言,一种是C,一种是LISP,前者是imperative的,是对计算机模型的抽象,后者是functional的,是对数学函数模型的抽象。面向对象是一种重要的软件工程思想,却算不上一种新的语言模型,应该归在C的一类。属于同一类的各种语言其实都大同小异,一个精通C++的人学习Java需要多长时间?熟悉语法一个星期,熟悉类库三个星期,一个月足矣,以往的经验都可以套到新的编程语言上。然而要想习得深厚的算法功底、逻辑思维和抽象思维修养,能够真正说清楚“系统”是什么,如何分析和设计“系统”,需要多长时间?恐怕要数十年。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 4、C和Java哪种语言更好? <BR> 计算机科学与编程语言无关,甚至与计算机本身也没太大关系,它研究的对象并不是计算机,而是人分析问题解决问题的方法论。程序写出来最主要不是为了给计算机执行的,而是为了给人看的,使用编程语言和使用自然语言一样是为了表达和交流,只不过程序还可以顺便给计算机执行而已。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 以上这些话并不是我说的,而是一位著名的计算机科学家说的。所以,在编程语言的层面上争论是没有意义的。很多初学者错误地认为掌握了编程语言就等于学会了计算机,一种编程语言都还没有掌握好,更没有上升到方法论的层面,只有这种无知的人才会去争论哪种语言好的问题。掌握了编程语言远远不等于学会了计算机,而只是最开始的一步,最简单的一步,到了工作中,用到什么语言就去学什么语言,什么语言过时了就丢掉,编程语言不需要积累因为它太简单了,真正需要积累的是方法论。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 很多人喜欢参与到这类争论之中,毫无例外,每个人都在为自己熟练掌握的编程语言辩护,就是“我会的语言最好,我不会的语言都不好”,其实这些人真正想说的是“我会的语言最好是千秋万代,我就不必学新的语言,不必适应新的变化了”,概括起来说就是一个字,懒。真正的高手都是会很多编程语言的,国外有些做技术咨询的,每年都要学好几门新的编程语言,这样才能应对市场的变化。不断丢掉旧的编程语言学习新的,看起来好像完全是白费力气,没有积累,其实,每种编程语言的设计都有独到之处,体现了每种语言的精髓,在融汇百家之后积累下来的正是方法论。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 争论哪种语言能做的事情更多、功能更强是没有意义的。从理论上说,任何一种符合图灵机模型的编程语言,加上适当的I/O扩展都可以做任何事情,用shell脚本也可以写出很像样的游戏来。只不过各种语言的设计目标不同,表达能力不同,做不同的事情所需的代码量不同而已。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 另外一种错误认识是:哪种语言的市场最大,开发人员最多,哪种语言就最好。单从这种意义上说,Java的确比C更好,所以往届有学员问我们为什么只教C语言。请你注意,操作系统内核是用C写的,各种底层的应用程序包括Java虚拟机也是用C写的。如果你想学Java,在亚嵌的学习完成后你将有能力分析Java虚拟机的实现,站在计算机系统的高度来学Java才会使你成为真正的Java高手。如果你只想速成,想早点学成一门技术去做拧螺丝的工作,那么亚嵌不适合你。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 在FAQ3里说过,世界上有C和LISP两种编程语言,你现在学了C,以后学了C++、Java、.NET等等,也仍然只认识了半个世界。LISP和Haskell构成了另外半个世界,现在很常见的Python和JavaScript等解释型语言也借用了functional programming的思想。如果你只管闷着头写代码,而不去广泛涉猎,那么你将错过很多精彩。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 5、我听说编程编到三十五岁就没人要了一定要转行找出路是吗? <BR> 这个观点虽然很流行,但根本不值一驳。现在三十五岁转行的那些人,都具有前面所说的那些特征,对学习新技术不感兴趣,对探索计算机的本质不感兴趣,得过且过,下了班就是打游戏、看电视,总之就是懒。如果是开出租、摆摊,勤快人懒人都有饭吃,而IT这一行对懒人是非常无情的,懒人就不该入IT这一行,不从自身找原因,却到处散布这种言论,怪社会不好,打击新人的信心,着实可恨。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 另外一种情况,编程编到三十五岁,进入公司的管理层,或者自己创业,这都是很勤快的人,如果他们把这种勤快用在技术上肯定也可以做得更好,所以也无法证明编程编到三十五岁会因为没有出路而转行。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 编程不是个体力活,需要高强度的思考和智力投入,分析能力、思考能力都需要时间积累起来,所以并不是越年轻干得越好。相反,我认为三十岁以前写的代码都是垃圾,三十岁以后才能写出像样的程序来。如果希望一辈子走技术的道路而不会被迫转行,就要不断地把自己的工作性质从“体力活”变成“脑力活”。什么叫“不断地”变呢?这里的“体力活”并不是指种地、盖房子这种劳动,而是指简单重复地编写代码,这时你会感觉,派给你的工作都能凭以往的经验轻松应付了,但是千万不要满足于现状,就像温水煮青蛙一样,这是危险的处境!要摆脱这种处境就需要学习、思考、提高,让公司派给你更有挑战性的工作,在工作中应用新学到的知识和技术就是“脑力活”了,但是用得久了又会变成简单重复的“体力活”,这时就需要再学习、再提高,所以叫做“不断地”把自己的工作性质从“体力活”变成“脑力活”。如果有一天你发现,自己长期陷于简单重复的劳动之中,并且业余时间非常少,无法学习提高,这说明公司不会用人,你就该考虑跳糟了。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 从另外一个角度来说,如果希望一辈子走技术的道路,就要有自己的核心竞争力,这个核心竞争力决不是凭以往的经验能够做某些工作的能力,而是学习能力、思考能力和解决有挑战性的新问题的潜力。在IT这一行,凭借以往的经验干重复的活是干不长久的,原因很简单,一个问题不会被解决两次,当你发现你的经验能够解决一类问题时,别人早把解决这一类问题的套路编写成framework,新上手的人即使不具备你的这些经验也可以调用framework中的类和函数来解决问题,然后在这个framework的基础上积累新的经验解决新的问题。正因为如此,全世界开发人员的经验才会积累起来,促使软件技术发展得如此迅速。这并不是说经验完全没有用,最关键的,学习和思考也是建立在以往经验的基础之上的。另一方面,现有的framework并不一定是某方面开发经验的完美整合,也需要不断发展,用新的办法重新解决老问题,以Web开发为例,从早期的ASP、PHP到后来的.NET、J2EE,到现在的Ruby on Rails、Django等等,这些framework解决的是同一问题,就是如何快速有效地开发Web应用,这方面的经验被不断重新整合,推陈出新。总结一下,什么才是核心竞争力呢?应该是在经验的基础上学习新技术、解决新问题的能力。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 6、做驱动开发还是做应用开发更有前途? <BR> 意思就是说,“你告诉我哪个更有前途,我就好好学哪个,另外一个就不用学了”。问这种问题的学员往往会同时问另外一些问题:我以后就想做驱动开发,你教我这些应用开发的技术有什么用?C++用得多吗?学了有什么用?我以后不想做GUI,你教我Qt有什么用?</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 学习最忌讳的就是“有用的就学,没有用的就不学”这种功利的态度。两个问题:第一,在你还没学进去、还不了解这种技术时,要如何判断这种技术学了有没有用?只能是根据道听途说,看各种论坛上都怎么说的,岂不知论坛上参与这种讨论的100%都是菜鸟,有的水平还不如你。第二,就算你学的技术没有用上,有什么损失吗?从亚嵌毕业的学员从事各种各样的开发工作,有做驱动的,有做系统编程的,有做GUI的,有做Web开发的,只要确定了做一类工作,就不可能把在亚嵌四个月学的知识都用上,但至少也用得上3/4的知识,假设剩下的1/4你一辈子也没机会用上了,那也就损失你一个月的学习时间而已,相比于你的收获,这算是很大的损失吗?请注意,上面的假设是不成立的,没用上的那1/4也只是暂时没用上而已,程序员要换工作或者换项目是很常见的,任何人都不可能只涉及一类开发工作,只要有扎实的基础、完备的知识体系,任何工作都能轻松上手。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 扎实的基础,完备的知识体系,我们在安排就业班课程体系的时候,正是以这两点为依据的。有的课程内容很少有学员在以后工作中会用到,但是缺了这一环就不成为一个完备的知识体系,例如MMU和Cache,那这种课该不该上呢?毫无疑问该上。有的课程培养一种基本的编程思想,例如通过C++来讲面向对象编程,通过Qt来讲面向对象、事件驱动和状态机编程,这些编程思想是程序员必备的基本素质,而C++和Qt可能有些学员以后工作用不到,那这种课该不该上呢?毫无疑问该上。至于还有些人争论说C++不如Java用得多,Qt不如GTK用得多,请翻回去看FAQ4,这种争论是无意义的,有工夫争论谁优谁劣,不如把两种都学了,会更有收获。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 回到做驱动开发还是做应用开发更有前途的问题。我只能说,做好了都有前途,做不好都没有前途,只会做一样而完全不懂另一样是最没前途的。不要以为内核开发者就不写应用程序,Linus写了一个源代码管理系统git来维护内核,因为觉得现有的源代码管理系统都不好用。牛人都是这样,需要什么就写什么,才不管是kernel space还是user space。同样,做应用开发如果不懂内核,也没有办法很好地利用内核提供的服务写出性能最优的程序。做内核难,因为调试难,要跟踪大量的并发线程,因为入门难,要写一个hello world都需要学很多知识。做应用也难,回头去看FAQ1,计算机科学从理论到实践大部分都在上面两层做文章。所以不存在哪个更难哪个更有前途的问题,任何关于哪个更难的讨论都是too naive的。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 7、我一开始看什么书都看不懂,怎么才能理出一个学习顺序? <BR> 以前有个学员在学C语言时说,“C语言很多地方都很奇怪,都得用内核的知识去解释,可是你又不先教我内核,我没法学C语言。我只好自己看操作系统的书,看内核代码,可是看不懂。”当然看不懂了,内核代码都是用C写的,如果不学内核就没法学C语言,那不学C语言又怎么可能看懂内核?看来这是一个鸡生蛋还是蛋生鸡的问题。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 懒真的是人的本性,就连学习的过程都希望是一条路顺利地走下去,不用动脑就能学会的:身后走过的路都是“已知”,每走一步就把眼前新的“未知”变成“已知”,如此一路走来,把所有的“未知”都变成“已知”就算学成了。可惜,知识不是一条路,而是一个圈,你从任何一个地方跳进这个圈开始走,身后都是“未知”,眼前也都是“未知”。有的人就是不能容忍自己的身后是“未知”:看一本书,一个新的概念A是用我不了解的概念B、C来解释的,我连B、C都不懂怎么学A?没法学了!</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 不是人家书写得不好,而是没有任何办法能把一个圈扯成一条直线的。学习的过程本质上就是一个循环往复的过程,唯一的办法就是“存疑”:在本子上记着,有B、C这样两个概念是我暂时不理解的,然后就不再去想这回事,而是相信自己已经理解了B、C,基于自己的理解和假设去学习A,由A再去理解X、Y,这样学下去,走完一圈之后再回来,自然就明白当初对B、C的假设正确不正确了,理解了这两个概念,就从本子上划掉,这时需要再走一圈,把原来的一些错误认识纠正过来。所以,任何书都要至少看两遍,第二遍看的时候你会对很多概念有新的认识,因为你看过这个概念后面的章节,在此基础上产生了新的认识。古人早就明白这个道理,所以提出了“温故而知新”。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 亚嵌的课程体系经过多年教学实践的锤炼,已经很好地理顺了知识之间的关系,使你从最佳的位置跳进这个圈开始学习,所谓“最佳位置”是指,在你初学的时候需要容忍的“未知”尽可能少,需要做的假设尽可能少,但要想消除所有的“未知”是不可能的,例如没有学内核就要学C语言。根据你以往的经验和一些运气因素,你对内核的一些假设可能正确也可能错误,但这并不影响你学C语言,对内核的一些错误假设可能会导致在学C语言的过程中有些误解,但没关系,只要跟着我们的课程体系一步一步走下来,这些误解和错误的假设最终都会纠正过来。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 8、有哪些好书可以推荐一下吗? <BR> 能问出这个问题的都是聪明的学员。看书学习是入门过程中非常重要的一环,如果用一本烂书入门,浪费时间还是小事,如果被误导了就麻烦了,如果形成的错误认识不能及时纠正,变得根深蒂固了就更麻烦了。所以,看书一定要有“品牌意识”,在决定看书学习一门技术时先问问这一领域最权威的书是哪本,这里列举一些Bible级别的书:<BR> The C Programming Language, 2nd Edition; <BR> C++ Primer, 4th Edition; <BR> Structure and Interpretation of Computer Programs, 2nd Edition; <BR> Introduction to Algorithms, 2nd Edition; <BR> Compilers: Principles, Techniques, and Tools; <BR> Advanced Programming in the UNIX Environment, 2nd Edition; <BR> TCP/IP Illustrated, Volume 1: The Protocols; <BR> UNIX Network Programming Volume 1, 3rd Edition: The Sockets Networking API; <BR> Understanding the Linux Kernel, 3rd Edition; <BR> Linux Device Drivers, 3rd Edition。</FONT></P> <P><FONT size=3> 在学习过程中,眼界一定要开阔,不要学到一点东西就沾沾自喜,坐井观天,以为这就是技术的全部。要多和别人交流,多了解别人在看什么书、别人对技术的认识是怎样的。书是看不完的,活到老学到老,对于程序员来说尤其如此。</FONT></P> <P style="LINE-HEIGHT: 20pt"><FONT size=3> 9、如何处理打游戏和学习的关系? <BR> ESR的文章中也说过,黑客们都有一些特别的业余爱好,并且往往是非理性思维的爱好,大概是需要换换脑子吧。典型的例子是因滑翔机事故去世的Stevens,他写了FAQ8所推荐的Bible当中的三本。爱打游戏的优秀程序员肯定大有人在,有一些还成了优秀的游戏开发人员。但是我认为,要想成为优秀的程序员,必须有两点基本素质,一是对编程非常感兴趣,二是对所有别的事情都不感兴趣,或者都不如对编程感兴趣。有人说,人的一天有24小时,8小时休息,8小时上班,另外的8小时在干什么就决定了你以后有多大发展。一有时间就看书学习,这就是一个程序员应该做的。今天打游戏,明天看电影,后天炒股,那么你就等着三十五岁下岗。如果你不能够认同编程和思考是比其它事情更有吸引力的,那么你不必学编程,集中精力去做最喜欢的事情或许会有更大的成就。</FONT></P></DIV> <DIV><FONT size=3></FONT></DIV>
查看全文
发表于:2008-06-12 ┆
阅读(58)
┆
评论(0)
关于嵌入式系统--献给热爱此道的初学者们
<DIV> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" align=center><B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B> </P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" align=center><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">关于嵌入式系统--献给热爱此道的初学者们</SPAN></B></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: center; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" align=left><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"></SPAN></B><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">文章出自:<A href="http://article.ednchina.com/Other/20080426093429.htm">http://article.ednchina.com/Other/20080426093429.htm</A><o:p></o:p></SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 前言</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> </SPAN><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">一、嵌入式系统的概念</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 着重理解“嵌入”的概念<SPAN lang=EN-US> <o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 主要从三个方面上来理解。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>1</SPAN>、从硬件上,将基于<SPAN lang=EN-US>CPU</SPAN>的处围器件,整合到<SPAN lang=EN-US>CPU</SPAN>芯片内部,比如早期基于<SPAN lang=EN-US>X86</SPAN>体系结构下的计算机,<SPAN lang=EN-US>CPU</SPAN>只是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部的<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="16" UnitName="C"><SPAN lang=EN-US>16C</SPAN></st1:chmetcnv><SPAN lang=EN-US>550/2</SPAN>的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到<SPAN lang=EN-US>CPU</SPAN>内部,还有<SPAN lang=EN-US>PC</SPAN>机有显卡,而多数嵌入式处理器都带有<SPAN lang=EN-US>LCD</SPAN>控制器,但其种意义上就相当于显卡。比较高端的<SPAN lang=EN-US>ARM</SPAN>类<SPAN lang=EN-US>Intel Xscale</SPAN>架构下的<SPAN lang=EN-US>IXP</SPAN>网络处理器<SPAN lang=EN-US>CPU</SPAN>内部集成<SPAN lang=EN-US>PCI</SPAN>控制器(可配成支持<SPAN lang=EN-US>4</SPAN>个<SPAN lang=EN-US>PCI</SPAN>从设备或配成自身为<SPAN lang=EN-US>CPI</SPAN>从设备);还集成<SPAN lang=EN-US>3</SPAN>个<SPAN lang=EN-US>NPE</SPAN>网络处理器引擎,其中两个对应于两个<SPAN lang=EN-US>MAC</SPAN>地址,可用于网关交换用,而另外一个<SPAN lang=EN-US>NPE</SPAN>网络处理器引擎支持<SPAN lang=EN-US>DSL</SPAN>,只要外面再加个<SPAN lang=EN-US>PHY</SPAN>芯片即可以实现<SPAN lang=EN-US>DSL</SPAN>上网功能。<SPAN lang=EN-US>IXP</SPAN>系列最高主频可以达到<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1.8" UnitName="g"><SPAN lang=EN-US>1.8G</SPAN></st1:chmetcnv>,支持<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="g"><SPAN lang=EN-US>2G</SPAN></st1:chmetcnv>内存,<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="g"><SPAN lang=EN-US>1G</SPAN></st1:chmetcnv>×<SPAN lang=EN-US>10</SPAN>或<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="10" UnitName="g"><SPAN lang=EN-US>10G</SPAN></st1:chmetcnv>×<SPAN lang=EN-US>1</SPAN>的以太网口或<SPAN lang=EN-US>Febre channel</SPAN>的光通道。<SPAN lang=EN-US>IXP</SPAN>系列应该是目标基于<SPAN lang=EN-US>ARM</SPAN>体系统结构下由<SPAN lang=EN-US>intel</SPAN>进行整合后成<SPAN lang=EN-US>Xscale</SPAN>内核的最高的处理器了。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>2</SPAN>、从软件上前,就是在定制操作系统内核里将应用一并选入,编译后将内核下载到<SPAN lang=EN-US>ROM</SPAN>中。而在定制操作系统内核时所选择的应用程序组件就是完成了软件的“嵌入”,比如<SPAN lang=EN-US>WinCE</SPAN>在内核定制时,会有相应选择,其中就是<SPAN lang=EN-US>Wordpad,PDF,MediaPlay</SPAN>等等选择,如果我们选择了,在<SPAN lang=EN-US>CE</SPAN>启动后,就可以在界面中找到这些东西,如果是以前<SPAN lang=EN-US>PC</SPAN>上将的<SPAN lang=EN-US>windows</SPAN>操作系统,多半的东西都需要我们得新再装。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>3</SPAN>、把软件内核或应用文件系统等东西烧到嵌入式系统硬件平台中的<SPAN lang=EN-US>ROM</SPAN>中就实现了一个真正的“嵌入”。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 以上的定义是我在<SPAN lang=EN-US>6</SPAN>、<SPAN lang=EN-US>7</SPAN>年前给嵌入式系统下自话侧重于理解型的定义,书上的定义也有很多,但在这个领域范围内,谁都不敢说自己的定义是十分确切的,包括那些专家学者们,历为毕竟嵌入式系统是计算机范畴下的一门综合性学科<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> </SPAN><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">二、嵌入式系统的分层与专业的分类。</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。<SPAN lang=EN-US> <o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>1</SPAN>、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用<SPAN lang=EN-US>C</SPAN>和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成<SPAN lang=EN-US>CPLD</SPAN>的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、<SPAN lang=EN-US>C</SPAN>语言。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>2</SPAN>、驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同<SPAN lang=EN-US>windows</SPAN>下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>3</SPAN>、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,<SPAN lang=EN-US>XP</SPAN>操作系统是微软投入<SPAN lang=EN-US>300</SPAN>人用两年时间才搞定的,总时工时是<SPAN lang=EN-US>600</SPAN>人年,中科院软件所自己的女娲<SPAN lang=EN-US>Hopen</SPAN>操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>4</SPAN>、应用层,相对来讲较为容易的,如果会在<SPAN lang=EN-US>windows</SPAN>下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及<SPAN lang=EN-US>Jave</SPAN>方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于<SPAN lang=EN-US>SIP</SPAN>、<SPAN lang=EN-US>H.323</SPAN>、<SPAN lang=EN-US>Astrisk</SPAN>)方面又较为复杂,并且有难度了。<SPAN lang=EN-US> <o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">三、目标与定位。</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 先有目标,再去定位。<SPAN lang=EN-US> <o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 学<SPAN lang=EN-US><A title=ARM href="http://article.ednchina.com/word/131530.aspx"><SPAN style="mso-bidi-font-size: 12.0pt"><FONT color=#0000ff>ARM</FONT></SPAN></A></SPAN>,从硬件上讲,一方面就是学习接口电路设计,另一方面就是学习汇编和<SPAN lang=EN-US>C</SPAN>语言的板级编程。如果从软件上讲,就是要学习基于<SPAN lang=EN-US>ARM</SPAN>处理器的操作系统层面的驱动、移植了。这些对于初学都来说必须明确,要么从硬件着手开始学,要么从操作系统的熟悉到应用开始学,但不管学什么,只要不是纯的操作系统级以上基于<SPAN lang=EN-US>API</SPAN>的应用层的编程,硬件的寄存器类的东西还是要能看懂的,基于板级的汇编和<SPAN lang=EN-US>C</SPAN>编程还是要会的。因此针对于</SPAN><U><SPAN style="FONT-SIZE: 9.5pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">嵌入式系统</SPAN></U><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">的硬件层和驱动程的人,<SPAN lang=EN-US>ARM</SPAN>的接口电路设计、<SPAN lang=EN-US>ARM</SPAN>的<SPAN lang=EN-US>C</SPAN>语言和汇编语言编程及调试开发环境还是需要掌握的。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 因此对于初学者必然要把握住方向,自己的目标是什么,自己要在那一层面上走。然后再着手学习较好,与<SPAN lang=EN-US>ARM</SPAN>相关的嵌入式系统的较为实际的两个层面硬件层和驱动层,不管学好了那一层都会很有前途的。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 如果想从嵌入式系统的应用层面的走的话,可能与<SPAN lang=EN-US>ARM</SPAN>及其它体系相去较远,要着重研究基嵌入式操作系统的环境应用与相应开发工具链,比如<SPAN lang=EN-US>WinCe</SPAN>操作系统下的<SPAN lang=EN-US>EVC</SPAN>应用开发(与<SPAN lang=EN-US>windows</SPAN>下的<SPAN lang=EN-US>VC</SPAN>相类似),如果想再有突破就往某些音视频类的协议上靠,比如<SPAN lang=EN-US>VOIP</SPAN>领域的基于<SPAN lang=EN-US>SIP</SPAN>或<SPAN lang=EN-US>H.323</SPAN>协议的应用层开发,或是基于嵌入式网络数据库的开发等等。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 对于初学者来讲,要量力而行,不要认为驱动层工资高就把它当成方向了,要结合自身特点,嵌入式系统四个层面上那个层面上来讲都是有高人存在,当然高人也对应的高工资,我是做硬件层的,以前每月工资中个人所得税要被扣上近<SPAN lang=EN-US>3</SPAN>千大元,当然我一方面充当工程师的角色,一方面充当主管及人物的角色,两个职位我一个人干,但上班时间就那些。硬件这方面上可能与我<SPAN lang=EN-US>PK</SPAN>的人很少了,才让我拿到那么多的工资。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> </SPAN><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">四、开发系统选择。</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 很多<SPAN lang=EN-US>ARM</SPAN>初学者都希望有一套自己能用的系统,但他们住住会产生一种错误认识就是认为处理器版本越高、性能越高越好,就象很多人认为<SPAN lang=EN-US>ARM9</SPAN>与<SPAN lang=EN-US>ARM7</SPAN>好,我想对于初学者在此方面以此入门还应该理智,开发系统的选择最终要看自己往嵌入式系统的那个方向上走,是做驱动开发还是应用,还是做嵌入式系统硬件层设计与板级测试。如果想从操作系统层面或应用层面上走,不管是驱动还是应用,那当然处理器性能越高越好了,但这个东西自学,有十分大的困难,不是几个月或半年或是一年二年能搞定的事。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 在某种意义上请,<SPAN lang=EN-US>ARM7</SPAN>与<SPAN lang=EN-US>9</SPAN>的差别就是在某些功能指令集上丰富了些,主频提高一些而已,就比如<SPAN lang=EN-US>286</SPAN>和<SPAN lang=EN-US>386</SPAN>。对于用户来讲可能觉查不到什么,只能是感觉速度有些快而已。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>ARM7</SPAN>比较适合于那些想从硬件层面上走的人,因为<SPAN lang=EN-US>ARM7</SPAN>系列处理器内部带<SPAN lang=EN-US>MMU</SPAN>的很少,而且比较好控制,就比如<SPAN lang=EN-US>S<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3C</st1:chmetcnv>44B0</SPAN>来讲,可以很容易将<SPAN lang=EN-US>Cache</SPAN>关了,而且内部接口寄存器很容易看明白,各种接口对于用硬件程序控制或<SPAN lang=EN-US>AXD</SPAN>单步命令行指令都可以控制起来,基于<SPAN lang=EN-US>51</SPAN>单片机的思想很容易能把他搞懂,就当成个<SPAN lang=EN-US>32</SPAN>位的单片机,从而消除很多<SPAN lang=EN-US>51</SPAN>工程师想转为嵌入式系统硬件<SPAN lang=EN-US>ARM</SPAN>开发工程师的困惑,从而不会被业界某此不是真正懂嵌入式烂公司带到操作系统层面上去,让他们望而失畏,让业界更加缺少这方面的人才。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 而嵌入式系统不管硬件设计还是软件驱动方面都是十分注重接口这部分的,选择平台还要考察一个处理器的外部资源,你接触外部资源越多,越熟悉他们那你以后就业成功的机率就越高,这就是招聘时所说的有无“相关技能”,因为一个人不可能在短短几年内把所有的处理器都接触一遍,而招聘单位所用的处理器就可能是我们完全没有见过的,就拿台湾数十家小公司(市价几千万)的公司生产的<SPAN lang=EN-US>ARM</SPAN>类处理器,也很好用,但这些东西通用性太差,用这些处理器的公司就只能招有相关工作经验的人了,那什么是相关工作经验,在硬件上讲的是外围接口设计,在软件上讲是操作系统方面相关接口驱动及应用开发经验。我从业近十年,<SPAN lang=EN-US>2000</SPAN>年<SPAN lang=EN-US>ARM</SPAN>出现,我一天始做<SPAN lang=EN-US>ARM7,</SPAN>然后直接跑到了<SPAN lang=EN-US>Xscale</SPAN>(这个板本在<SPAN lang=EN-US>ARM10-11</SPAN>之间),一做就是五年,招人面试都不下数百人,在这些方面还是深有体会的。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 我个人认为三星的<SPAN lang=EN-US>S<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3C</st1:chmetcnv>44b0</SPAN>对初学者来说比较合适,为什么这么说哪?因为接口资源比较丰富,技术成熟,资料较多,应该十分适合于初学者,有问题可能很容易找人帮且解决,因为大多数人都很熟悉,就如同<SPAN lang=EN-US>51</SPAN>类的单片机,有<SPAN lang=EN-US>N</SPAN>多位专家级的人物可以给你帮忙,相关问题得以很快解答,所然业界认为这款<SPAN lang=EN-US>ARM</SPAN>都做用得烂了,但对于初学者来,就却是件好事。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 因此开发系统的选择,要看自己的未来从来目标方向、要看开发板接口资源、还要看业界的通用性。<SPAN lang=EN-US> <o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> </SPAN><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">五、如何看待<SPAN lang=EN-US><A title=培训 href="http://article.ednchina.com/word/131531.aspx"><SPAN lang=EN-US><SPAN lang=EN-US><FONT color=#0000ff>培训</FONT></SPAN></SPAN></A></SPAN>。</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 首先说说我自己,我目前从业近十年,与国内<SPAN lang=EN-US><A title=嵌入式系统 href="http://article.ednchina.com/word/131532.aspx"><SPAN lang=EN-US style="mso-bidi-font-size: 12.0pt"><SPAN lang=EN-US><FONT color=#0000ff>嵌入式系统</FONT></SPAN></SPAN></A></SPAN>行业共同起步,一直站在嵌入式系统行业前沿,设计过多款高端嵌入式系统平台产品并为众多公司提供过解决方案,离职前为从事<SPAN lang=EN-US>VOIP</SPAN>的美资公司设计<SPAN lang=EN-US>IP-PBX</SPAN>,历任项目经理、项目主管、技术总监、部门经理,积累众多人脉,并集多年经验所得,考虑到学生就业与公司招人的不相匹配,公司想招人招不到,而学生和刚毕业的工程师想找份工作也不太容易,于此力创知天行科技有限公司,开展嵌入式系统教育培训。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 因一线的科研人员和一线的教师不相接触,导至国内嵌入式人才缺乏,国外高校的技术超前于业界公司,而国内情况是业界公司方面的嵌入式系统技术要远远领先于高校。为架构业界与高校沟通的桥梁,把先进技能带给高校学子,为学生在就业竞争中打造一张王牌,并为业界工程师快速提升实现自我创造机遇,我就这样辞去了外企年薪<SPAN lang=EN-US>20</SPAN>多万的职位,做嵌入式系统方面的培训了。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 对于培训来讲,是花钱来买时间,很多工程师都喜欢自己学,认为培训不值,这也是有可能的,纯为赚钱的培训当然不会太有价值,但对于实力型的培训他们可能就亏大了,有这样一笔帐不知他们算过没有,如果一个一周的培训,能带给他们自学两年后才能掌握的知识,在培训完后他们用三个月到半年时间消化培训内容,这样他会省约至少一年半的时间来学其它的或重新站在另一个高度上工作,那么他将最迟一年后会拿到他两年后水平所对应的工资,就是在工资与水平对应的关系上比同批人缩短一年,每月按最少<SPAN lang=EN-US>1</SPAN>千计,再减去培训费用至少多<SPAN lang=EN-US>1.0</SPAN>万,同时也省了一年时间,不管是休闲也好,再继续提高也好,总之是跑到了队伍的前面了。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 另一层面上讲,对于新人的培训相当于他们为自己提前买了份失业保险,有师傅会带领他们入道,我今年暑假时班里最年轻的一个学生是大二的,今年才上大三,这学期才刚学单片机,但现在<SPAN lang=EN-US><A title=ARM href="http://article.ednchina.com/word/131530.aspx"><SPAN style="mso-bidi-font-size: 12.0pt"><FONT color=#0000ff>ARM</FONT></SPAN></A></SPAN>方面的编程工作已经搞得有声有色了,再过一年多毕业,他还会失业吗?<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 再者通过培训,你可以知道很多业界不为常人所知的事,同时也为自己找了个师傅,就比如说,两个工程师分别用<SPAN lang=EN-US>S<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3C</st1:chmetcnv>2410</SPAN>和<SPAN lang=EN-US>PXA255</SPAN>来做手持设备,同样两人都工作四年,再出去找工作,两人工资可能最多可相差一倍,为什么?这就是业界不为常人所知的规则,<SPAN lang=EN-US>2410</SPAN>属于民品,被业界用烂了,做产品时成本特敏感,当然也对人才成本敏感了,<SPAN lang=EN-US>PXA255</SPAN>是<SPAN lang=EN-US>intel</SPAN>的东西,一个<SPAN lang=EN-US>255 CPU</SPAN>能买三个<SPAN lang=EN-US>2410</SPAN>,一直被业界定义为贵族产品,用的公司都是大公司或为军方服务的公司,不会在乎成本,只要把东西做好,一切都好说,但这方面做的人也少啊,因为开发系统贵啊。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 对于说为自已找了个好师傅,我想是这样的,因为同级工程师间存在着某此潜在的竞争关系,有很多人不愿意把自己知道的东西教给别人,这意味着他将要失业,就是所说的教会徒弟,饿死师傅,但对于我们这些人就不存在这样的关系了,我是在嵌入式系统平台设计上走到了一定程序,目前在国内这块的技术上已经是自己很难再突破自己,因此很多东西我对大家都是<SPAN lang=EN-US>OPEN</SPAN>的,就比如说下面那部分关于接口设计中所提到的时序接口东西,我要是不讲,却使是高级硬件工程师我想也几乎只有<SPAN lang=EN-US>10%</SPAN>的人能知道吧。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> </SPAN><B><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">六、成为高级嵌入式系统硬件工程师要具备的技能。</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 首先我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通,或去网站看看<SPAN lang=EN-US><A href="http://www.zt-training.com/"><SPAN style="COLOR: #216b8a; TEXT-DECORATION: none; mso-bidi-font-size: 12.0pt; text-underline: none">www.zt-training.com</SPAN></A></SPAN>。他们的方面上我只能说是知道些,但不是太多,初级的问题也可以问我。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 对于硬件来讲有几个方向,就单纯信号来分为数字和模拟,模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化,比如手机的<SPAN lang=EN-US>Modem</SPAN>射频模块,都采用成熟的套片,而当年国际上只有两家公司有此技术,自我感觉模拟功能不太强的人,不太适合搞这个,如果真能搞定到手机的射频模块,只要达到一般程度可能月薪都在<SPAN lang=EN-US>15K</SPAN>以上。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial">另一类就是数字部分了,在大方向上又可分为<SPAN lang=EN-US>51/<A title=ARM href="http://article.ednchina.com/word/131530.aspx"><SPAN style="mso-bidi-font-size: 12.0pt"><FONT color=#0000ff>ARM</FONT></SPAN></A></SPAN>的单片机类,<SPAN lang=EN-US>DSP</SPAN>类,<SPAN lang=EN-US>FPGA</SPAN>类,国内<SPAN lang=EN-US>FPGA</SPAN>的工程师大多是在<SPAN lang=EN-US>IC</SPAN>设计公司从事<SPAN lang=EN-US>IP</SPAN>核的前端验证,这部分不搞到门级,前途不太明朗,即使做个<SPAN lang=EN-US>IC</SPAN>前端验证工程师,也要搞上几年才能胜任。<SPAN lang=EN-US>DSP</SPAN>硬件接口比较定型,如果不向驱动或是算法上靠拢,前途也不会太大。而<SPAN lang=EN-US>ARM</SPAN>单片机类的内容就较多,业界产品占用量大,应用人群广,因此就业空间极大,而硬件设计最体现水平和水准的就是接口设计这块,这是各个高级硬件工程师相互<SPAN lang=EN-US>PK</SPAN>,判定水平高低的依据。而接口设计这块最关键的是看时序,而不是简单的连接,比如<SPAN lang=EN-US>PXA255</SPAN>处理器<SPAN lang=EN-US>I<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2C</st1:chmetcnv></SPAN>要求速度在<SPAN lang=EN-US>100Kbps</SPAN>,如果把一个<SPAN lang=EN-US>I<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2C</st1:chmetcnv></SPAN>外围器件,最高还达不到<SPAN lang=EN-US>100kbps</SPAN>的与它相接,必然要导致设计的失败。这样的情况有很多,比如<SPAN lang=EN-US>51</SPAN>单片机可以在总线接<SPAN lang=EN-US>LCD</SPAN>,但为什么这种<SPAN lang=EN-US>LCD</SPAN>就不能挂在<SPAN lang=EN-US>ARM</SPAN>的总线上,还有<SPAN lang=EN-US>ARM7</SPAN>总线上可以外接个<SPAN lang=EN-US>Winband</SPAN>的<SPAN lang=EN-US>SD</SPAN>卡控制器,但为什么这种控制器接不到<SPAN lang=EN-US>ARM9</SPAN>或是<SPAN lang=EN-US>Xscale</SPAN>处理器上,这些都是问题。因此接口并不是一种简单的连接,要看时序,要看参数。一个优秀的硬件工程师应该能够在没有参考方案的前提下设计出一个在成本和性能上更加优秀的产品,靠现有的方案,也要进行适当的可行性裁剪,但不是胡乱的来,我遇到一个工程师把方案中的<SPAN lang=EN-US>5V</SPAN>变<SPAN lang=EN-US>1.8V</SPAN>的<SPAN lang=EN-US>DC</SPAN>芯片,直接更换成<SPAN lang=EN-US>LDO</SPAN>,有时就会把<SPAN lang=EN-US>CPU</SPAN>烧上几个。前几天还有人希望我帮忙把他们以前基于<SPAN lang=EN-US>PXA255</SPAN>平台的手持<SPAN lang=EN-US>GPS</SPAN>设备做下程序优化,我问了一下情况,地图是存在<SPAN lang=EN-US>SD</SPAN>卡中的,而<SPAN lang=EN-US>SD</SPAN>卡与<SPAN lang=EN-US>PXA255</SPAN>的<SPAN lang=EN-US>MMC</SPAN>控制器间采用的<SPAN lang=EN-US>SPI</SPAN>接口,因此导致地图读取速度十分的慢,这种情况是设计中严重的缺陷,而不是程序的问题,因此我提了几条建议,让他们更新试下再说。因此想成为一个优秀的工程师,需要对系统整体性的把握和对已有电路的理解,换句话说,给你一套电路图你终究能看明白多少,看不明白<SPAN lang=EN-US>80%</SPAN>以上的话,说明你离优秀的工程师还差得远哪。其次是电路的调试能力和审图能力,但最最基本的能力还是原理图设计<SPAN lang=EN-US>PCB</SPAN>绘制,逻辑设计这块。这是指的硬件设计工程师,从上面的硬件设计工程师中还可以分出<SPAN lang=EN-US>ECAD</SPAN>工程师,就是专业的画<SPAN lang=EN-US>PCB</SPAN>板的工程师,和<SPAN lang=EN-US>EMC</SPAN>设计工程师,帮人家解决<SPAN lang=EN-US>EMC</SPAN>的问题。硬件工程师再往上就是板级测试工程师,就是<SPAN lang=EN-US>C</SPAN>语功底很好的硬件工程师,在电路板调试过程中能通过自已编写的测试程序对硬件功能进行验证。然后再交给基于操作系统级的驱动开发人。 <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 总之,硬件的内容很多很杂,硬件那方面练成了都会成为一个高手,我时常会给人家做下方案评估,很多高级硬件工程师设计的东西,经常被我一句话否定,因此工程师做到我这种地步,也会得罪些人,但硬件的确会有很多不为人知的东西,让很多高级硬件工程师也摸不到头脑。<SPAN lang=EN-US> <o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 那么高级硬件件工程师技术技能都要具备那些东西哪,首先要掌握<SPAN lang=EN-US>EDA</SPAN>设计的辅助工具类如<SPAN lang=EN-US>Protel\ORCAD\PowperPCB\Maplux2\ISE</SPAN>、<SPAN lang=EN-US>VDHL</SPAN>语言,要能用到这些工具画图画板做逻辑设计,再有就是接口设计审图能力,再者就是调试能力,如果能走到总体方案设计这块,那就基本上快成为资深工程师了。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 硬件是要靠经验,也要靠积累的,十年磨一剑,百年磨一针。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 把一个月前想写的东西,今天终于用一上午的进间整理完了,希望对喜爱<SPAN lang=EN-US><A title=嵌入式系统 href="http://article.ednchina.com/word/131532.aspx"><SPAN lang=EN-US style="mso-bidi-font-size: 12.0pt"><SPAN lang=EN-US><FONT color=#0000ff>嵌入式系统</FONT></SPAN></SPAN></A></SPAN>开发的工程师和学生们有所帮助。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 高级硬件工程师不仅要有设计能力还有具有相当深厚的基本功,就是<SPAN lang=EN-US>EDA</SPAN>工具类的使用,<SPAN lang=EN-US>EDA</SPAN>工程师包括原理图和<SPAN lang=EN-US>PCB</SPAN>工具,逻辑设计工具和<SPAN lang=EN-US>VHDL<o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>SCH</SPAN>有<SPAN lang=EN-US>Cadence</SPAN>下的<SPAN lang=EN-US>Orcad </SPAN>和<SPAN lang=EN-US>Mentors</SPAN>公司的<SPAN lang=EN-US>pads</SPAN>下的<SPAN lang=EN-US>Powerpcb.<o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> 当然<SPAN lang=EN-US>protel</SPAN>也具有这两部分功能但它在国际上不通用。只是国内通用。如果想走得高些或到台资、日资、美资公司及国内需要对外交流的大公司的话,上面的硬件的原理图工具和<SPAN lang=EN-US>PCB</SPAN>工资必须掌握的,逻辑这块,硬件工程师主要是负责<SPAN lang=EN-US>CPLD</SPAN>这块,涉及<SPAN lang=EN-US>FPGA</SPAN>这块时应该会有专业<SPAN lang=EN-US>FPGA</SPAN>人员来搞定的,因<SPAN lang=EN-US>FPGA</SPAN>不太适合做逻辑的。因此硬件工程师只到<SPAN lang=EN-US>CPLD</SPAN>为止。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 4.1pt 0cm 8.15pt; LINE-HEIGHT: 17.65pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 9.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Arial"> <SPAN lang=EN-US>CPLD</SPAN>常用的设计软件有<SPAN lang=EN-US>Alter</SPAN>公司的<SPAN lang=EN-US>Maxplus2</SPAN>和<SPAN lang=EN-US>Xilinx</SPAN>公司的<SPAN lang=EN-US>ISE</SPAN>所用语言大多是<SPAN lang=EN-US>VHDL</SPAN>语言。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=3> </FONT></o:p></SPAN></P></DIV>
查看全文
发表于:2008-06-11 ┆
阅读(65)
┆
评论(0)
开源软件与自由软件
<DIV>出自:</DIV> <DIV><A href="http://www.builder.com.cn/2008/0529/890647.shtml">http://www.builder.com.cn/2008/0529/890647.shtml</A></DIV> <DIV><BR>开源软件与自由软件有共性也有区别,更为重要的是,可看成从两个角度来看待的同一类事物,因而通常将他们归为一类,通称“自由/开源软件(FLOSS,Free/Libre and Open Source Software)”。</DIV> <DIV> 自由软件和开源软件的区别,实际体现在:许可证对权力义务的规定,在严、宽,紧、松的程度上有所不同。</DIV> <DIV> 开源软件与自由软件其软件作者(一般为社区志愿开发者集体)在实施其各自的许可证(或许可协议)时,均要放弃自己所拥有的一些知识产权的权利,授权于 被许可人(公众或用户,作默认处理)。软件作者将公开发布其源代码,允许被许可人自由使用(或运行)、研究、复制、修改、赠送或出售给他人,以及发行该软 件。</DIV> <DIV> 在自由软件的许可证中,不允许被许可人将本许可证所许可的源代码和执行代码(或运行代码和二进制代码)的修改版本或演绎版本,在再发行时以其 他的许可方式再发行。也就是说,自由软件在传播过程中,允许被许可人进行修改,但修改后再发行的软件应该还是自由软件,而不允许从此演变成非自由软件;即 修改后再发行时,必须接受自由软件的运行规则(不能改变自由软件的许可证)。当然,如果被许可人将修改后的自由软件保留起来仅供自己使用,而不再另外发 行,则也是许可的。</DIV> <DIV> 当软件程序进行修改,或出现不同软件程序之间连接时,如果使用自由软件的许可证,则要求修改前后的该软件,或相连接的组合软件,都要严格遵循 该软件原来执行的许可证的限制;而如果使用开源软件的许可证,则对修改后的软件或与之连接的软件,对其限制相对较宽松,允许修改后或连接上的软件,可适用 其他开源软件许可证,甚至允许其连接到专有软件(专利许可证)上去。</DIV> <DIV> 通用公共许可证(GNU General Public License,GPL)是一种比较典型的自由软件许可证。在现有的约60种自由/开源软件许可证中,使用GPL许可证的占65.8%,即使用GPL许可 证的自由软件是主流软件,在自由/开源软件中占有绝大部分。GPL许可证规定,使用GPL的软件在修改后不得使用其他许可证再发行。</DIV> <DIV> 所以在使用开源软件并允许修改再发行时,往往会出现许可证的冲突,而这种冲突主要是出现在不同许可证与GPL之间。</DIV> <DIV> 自由软件基金会(FSF)创始人Richard Stallman认为,自由软件与开源软件是不同的两个概念,自由软件是一项政治活动,而开源软件是一种开发模式;自由软件运动所关心的是它的伦理和社会 价值。我们认为,这个说法基本上是正确的(至于自由软件是不是一项政治活动?值得商榷,但至少是一种文化现象,是一种哲理、伦理和社会价值观);必须指 出,开源运动也是要紧密贯彻自由软件的文化、哲理和价值观的,在这方面不要把自由软件和开源软件割裂开来。</DIV> <DIV> 前几天我见到王开源先生,看到他穿着一件印字的体恤衫,上面写着:“Free Software,Free ware” ,翻译成中文为:“自由软件,免费软件”。其实自由软件不一定免费,它与免费软件是不同的两个概念。我对王先生说,还不如上次你在北大抗议时,高举 “Free Software,Open Source”的标语要好,因为标语上写的是“自由软件,开源软件”。应该把自由软件与开源软件看成一体。</DIV> <DIV> 有人把1998年自由软件(Free Software)和开源软件(Open Source)的一场争论搬出来说事。那次争论,Open Source相对占了上风,这是以Richard Stallman的妥协来收场的,争论的焦点集中在“次级通用公共许可证(Lesser General Public License,LGPL)”上,LGPL不同于GPL,在LGPL下,函数库可自由地连接到专有软件上去。我认为,现在重提历史争议不利于自由软件与开 源软件的一体观。</DIV> <DIV> 有人还举出今年9月15日Stallman的一次谈话:开源软件拥护者鼓吹一种用户参与其中的“(社区)开发模式”,并断言,如此这般,一定会获得最好的软件;这种强调“实际方便性”的结果,实际是忽视使用程序的“自由性”。</DIV> <DIV> 这段话是什么意思呢?Stallman在这里是肯定还是否定社区开发模式吗?他是不是说开源软件在搞“实用主义”,而抛弃了自由软件价值观的“灵魂”呢?我们应该冷静地来剖析他的这段讲话。</DIV> <DIV> 关于对社区开发模式的评价,Stallman曾说过:“一般讲,我不认为GPL规则是Linux取得成就的主要原因,相反,我认为那是由于在 1991年那个时期,Linus Torvalds第一个找到了分布式开发软件的正确的社区组织形式”。在这里,Stallman充分肯定了“开源社区”这个开发模式和开发机制的先进性和 其重要贡献。</DIV> <DIV> 就是今天,Stallman也说:我不是说他们错了。我理解,Richard Stallman说这段话是在告诫大家:发展自由/开源软件要抓住重点(Missing the point),不要忽视自由/开源软件的开发者(作者)授权于被许可人在使用(或运行)、研究、修改、复制、赠送(或出售)、发布时的“自由性”,以及 “奉献给全社会以增进其团结一致的价值”;这是在发展自由/开源软件时居第一位的,而所谓“开源社区所创造出来的那种可靠、有效的软件”是居第二位的。所 以,我认为Stallman在这里只是强调重点不同,并无对开源软件或开源社区有任何贬伐的意思。</DIV> <DIV> 在自由/开源软件界,有一种将人们分成激进派和稳健派的说法,有人重视精神,讲究自由哲理、开源文化和价值观,有人重视物质,讲究实绩、实效。我看还是应将两者统一起来,我们认承指导思想对自由/开源运动的发展是重要的,但自由软件与开源软件不要分裂。</DIV> <DIV> 问题是我们要研究Richard Stallman近来谈话的背景是什么?必须指出在自由/开源软件整个发展历史中,资本、私权与自由、开放的矛盾贯穿始终,近来Stallman似乎十分担心资本对自由/开源运动过度的侵蚀。</DIV> <DIV> 例如,没有商业模式的开源社区其开发活动需要企业或基金会提供财政支持,它最终是否会被资本或大企业所控制呢?!据有关统计,目前全球开源社 区的志愿开发者大多数来自企业(而非学校、社会),是否也可能带入企业的影响?!如果自由/开源软件在修改后以不同的许可证将其连接到专有软件上去,而重 新发布这种组合软件时,是否会冲击、侵蚀自由软件的价值观?!其实Richard Stallman(在FSF首席律师Eben Moglen帮助下)领导制定的GPLv3许可证,就是为了张扬自由软件的哲理和价值观,防范资本对自由/开源活动的过度侵蚀。GPLv3的焦点有二, (1)是企图防止诸如全球最大的私有商业软件厂商微软,以与Novell“结盟”方式,实行“各个击破”战略,侵蚀自由/开源活动(这里要提到的是,在 Novell工作的“文件共享管理器Samba”的核心开发人员Jevemy Allison就认为M/N“结盟”有违于自由/开源运动的价值观,愤然离职而去),力求开源运动保持“团结一致的价值观”,拿起集体自卫的法律武器来应 对;(2)是诸如对数字版权管理(DRM),加大对被许可人权利限制的力度(从软件延伸到硬件)。应该指出,很多人对GPLv3 的出台迄今是持不同或保留意见的,接受GPLv3,或从GPLv2过渡到GPLv3的自由/开源组织,正在缓慢增长之中(还未出现突变)。</DIV> <DIV> Apache的创始人Brain Behlendorf说过:利他主义(Altruism)与获利主义(Capitalism)合在一起,才使人们为开源作贡献。其实资本与自由的矛盾是对立的统一,关键是要找出平衡点。</DIV> <DIV> </DIV>
查看全文
发表于:2008-06-02 ┆
阅读(93)
┆
评论(0)
Richard Stallman清华演讲
<DIV>今日有幸在清华大学听了一场精彩的演讲,主讲人是大名鼎鼎的 richard stallman,第一次知道这个名字是在课堂上,老师讲了当今世界三大黑客,其中之一就是richard stallman,在很多中国人心目中黑客一词好像含有贬义,但是richard stallman在我心目中却是一位顶天立地的英雄,因为他的人格魅力,因为他的聪明绝顶,因为他为了理想不懈奋斗的精神。一直在用他写的GCC编译器,而EMACS还没有开始使用,因为一直用VIM,有时间一定研究一下EMACS,因为之前有一天看到老师用EMACS来画图,当时真是震惊了,EMACS居然还可以用来画图,太神奇了。今天见到了richard stallman后才真正体会到什么是表里如一,对他的形容两个字:不羁。今天见到richard stallman时,他着装很休闲,身上没有名牌,带着一个笔记本,是100美元计划的那种,看上去很卡通,演讲充满激情并不乏幽默,在演讲接近尾声时,richard stallman突然换了一身行头,穿起了一件黑色长袍,人们纷纷上前拍照,场面很搞笑,在最后的提问环节,我们伟大的richard stallman好像饥饿难耐,居然一边吃起了东西一边回答问题。今天真是一次令人难忘的美妙经历。</DIV> <DIV> </DIV> <DIV>附上richard stallman的介绍:</DIV> <DIV> </DIV> <DIV>理查德·马修·斯托曼(Richard Matthew Stallman, RMS,生于1953年),自由软件运动的精神领袖、GNU计划以及自由软件基金会(Free Software Foundation)的创立者、著名黑客。他最大的影响是为自由软件运动竖立了道德、政治以及法律框架。他被许多人誉为当今自由软件的斗士、伟大的理想主义者,但同时也有人批评他过于固执、观点落伍。 <BR><BR>斯托曼1953年出生于美国纽约曼哈顿地区,1971年进入哈佛大学学习,同年受聘于麻省理工学院人工智能实验室(AI Laboratory),成为一名职业黑客。 <BR><BR>在AI实验室工作期间,斯托曼开发了多种今后影响深远的软件,其中最著名的就是Emacs。斯托曼在AI是一名典型的黑客,是整个黑客文化的一份子。 <BR><BR>然而进入八十年代后,黑客社群在软件工业商业化的强大压力下日渐土崩瓦解,甚至连AI实验室的许多黑客也组成了Symbolic公司,试图以专利软件来取代实验室中黑客文化的产物--免费可自由流通的软件。 <BR><BR>斯托曼对此感到气愤与无奈。在对Symbolic进行了一段时间的抗争后,他于1985年发表了著名的<A href="http://baike.baidu.com/view/36272.htm" target=_blank><FONT color=#0000ff>GNU</FONT></A>宣言(GNU Manifesto),正式宣布要开始进行一项宏伟的计划:创造一套完全自由免费,兼容于Unix的操作系统GNU(GNU's Not Unix!),目的是打破大型网络供应商的垄断。现今,GNU 已成为全球最受欢迎的<A href="http://baike.baidu.com/view/20965.htm" target=_blank><FONT color=#0000ff>自由软件</FONT></A>许可证!之后他又建立了自由软件基金会来协助该划。 <BR><BR>他于1989年与一群律师起草了广为使用的GNU通用公共协议证书(GNU General Public License, GNU GPL),创造性地提出了“反版权”(或“版权属左”,或“开权”,<A href="http://baike.baidu.com/view/20996.htm" target=_blank><FONT color=#0000ff>copyleft</FONT></A>)的概念。 同时,GNU计划中除了最关键的Hurd操作系统内核之外,其他绝大多数软件已经完成。 <BR><BR>1991年芬兰大学生<A href="http://baike.baidu.com/view/499742.htm" target=_blank><FONT color=#0000ff>李纳斯</FONT></A>(<A href="http://baike.baidu.com/view/20706.htm" target=_blank><FONT color=#0000ff>Linus</FONT></A> Torvalds)在GPL条例下发布他自己创作的<A href="http://baike.baidu.com/view/1634.htm" target=_blank><FONT color=#0000ff>Linux</FONT></A>操作系统内核,至此GNU计划正式完成,操作系统被命名为GNU/Linux(或简称Linux)。<BR><BR>自 90 年代开始,斯托曼开始积极参加政治运动,到各间大学和场合主讲,宣扬推行自由软件的讯息,令他无论在电脑界或学术界都享负盛名! <BR><BR>斯托曼是一名坚定的自由软件运动倡导者,与其他提倡开放源代码的人不同,斯托曼并不是从软件质量的角度而是从道德的角度来看待自由软件。他认为使用专利软件是非常不道德的事,只有附带了源代码的程序才是符合其道德标准的。对此许多人表示异议,并也因此有了自由软件运动与<A href="http://baike.baidu.com/view/444964.htm" target=_blank><FONT color=#0000ff>开源软件</FONT></A>运动之分<BR><BR>代表作︰<BR><BR>— 创立自由软件 GNU<BR><BR>— Emacs 文字编辑器<BR><BR>— GCC编译器<BR><BR>斯托曼还曾获得过多项荣誉<BR>1990年度麦克阿瑟奖(MacArthur Fellowship) <BR>1991年度美国计算机协会(Association for Computing Machinery)颁发的Grace Hopper Award以表彰他所开发的的Emacs文字编辑器 <BR>1996年获颁瑞典皇家技术学院荣誉博士学位 <BR>1998年度电子前线基金会(Electronic Frontier Foundation)先锋奖(Pioneer Award) <BR>1999年Yuri Rubinsky纪念奖 <BR>2001年获颁格拉斯哥大学荣誉博士学位 <BR>2001年武田研究奖励赏(武田研究奨励赏) <BR>2002年成为美国国家工程院院士 <BR>2003年获颁布鲁塞尔大学荣誉博士学位<BR></DIV> <DIV></DIV>
查看全文
发表于:2008-05-31 ┆
阅读(73)
┆
评论(0)
UART串口中断学习
<DIV> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> 用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">UART</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">串口以中断形式实现在超级终端中输入及显示字符。</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN></FONT> </P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前做过一个小程序,用轮询等待的方式不断查看接收及发送缓冲区的状态,此方法只适用于实验而已,实用性并不强,因为需要不断的查询及等待,这样会对</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">CPU</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">造成极大的浪费。最好的解决方案当然是用中断来实现,中断的优点及在</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ARM</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用中的重要作用,相信不用说谁都知道,所以对于中断应该深入的理解和学习。</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用了一下午时间,刚开始看</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DATASHEET</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,熟悉各寄存器的作用及用法,接着着手写程序实现,起初只是实现了接收中断,在接收中断</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ISR</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中,读敢</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">URXBUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的数据,然后直接输出到</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">UTXBUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,其间发生了不少错误,通过点</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">LED</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">灯一一调试通过了,这样虽然可以观查到同样的实验现象,但是其本质是有区别的,当超级终端输入数据很快时,出现数据覆盖的结果,造成输出不正确,解决办法就是需要有输出中断机制。但是很长一段时间里我一直在一个问题上纠缠不清,就是在发送中断</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ISR</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中应该做些什么及如何才能触发一个发送中断,想了一些办法,但是路总是越走越窄,因为之前就没有一个整体的思考。</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>其实实现的逻辑很简单,画个图表示:</FONT></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3></FONT></SPAN> </P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">超</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="mso-spacerun: yes"> </SPAN>ISR<SPAN style="mso-spacerun: yes"> </SPAN><SPAN style="mso-spacerun: yes"> </SPAN></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户程序</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">级</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes"> </SPAN>------</FONT></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</SPAN></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"> URXBUF<SPAN style="mso-spacerun: yes"> </SPAN>---</FONT></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</SPAN></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes"> </SPAN>RECV_BUF ----</FONT></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">à</SPAN></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes"> </SPAN>ch = getchar()</FONT></SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">终</SPAN><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT face="Times New Roman"> </FONT></SPAN></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">ß</SPAN></SPAN><SPAN lang=EN-US><FONT face="Times New Roman">----<SPAN style="mso-spacerun: yes"> </SPAN>UTXBUF<SPAN style="mso-spacerun: yes"> </SPAN></FONT></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">ß</SPAN></SPAN><SPAN lang=EN-US><FONT face="Times New Roman">----<SPAN style="mso-spacerun: yes"> </SPAN>SEND_BUF </FONT></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"><SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">ß</SPAN></SPAN><SPAN lang=EN-US><FONT face="Times New Roman">----<SPAN style="mso-spacerun: yes"> </SPAN>putchar(ch)</FONT></SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-spacerun: yes"> </SPAN>ISR<SPAN style="mso-spacerun: yes"> </SPAN></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户程序</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN></FONT> </P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">外设的缓冲区只能存储一个</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">CHAR</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">型数据,所以当发生接收中断时,</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ISR</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中要做的事情只是将</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">URXBUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">CH</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存入用户自定义的缓冲区</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">REVE_BUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,同理发送中断的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ISR</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只是将</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">SEND_BUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">CH</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">写入</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">UTXBUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中,而用户主程序中要做的事情就是用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">getchar</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">putchar</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来操纵用户自己定义的两个缓冲区。通过这样的整体布局,框架就有了,之后的工作就是具体实现了。</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>在具体实现中有几个细节需要注意:</FONT></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 39.75pt"><FONT face="Times New Roman"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>1、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN></SPAN><SPAN lang=EN-US><FONT size=3>ISR</FONT></SPAN></FONT><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中和用户程序中对用户自定义的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">BUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行读写时应操纵不同的数组下标,具体实现时我使用了</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">4</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个下标。</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 39.75pt"><FONT face="Times New Roman"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>2、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN></SPAN><SPAN lang=EN-US><FONT size=3>Getchar</FONT></SPAN></FONT><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中应判断当前</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">RECV_BUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中是否有数据可读,可通过比较对其操作的两个下标来判断。</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 39.75pt"><FONT face="Times New Roman"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>3、</FONT><SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN></SPAN><SPAN lang=EN-US><FONT size=3>Putchar</FONT></SPAN></FONT><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的操作是用户自定义的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">SEND_BUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,所以应该由用户来人为的触发一个发送中断,我是向</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">UTXBUF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中写入</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">0X0</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现的,对这一步的操作应该还有更好的办法,只是我没有想到。</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3> 在写程序的过程中,走了不少弯路,浪费了很多宝贵的时间,在这里我总结的教训就是:</FONT></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore&qu