有同学来问,如何才能拿到一个好的分数,不过,我想还是总结下如何学习嵌入式系统课程更合理。网上关于如何学习嵌入式系统的许多帖子大都关注在整个嵌入式系统领域,但对我们的嵌入式系统课程而言,教学安排只有1个学期的时间,此时的学习策略一定要有所选择有所放弃,所以,今天我们重点来谈谈如果只有1个学期的时间,我们怎么来学嵌入式系统。我从计算机领域入嵌入式领域,始终感觉没有什么难度,主要是需要对特定厂家的芯片特性、特定的工具、特定的库需要学习,只要对计算机原理理解透彻,那嵌入式系统在很大程度上不过是一个特例而已,没什么特别的,所以这个领域入门并不难,但要精通,所需学习的知识和技能就会跨越到多个领域,还是需要花点力气的。我们也曾在十几年前拿到全国开源软件竞赛的金奖,当时所做的工作就是嵌入式系统开发,但即便如此,也不敢说精通嵌入式,但体会倒是不少。
对本专业(自动化)而言,嵌入式系统这门课排在二年级,定位就是“基本的计算机原理学习” + “初级的嵌入式系统Project开发能力”,之所以要把计算机原理的教学目标放在里面是因为在这之前我们除了学习C语言和数据结构并无一门课真正的讲述计算机原理,而一个学期的教学时间也决定了:1)偏向于有一定抽象高度的共通性原理(主要是计算机原理)学习,并完整的了解这个领域的知识体系,支离破碎的知识点学习看看论坛博客即可,但系统性的学习主要还是课堂教学的任务 2)以初步掌握嵌入式系统应用的开发为目标,即要有能力完成一个小项目,但是否能变成嵌入式系统开发的高手还要看造化,因为这需要学生更多的投入和必要的时间去理解消化,毕竟我们距离毕业还有2年半多,后面还有课程和实践能进行这方面的训练。这里的完成一个综合性project的目标还有另外一重含义,就是以项目所需和完成为目标,如果不需要,则可适当放弃,毕竟这个领域如果展开,内容还是相当庞杂,因此当时间有限时应该明确阶段性任务,以完成project所需为目标比较现实,不宜以掌握嵌入式系统开发的全部模块为目标。此外,我们作为自动化专业,嵌入式课程还有一个隐含的定位:加强软硬件交互方面的教学,即要理解系统底层,其实这也就是过去本专业《微机原理与接口技术》课程的教学目标,只不过我们现在是以Cortex-M3/STM32这种MCU级别的芯片代替80X86为教学案例而已,且无复杂的操作系统支持或仅有uCOS或FreeRTOS这种轻量级RTOS,而不是以X86家族或高端Cortex芯片 +Linux或Windows这种组合。也许有的同学说,我以后不要干嵌入式,但这门课还是要好好学的,因为本专业实际上是通过这门课来讲授计算机原理,只不过是以ARM的Cortex为范例而不是以过去的X86为范例进行教学和实验而已。
结合这些定位,给出如下建议
1)抓住几本书,系统的阅读和全面的了解这一领域,勿半途而非。
推荐的书包括咱们的课本、深入理解计算机系统。咱们的课本《嵌入式系统及其应用——基于Cortex-M3内核和STM32F系列微控制器的系统设计与开发》虽然在具体芯片的介绍上未必先进,但是对于共通性原理的陈述总结还是不错的,许多章节都是按照先原理、再实例分析的策略来写,有助于对原理的把握,比较适合作为课本,毕竟大学的教材不应是培训指导书。《深入理解计算机系统》是CMU的教材,我对此书评价甚高,作者亲自授课,在国内一些视频网站有流传(如bilibili),我强烈推荐大家去看一下CMU的这门课的视频,系统的补一下原理部分,原因是我们上课所讲,只是这个计算机领域基本概念和原理的一部分。
A Programmer's Perspective
http://csapp.cs.cmu.edu/public/perspective.html
http://csapp.cs.cmu.edu/
Computer Systems: A Programmer's Perspective, 3/E (CS:APP3e)
Randal E. Bryant and David R. O'Hallaron, Carnegie Mellon University
其它的一些参考资料对提高工程技能增进理解也很有帮助,如ucos的经典书《μC/OS, The Real-Time Kernel》,对剖析一个嵌入式操作系统很清晰,正因为它简单清晰并能结合代码讲述,所以对初学者反而比直接去啃操作系统类的专业书籍和课本更容易有收获。
还有一些书,没有明确推荐给大家,因为觉得推荐太多了不好,是《嵌入式软件设计基础——基于ARM Cortex-M3》, 机械工业出版社,也是国外翻译过来的,在讲软件方面十分清晰,也十分突出原理,非常适合初学者,如果说有什么不足,可能就是你看完之后,还需要花时间学习下厂家特有的库才能真的干活,但就思路原理的介绍,该书应属上乘。
2)网上有大量的教程和录像,它们往往贴合某一块具体的开发板并提供源代码工程和录像,在风格上更加接近于实战(我们的课堂教学更偏向原理抽象和总结)对这些培训特色明显的课程,有助于快速开发入门,弥补教师课堂教学偏重原理的不足。例如taobao上许多卖开发板的厂家都会提供视频,如正点原子。在1)中的原理性的书配合上这些面向实际开发的教程、指导书、视频就会很有帮助。
3)以迭代的方式做一个较大的project
从小开始,注意时刻保持可运行可工作状态,逐步扩展功能,从小变大,一个版本一个版本的迭代增强。这会增强信心以及对大程序的把握能力。做100个小实验也能增强对细节的理解,但煅炼不出来系统能力。做一个大的project,虽然会遗漏个别细节,不能覆盖全部要求的知识点,但会很锻炼人。退一步讲,大project完成后,能力训练达标,即使有个别局部没学过,也很有信心解决。
此外,要经常性的重构原有的project,思考我如何才能写得更好。有些同学非常惧怕改程序,唯恐改坏,这是不对的,一改就坏说明程序没写好,也说明开发人员对程序的把握不够。做开发的信心需要通过一次次小的进展来建立,而迭代的方式使得整个project时刻处于初学者可控的状态,有助于改进和查错。有的同学上来就写一堆程序,然后复杂到自己都控制不了,这是没必要的,甚至有的同学说,嵌入式的程序调起来太花时间,这都是没有经验、急于求成、不遵守软件工程原则的表现,刚才讲到好的程序不怕改,或者说修改好的程序不容易出错,现在就有第二个评价好程序的标准:易于测试。事实上,以迭代方式方式进行开发是一件很快乐的事:先找一块开发板,然后直接运行例子,并在例子的基础上逐步改进、扩展和实验,每一步都能有些小产出,是一件很有成就感的事情。
4)阅读他人优秀的代码
光自己闷头努力也不行,看看别人写的代码(当然应该是优秀的代码)也会很有收获,否则容易只陷在自己的思路里。
要打破自己的固有思维,一定需要引入外部的影响因素,强迫自己读别人代码就是一个强制的学习过程,当几种不同的风格、套路、设计方案在同一个大脑里激荡、比较,对什么好什么差就容易有更深的理解,并在此基础上形成自己的架构和规范。现代软件工程开发管理里面有一条很有效的提高代码质量的方式,就是code review,甚至诞生了一些专门的code review的工具,强迫自己读代码也就是一种code review的过程,不要担心水平够不够,最起码也可以看看别人写代码的风格是怎样的。
实际中需要注意的问题是不必刻意求全,不能以学高数的方式来对待计算机原理和嵌入式系统,这个领域,一个简单芯片的手册都动辄数百页上千页,还不计算大量的辅助文档,期望全部细节都清楚是不可能的,入行10年的老鸟也难谈精通所有,必要的时候可以“不求甚解”。特别是对有些问题,如果能借鉴已有开源代码或案例快速通过,及时推进到下一环节,对整体学习并无不利影响,相反,在下一环节中,说不定能反过来促进对当前问题的理解,人的理解和认识是螺旋式上升,希冀一步到位经常是不现实的,但切忌只往前推进而不回过头去探索和思考。
嵌入式系统课程学习的结果是原理的掌握和能力的达成,但这个比较虚,如果说的再实际一点、短视一点,就是看会不会写程序、能不能写程序、能不能写出好程序、能不能最后做出个能够demo和work的小系统。程序员之间的交流是非常简单的,就是拿代码来,空口无凭。所以有些同学问,怎么取得一个好成绩,就是拿出你的作品来,向老师证明你的能力是达成的。固然书面的考试占分比重很高,但能不能写好程序、能不能有所产出是非常本质的要求,教师在评判一个学生有没有学好这门课的时候,显然会深受这一目标的要求,即使是出题,也会琢磨怎么把能力考出来,比如有些简答题和设计题如果没有实际开发经验、没有动手走过一遍流程,可能是难以回答的,死记硬背的题目绝非这门课的主流考核形式。
来源:oschina
链接:https://my.oschina.net/u/2341333/blog/3217052