嵌入式开发已经好几年,也算对这行有了点粗略的认识。可能很多新手朋友有疑问,到底要如何学习才能比较快地熟练掌握嵌入式开发呢?今天我们来抛砖引玉,看看高手的看法。

 

某位高人曾经说过,成为高手的路径只有一条,那就是:多做,多思考。用到嵌入式开发,可以理解为:多实践,多总结经验。我自己认为,如果要做什么行业,就一定要用全力把它做得最好。今天只是从大的层面上讲讲需要注意的一些方面,并不涉及具体的问题。且嵌入式开发也有很多具体的方面,某些工作可能和 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,找了很长时间(比如一两个星期),还是没有发现产生它的原因。碰到这种情况,一定要心平气和,烦躁是解决不了问题的,想想连人家警察破案有时都要好几个月甚至更长的时间呢,我们也要耐心。不是所有问题都要马上解决,根据问题的重要性来判断它的优先级。如果有时间进度上的压力,很多问题都要想个办法绕过去,但是整体品质一定要保证。很多新手理论知识很好,但是却无法胜任工作的原因,就是缺乏调试经验——虽然大部分嵌入式系统原理都不复杂,但是只有在这个行业中,一步步走过来的人,才能完全把握它。

 

多多交流

现在这个社会,做开发的寂寞高手越来越少了。重视交流,是提高自己的一个必要因素。

 

当你刚开始参与到一项工作中的时候,很多方面都不熟练,肯定会或多或少地请教其他同事。大家的关系好了,他们也很愿意和你交流。有的时候,自己琢磨好几天不如问别人一句话,所以,工作中如果遇到有问题的地方,还是多开口问问。

 

网上交流也应受到重视。技术更新太快,很可能所从事的方面,在公司中也只有自己掌握得最多。遇到了问题也不是独孤求败,因为如今网络发达,网上的技术论坛太多了。找一些人气高的论坛,在上面提一些问题,经常情况下,很快就会有人回复。说不定时间久了,你就是在论坛上经常解答别人问题的“大虾”,还可以结交一些朋友。

 

学会英语

不管你喜欢不喜欢它,都得重视它。没有其他什么原因,只因为大部分技术文档都是英文的。这是现在获得技术资料的重要工具。所以,快速阅读英文文献的能力还是很重要的。如果你要进入外企,口语和听力也得同步提升。