做嵌入式开发已经好几年,也算对这行有了点粗略的认识。最近经常有朋友问,到底要如何学习才能比较快地熟练掌握嵌入式软件开发呢?我在这里说一下我自己的看法,权当抛砖引玉,如果大家有自己的看法,欢迎指出!由于本人的职业所限,本文所指的开发,主要是针对嵌入式领域中的软件开发。
某位高人曾经说过,成为高手的路径只有一条,那就是:多做,多思考。用到嵌入式开发,可以理解为:多实践,多总结经验。我自己认为,如果要做什么行业,就一定要用全力把它做得最好。 本文只是从大的层面上讲讲需要注意的一些方面,并不涉及具体的问题(我也很想涉及,但可能要单独写文章了)。且嵌入式开发也有很多具体的方面,某些工作可能和PC开发流程一模一样,没有啥区别。我这里说的主要是和具体的硬件打交道比较多的开发工作。
第一,兴趣。
对某个行业有了兴趣,才能全身心地投入它,发挥自己的最佳状态。做嵌入式开发,培养对计算机和消费类电子的兴趣是很必要的。有了兴趣,才能够自发地学习大量相关的知识,打好基础;有了兴趣,才能够主动了解许多和嵌入式相关的产品、新闻,甚至是有关人物,并从这些东西引发自己的思考,也有可能在不经意之间做出影响自己的关键决定。我自己的经验是,有兴趣的东西可以过目不忘,没有兴趣的东西记十遍可能都记不住。
当你拿着一台智能手机,能够关注它用了什么CPU,同时清楚常用软件在它上面会跑出什么样的效果,是快是慢也能很快自己分析出原因,那就说明你对嵌入式有了真正的兴趣。
第二,理论。
虽然这是一个实践比理论更重要的行业,但是,嵌入式开发也不是每个人都可以做的,它对理论知识的要求也很高。很多学生都想毕业之后从事嵌入式开发,但是他们又缺少实践的机会。怎么办?趁在学校的时间,多看书,掌握点理论基础吧。计算机体系结构,C语言,数据结构等知识尤其重要。
学校一般会学x86的体系结构,但是毕业之后可能会从事ARM、51单片机等开发。但是,即使寄存器变了,即使指令变了,核心的内容都是一样的,对x86很熟悉的话,学习起来ARM更容易,因为ARM是RISC体系结构,更简单。而且,学的过程当中,自己会不经意对比x86和ARM的异同,加深对体系结构的理解。
嵌入式开发一般都以C语言为主,部分用汇编或者C++。所以掌握好C语言是相当重要的。学C语言不是拿着谭浩强的书翻来覆去地看就可以了,也不是能够应付考试在卷子上写一段代码就可以了。一定要边看书,边练习。没有嵌入式开发环境,就在PC上面写一些小程序练手。比如,对下棋感兴趣的人,就可以写一个简单的五子棋程序。
也许实际的开发当中,一般人都用不到多复杂的数据结构。比如,对于90%以上的开发人员来说,很少会用到树和图的,用得多的也就是数组和链表。但是掌握好数据结构和基础算法很有必要,会让你在看代码的时候,理解得更快,自己写代码的时候,效率更好——做嵌入式软件不光是堆砌代码,也是在设计一个产品,当你在采用某种算法的时候,心里也要清楚采用它的原因,抛弃其他算法的理由。
嵌入式设备上的操作系统纷繁复杂,简单的只有连OS都谈不上的控制程序,复杂的诸如智能手机上的复杂OS。大部分嵌入式产品,都需要自己设计或者移植OS的。幸好现在有Linux出现,让一切都相对容易。没事的时候,找本Linux的书来翻翻,装个Linux来玩玩,还是大有裨益的。
第三,实践。
如同卖油翁倒油一样,如果天天看他熟练倒油的过程,自己却不练习,永远也不会成为这方面的高手。嵌入式开发虽然不仅仅是“无他,唯手熟尔”的过程,但是,光看理论的书也掌握点算是皮毛的概念,真正接手开发工作,做实际项目,才是提高水平的正确途径。
如果学生朋友想毕业之后就能顺利从事这个行业的工作,最好是在校期间能够找到一些实习机会。参加培训也是一个方法,但是相比较而言,能够有实习这个免费培训机会,何乐而不为呢?学得更多(除了技术,还有其他方面的收获,这是培训学不到的),可能有时候还有一点收入呢,呵呵。实在找不到,花几百块钱买个最便宜的开发板(网上有售,含相关源代码)来玩玩也不错。但是无论如何,都要主动尝试寻找更多的实践机会。学校能够学的东西毕竟是有限的。
嵌入式开发的工具,无论是硬件工具,还是软件工具,都很多很多。接触某个具体的工作,就会用到相应的各种工具。掌握工具需要一定的时间,但是总的来说,工具的使用掌握起来还是很容易,操作它们和操作普通软件也差不了多少。知道什么时候该用什么工具,怎样地充分利用它们来提高开发效率以及程序的运行效率,这才是问题的关键。几年工作经验下来,我们需要提高的是对做的行业的了解,分析问题解决问题能力的提高,至于会用什么什么,这个虽然也比较重要,但是在这个工具更新和房价上涨并驾齐驱的时代,并不是夸奖炫耀的资本。
工作的过程当中,可以回过头来联系以前学校学的知识,很多时候都会有恍然大悟的感觉——当初接受了大量的“是什么”,现在要多多想想“为什么”。比如操作系统,课堂上面我们学了很多基本概念,知道啥叫进程,啥叫线程,知道它们的用途,似乎也知道有关它们的一切。如果自己要做嵌入式OS的移植开发,有时不得不深入分析内核代码,才知道进程和线程远比想象中的要复杂,光是描述它数据结构就一大堆;还有,不是有了进程这个概念,就一定要用多进程;有了线程,就一定要用多线程。还是一句话,知道什么时候该用什么,才用什么。
不断学习,不断实践,不断总结,会有很大的收获的。
第四,调试。
调试属于实践的一个环节,但是有必要拿来单独阐述。
做嵌入式,大概有20%的时间是开发,80%的时间是在调试。调试是一个经验活,做得越多,越容易发现问题的所在,越容易修复系统的 BUG。调试需要合适的软件硬件调试工具,同时也需要具备很强的分析推断能力。
充分利用工具,挖掘每一样工具的潜能,是嵌入式开发人员进行调试的基本功。现在的嵌入式系统一般都带有硬件的调试接口,比如JTAG接口。结合专业的调试工具,比如TRACE32,能够方便地在PC上对嵌入式设备中的程序进行跟踪调试,甚至对每条指令的运行都了如指掌。但是很多调试工具太昂贵,价格动不动成千上万。如果在大公司工作,一般都会使用此类工具,因为这样的公司不会在乎这点钱的。但是如果在小公司,或者你实在很牛,要单枪匹马去接一个小项目,从成本的考虑来看,就有可能不会用到它们。如果是那样的话,可能需要自己做一些调试工具,硬件上可能会自制一些简单的夹具或者数据线,软件上可能会自己写一些debugger程序,然后用串口或者USB等廉价连接设备来进行通讯。实在想省事,就简单接一条串口到PC,多用打印语句来跟踪程序运行情况吧。如果代码框架足够好,且打印用宏开关来控制,同样能够起到很好的调试效果。当然,条件允许的话,更好的调试手段会大大提高开发效率的。
调试是嵌入式开发的一个主要工作,也是打造高手的必经之路。调试好比侦探破案一样,看上去枯燥,实际很有意思。观察现象,分析推理,动用一切手段,从一堆貌似没有规律的数据中找出规律,最后定位出问题的所在。当解决了一个很难定位的BUG之后,会有很大的成就感。
调试会给人带来成就,但是很多时候也会让人烦恼。有时候,某些BUG,找了很长时间(比如一两个星期),还是没有发现产生它的原因。碰到这种情况,一定要心平气和,烦躁是解决不了问题的,想想连人家警察破案有时都要好几个月甚至更长的时间呢,我们也要耐心。不是所有问题都要马上解决,根据问题的重要性来判断它的优先级。如果有时间进度上的压力,很多问题都要想个办法绕过去,但是整体品质一定要保证。很多新手理论知识很好,但是却无法胜任工作的原因,就是缺乏调试经验——虽然大部分嵌入式系统原理都不复杂,但是只有在这个行业中,一步步走过来的人,才能完全把握它。
第五,交流。
现在这个社会,做开发的寂寞高手越来越少了。重视交流,是提高自己的一个必要因素。
当你刚开始参与到一项工作中的时候,很多方面都不熟练,肯定会或多或少地请教其他同事。大家的关系好了,他们也很愿意和你交流。有的时候,自己琢磨好几天不如问别人一句话,所以,工作中如果遇到有问题的地方,还是多开口问问。
网上交流也应受到重视。技术更新太快,很可能所从事的方面,在公司中也只有自己掌握得最多。遇到了问题也不是独孤求败,因为如今网络发达,网上的技术论坛太多了。找一些人气高的论坛,在上面提一些问题,经常情况下,很快就会有人回复。说不定时间久了,你就是在论坛上经常解答别人问题的“大虾”,还可以结交一些朋友。
第六,英语。
不管你喜欢不喜欢它,都得重视它。没有其他什么原因,只因为大部分技术文档都是英文的。这是现在获得技术资料的重要工具。所以,快速阅读英文文献的能力还是很重要的。如果你要进入外企,口语和听力也得同步提升。