呵呵
分类: 嵌入式
2015-01-08 15:33:59
原文地址:怎么学好嵌入式开发 作者:apple_guet
一、为什么要从事嵌入式开发
不管你是IT相关专业的学生或是IT从业人员,对于嵌入式你应该至少听说过,但你未必真的了解,笔者希望通过这篇文章让你知道什么样的产品是,为什么要从事嵌入式开发。
什么样的产品是嵌入式产品?其实你每天都会见到也每天都会用到:手机、MP3、MP4、 游戏机、数码相机等等,这些都可以统称为消费类领域产品,难道嵌入式产品仅仅是消费类产品吗?答案是否定的,嵌入式产品涵盖:消费类电子、数字家电、视频 编码解码、图像处理、安防监控、网络安全、工业控制、航天航空等领域。由此可见,嵌入式产品无处不在,应用前景更为广大。
首先,既然嵌入式产品应用如此广泛,那么作为IT人 士必然会想到自己能否从事手机、游戏机、机顶盒等产品开发呢,因为这些产品的开发与自身的生活密切相关,不仅可以让自己在使用这些产品时更加便利也能更加 清楚这些高科技产品的设计奥秘,从事嵌入式产品开发不仅满足自身的兴趣又可以作为一种长期稳定的职业来发展,真不愧是一石二鸟之举,这正是很多嵌入式爱好 者通过培训或自学转向嵌入式开发的主要原因。
其次,嵌入式开发职位是高薪IT行业之一。为什么嵌入式行业的工程师薪水通常要高于其他IT工程师,主要原因在于它对工程师的要求普遍要高于其他职位,因为一个优秀的嵌入式工程师不仅要具备熟练的软件开发技能还要掌握硬件的基本原理,这与普通的软件开发工程师相比至少要多一个门槛,那就是硬件的基础知识。作为软件工程师的朋友都知道,他们一般在PC上写应用软件基本不需要了解硬件电路和接口,但作为优秀的嵌入式开发工程师,硬件电路与接口是其基本技能之一。
最 后,嵌入式开发可作为稳定长期的职业发展。由于嵌入式产品的需求日益增大,比如在智能家电、汽车电子、机器人、航天航空等方面的需求越来越大,这就使得社 会对嵌入式产品开发人员的需求不断增加。它不会像桌面软件开发容易过时,因为嵌入式开发要涉及的知识面非常广,这也就是人常说的活到老学到老完全可以应用 在此,对于嵌入式开发职位,你工作的时间越久,你的经验就越丰富,你的个人价值和回报也就最大。
总之,不管选择什么方向,但都必须要踏踏实实、一步一个脚印去努力。我相信作为对嵌入式产品开发感兴趣又崇尚技术的朋友,从事嵌入式开发绝对是明智的选择。
二、如何成为优秀的驱动开发工程师
或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧。但是作为我来说,也许我更想把这个标题作为一个疑问句来使用,整理一下自己的认识,用来勉励自己,和大家一起努力实现这个目标。认识肤浅的地方,还请大家见谅。
2.1、何谓优秀的驱动开发工程师
首先要定义,我所认为的一个优秀的驱动开发工程师,应该具备什么样的能力,这里列一下按照从易到难的顺序,个人认为应该会有几个方面的要求吧:
1、能够独立完成驱动的功能开发任务。
2、能够分析和优化驱动的性能,针对特定硬件扬长避短。
3、能够充分了解模块相关软硬件能力、发展方向,辅助应用工程师最大化利用硬件能力。
4、能够辅助硬件工程师规划硬件设计,预防问题,谋求功能模块的最佳方案。
5、能够协助定义系统架构,合理规划软硬件,谋求产品实现的最佳方案。
作为一个驱动工程师,很多时候不是完全从头开发一个完整的子系统,而是针对特定硬件和平台移植驱动,增加功能,解决Bug等等,如果从这方面外在的表现来看:
解决问题的境界,大概会有这么几个阶段:
不知道哪里存在BUG
不知道如何解决BUG
知道如何解决BUG
知道如何发现BUG
知道如何规划BUG
知道如何发现BUG(而不是撞上BUG)其实并不简单,需要你对系统有足够的了解,能够察觉可能出问题的地方。 而规划Bug更难,需要你能对问题的轻重缓急做出准确的判断。没有的完美的世界,只有适当的取舍,规避和预防。
而从解决问题过程的角度来看,我认可以分为几个阶段:
BUG发生 -> 大量跟踪调试代码 -> 终于发现并解决BUG
BUG发生 -> 理论推测可能原因 -> 迅速定位并解决BUG
阅读代码 -> 预测可能出现的BUG -> 证实并解决BUG
号称能光凭瞄一遍代码就找到问题的高手,我想我是没希望了。
2.2、应该具备怎样的素质
那么要达到上诉最佳境界,需要具备和发展哪些素质和能力呢?
2.2.1、足够的硬件知识
能看简单的原理图,能够分析硬件异常的可能原因,能够使用常见的硬件调试工具,我想这是做为优秀的驱动工程师,区别与其它软件工程师,所不可避免、必须具备的专业素质。当然取决于你具体从事的工作,对这方面的要求不尽相同。
对于驱动开发者来说,不了解所开发驱动外设的硬件原理和相关背景知识,也许很多时候,也能够完成一些移植,修补的工作任务,但这就好比无源之水,无根之木,我相信是很难走远的。
2.2.2、多多益善的操作系统知识
做驱动开发,特别是纯粹的外设的驱动移植工作,刚开始的时候,也许你并不需要了解很多操作系统本身的知识(像内存管理,进程调度,锁,各种内核子系统的原理框架等等),也能顺利完成手头的一些工作。
但是,如果一但需要优化驱动,需要完善软件框架,或者是遇上疑难问题需要跟踪解决,对操作系统,内核本身的了解,就体现出它的价值了。
对于Linux内核驱动开发者,尤其如此,首先,代码是完全开源的,你有条件去了解背后的运行机制,其次,Linux内核和各个组成子系统总是在迅速的进化发展中,不进则退,你也有必要跟上时代发展的脚步。
强烈的好奇心,持续的热情
如果驱动开发不仅仅是你的爱好,更是你养家糊口的途径,我想,很多时候,你大概不会有机会专注于一两个你最有经验的模块的开发和维护。随着能力的成长,势必会要求你接触和掌握越来越多的各式各样的驱动模块的开发。
我觉得如果自己的目标是优秀,那么最起码的标准应该是对具体驱动模块相关的子系统的整体工作流程,框架,具备足够的好奇心,乐于去了解和学习,而不仅仅是为了完成任务而工作,否则的话,很难积累下扎实的经验和技术。
2.2.3、清晰的逻辑思维能力
这一点,也许是个软件开发人员都应该具备吧,不过,做为驱动开发工程师来说,有时候,大多数情况下,工作的硬件环境并不是完美的,遇到问题需要分析判断错误的原因是硬件问题还是驱动Bug,这时候,清晰的逻辑思维能力尤其重要。
2.2.4、良好的工作习惯
大多数人都不是天才,要成为优秀的开发工程师,一需要持续努力,二需要时间积累经验,而这过程中,很重要的一点,就是要有良好的工作习惯。譬如,注意设计文档的维护,对工作中遇到的问题的记录,过往经验的及时记录,适当的软件开发流程等等。文档工作,可能很多人很不愿意去做,它的确很花费时间。不过,唉。。。老啦,好记性不如烂笔头啊。当然,其实设计文档更多的是为你提供思考的机会,而过往经验的总结,也可以起到和大家交流技术,共同进步的目的。
2.2.5、英语
这个也是必须的啦,没有办法,邮件列表,技术文档,社区,精通英语肯定是很大的优势,做开源项目尤其如此。阅读各种Spec标准文档之类的速度还是很重要的。阅读无障碍是一回事,能和母语一样一目十行,那才爽呀,唉,人生苦短,效率啊!光读文档,就不知道要比老外多花多少时间。
三、嵌入式系统工程师的十个不要
1. 不要第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。
2. 初学者请不要看太多的书那会误人子弟的。先找一本好书系统的学习。很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。
3. 看帮助。不要因为很难,而自己又是初学者所以就不看;帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,或不够直观。
4. 不要被一些专用词汇所迷惑;最根本的是先了解最基础知识。
5. 不要放过任何一个看上去很简单的小问题--他们往往并不那么简单,或者可以引伸出很多知识点;不会举一反三你就永远学不会。
6. 不要知道一点东西就以为懂了,这并不能说明你会用,会用是需要实践经验和时间积累的。
7. 不要放弃,入门并不难,难的是长期坚持实践和不遗余力的学习和实践。
8. 不要只看书,看再多的书是学不会用的,要多实践,多动手。
9. 不要老把时髦的技术挂在嘴边, 把时髦的技术挂在嘴边,还不如把基本的技术记在心里。
10.在任何时刻都不要认为自己手中的书已经足够了。
四、学习linux的七个忠告
1、不要“玩 Linux” 很多人用 Linux 的时候会感觉很迷茫,该用哪个发行呢?是不是我少装了什么?怎么升级这么快啊!怎么这么不稳定!每当遇到新的软件他就想试用,每当新的版本出现,他就更新,然后用鼠标在新的菜单里选择从来没见过的程序来用用。
其实你是为了Linux而使用Linux,而没有找到正确的理由来利用 Linux。你首先要明确用电脑的目的,你用它是为了解决你的实际问题,而不是为了学习安装操作系统,不是为了测试哪个版本好用,不是为了“赶上潮流”,更不是因为你硬盘太大了,你想多占点空间。
如果你启动了电脑之后不知道应该干什么,那么最好先不要用电脑,因为你可能有更重要的事情需要做。
2、不用挑剔发行版本
很多人刚开始用 Linux
的时候,总是在怀疑别的发行版本是否比自己正在用的这个好,总是怀疑自己以后时候会失去支持,不得不换用别的发行。所以很多人今天是
Redhat,明天又换成了 debian, 一会儿又是 gentoo, …… 甚至有的人在一台机器上装了两个版本的
Linux,然后比较哪一个好。
其实你完全没有必要这样做,任何发行,只要你熟悉了,你在上面的工作方式几乎是不会受到任何影响的。你常常听说 Debian 的更新比 Redhat
快,包比 Redhat 多,但是你可以比 Debian 更新还要快,直接到你需要的程序的主站点下载源码来编译就是了。
Debian, TurboLinux, SuSE, Redhat, Gentoo, ... 任何一个版本都是不错的。
3、不要当“传教士”
很多人在讨论区不断的引起 "Linux vs. Windows"
之类的讨论,甚至争的面红耳赤,这是没有必要的。因为各人的需要不同,生活的环境不同,你不可能得到一个定论。我们需要尊重别人的选择,这是你在进行任何
对工具的讨论前需要提醒自己的事情。面对一些容易引起争论的东西:Word 和 TeX;Emacs 和 VIM;MAXIMA,Mathematica
和 Maple;Gnome,FVWM 和 KDE;Mutt 和 Pine …… 一定要冷静。
你需要关心的不是你的工具是什么,而是你用它做了什么。精通 Linux 并不说明任何问题,因为它只是一个工具而已。如果你用 Windows
能很好的完成你的任务,那你就没有必要费时间去熟悉 Linux。直到有一天你发现一项任务只有 Linux 才能完成的时候再换也不迟,因为你身边的
Linux 的爱好者一定会很乐意的帮助你。
并不是喜欢一种东西就必须反对其它的。世界需要多样性,人们都需要FUN。用自己的兴趣去压制别人的,就会毁掉所有的兴趣。个人喜欢什么就用什么,完全没必要为这个争论。
不要做“传教士”!你说我现在就是在“传教”?冤枉啊~
4、直接从源码安装程序
很多人放着最新的源码不用,等着有人帮他做出 rpm, deb, 才能安装。我说你为什么不用源码编译,这样版本比 rpm 高的多,有很多新功能,而没有烦人的依赖关系。可是他说:“要是我用源码编译安装,卸载的时候就不方便了,会留下很多垃圾。”
为什么程序还没有安装你就想到卸载?难道你不知道这个程序是用来做什么的?你应该改变到处找程序来试用的作法,而应该先了解一下到底那些程序有同样的功能,听听别人的意见,看看它们各有什么长处和短处,然后挑一个最适合你的程序来用。
从源码编译安装程序,不但比你装rpm更适合自己的机器设置,而且它们一般会装到 /usr/local
目录,这样你以后如果换硬盘重装系统,也可以把以前 /usr/local 下的程序原封不动拷贝过去用。我的 /usr/local 下有 2G
之多的程序,你想要是我有一台新机器要重新安装,然后配置,得花费多少时间?实际上我曾经通过网络把它们传到一台新机器上,然后就出去吃晚饭,回来时我就
得到了另一台一摸一样的 Linux 机器。
确实要卸载 make install 的程序怎么办呢?答案是直接删掉。别以为直接删掉程序会留下垃圾,引起“系统不稳定”。(btw:
这是谁教你的啊?呵呵。) make install 无非就是把可执行程序放在 /usr/local/bin, 把某些函数库放在
/usr/local/lib,把数据文件放在 /usr/local/share
下一个它自己的目录,你把这些东西都删掉就行了,不会留下垃圾,即使真的留下一点文件没有删掉也占不了多少空间,更不可能引起系统不稳定。UNIX
就是这么简单
但是有几个程序不建议从源码安装,它们是 Mozilla, Open Office, ... 它们编译时会占用你几个G的空间和好几个小时的时间,这种花费我觉得是不值得的,因为你不能从编译得到更多好处,不如直接安装编译好的版本。
5、不要盲目升级
不知道这是心理作用还是什么,有的人看到比较大的版本号,就会很想换成那个。很多人的 Redhat 本来配置的很舒服了,可是一旦 Redhat
发行新的版本,他们就会尽快下载过来,然后选择升级安装。结果很多时候把自己原来修改得很好的配置文件给冲掉了。新的软件又带来了新的问题,比如有一次我
的 rxvt 升级到 2.7.8 就跟 miniChinput 冲突了,升级到 Redhat 8.0,发现 xmms
居然缺省不能放mp3了,XFree86 的 xtt 模块在 I810 上有新的 bug,会导致 Mozilla 突然退出。
如果你已经配置好了一切,千万别再整体升级了,这会浪费你很多很多时间的,不值得。如果需要的话,你可以只把某些部件升级,比如内核,glibc, gcc, XFree86,...
使用 UNIX 的经典程序。
好的程序一般都是可以很方便的在很多种 UNIX 上移植的,bash, VIM, Emacs, Mutt, FVWM, xterm,
都是这样。如果你用这些程序,你就可以在 Sun, HP, ... 等工作站上也装上,这样你在各种机型上的工作环境就几乎完全一样了!你不需要在
Sun 上面用 CDE,在PC上又换成 KDE,在它们上面都装一个 FVWM,使用相同的配置文件,就能得到一致的界面。
这些程序大部分都是久经考验的,是经过很多人多年开发的结果。它们功能完善,各种情况都考虑周全,绝对是你的好助手。
6、不要配置你不需要的东西
如果你只想做一个像我这样的普通用户,主要目的是用 Linux
来完成自己的科研任务和日常工作,那就可以不用系统管理员或者网络管理员的标准来要求自己,因为当一个系统和网络管理员确实很辛苦。普通用户学习那些不经
常用到的复杂的维护系统的工具,其实是浪费时间,学了不用是会很快忘记的!
我不是一个合格的网络管理员,我的服务器都只设置了我自己需要的功能,设置好 ssh, ftp
已经足够了,那样可以省去我很多麻烦。我从来不过度考虑“安全”,因为 Linux 缺省已经很安全了。我没有磁带机,就不用管 tar
的那些稀奇古怪的参数了,czf, xzf, ztf 已经可以满足我所有的需要。sed, awk, ... 我也只会几种常用的命令行。
7、不用忙着看内核源码
除非你想研究操作系统,否则还是先把怎么使用 Linux
掌握好再说吧。我以前看了那么多内核源代码,写了驱动程序,结果最后发现我还是一只很多事情不能用 Linux 解决的菜鸟
吸取我的教训吧,你应该首先掌握 shell,Xwindow 的使用和原理,它们可不比内核简单。