[toc]
上篇文章给大家介绍了嵌入式BSP工程师这个行业,简单来讲,作为一名嵌入式BSP工程师,既要和懂硬件工作原理,还要能编写对应的软件使之正常工作。其学习和开发难度就不言而喻了。那么,究竟学习哪些知识,怎么学习才能成为一名合格的嵌入式BSP工程师呢?
一、专业背景
我们首先从专业背景谈起。经过我的了解,从事嵌入式BSP开发的人员主要来源于计算机专业和电子信息专业。这两个专业是和嵌入式BSP最相关的专业了。当然也有一些同事是从其他专业转过来的(比如我,熟悉我的朋友知道我大学学的是物理专业,这相对来讲是比较偏的一个专业了)。所以,如果你是计算机或者电子信息专业的,你的基础已经足够好了。因为结合上篇文章我们知道,对于BSP工程师来讲,主要的工作就是使硬件及其上的操作系统稳定的工作,所以理解硬件原理、计算机原理和操作系统是最基本的要求,而这两个专业都会学习到像模拟电路,数字电路之类的硬件原理基础,计算机原理和一门高级语言也是这两个专业的必修课,这些已经基本构成了BSP工程师的必需的知识面。当然,不是这两个专业的同学也不用灰心丧气,毕竟大学里学的课程大家能掌握到说明程度都懂的,所以即便没有经历过系统的学习,只要兴趣足够,再加上一定的自制力,完全自学也不是不可能的。
二、推荐书籍
言归正传,我们结合上篇文章里BSP工程师必备的知识来介绍一下如何学习。
1. 计算机原理
前面我们谈到过,跑操作系统的嵌入式系统也属于典型的计算机系统,既然我们要把操作系统移植到计算机上,那么了解计算机运行原理的细节对于开发来讲是必不可少的。在处理一些疑难杂症时,这些知识尤其能凸显其作用来。这里推荐一本计算机原理的经典书籍——《Computer Systems: A Programmer’s Perspective》(中文译作:《深入理解计算机系统》),本书从这本书从程序员的视角系统的讲述了计算机程序的存储,运行的基本原理,并结合实例分析了如何优化计算机程序,第二部分结合计算机原理引出了操作系统中一些重要的概念,并对这些概念从程序运行的角度做了详细的阐述和诠释。
从2010年至今,个人已经反复研读了几遍,每次重读依然感觉有很多收获。因此,在本博客中,我专门新建了一个主题,从一个“程序员编写出来的C文件到编译生成可执行文件,最终到程序运行的过程”的角度来总结我对本书部分知识的理解和收获。本书从出版至今已经推出了三版,我自己收藏了第二版英文版和最新版第三版高清扫描的中文电子书(文件大小501M),有需要的同学可以在我的微信公众号(请扫描右侧二维码或者打开微信搜索“落木萧萧技术论坛”)回复“csapp”获取下载地址。
2. 基本的Linux操作
多数嵌入式开发都是在Linux操作环境进行开发的,因为在其上存在很多优秀的开源开发工具,可以方便快速的搭建编译环境,有很方便的debug工具可供使用。很多同学可能压根就没有接触过Linux系统,开机之后一片茫然,甚至连文件都找不知道。这并不是问题,毕竟它的设计思想和我们熟知的Windows完全不一样,对于程序员来讲,当你适应了Linux系统之后,你可能甚至都不愿意再用回Windows。关于学习Linux基础操作的书,我推荐《鸟哥的linux私房菜》,里面由浅入深的介绍了Linux系统,不仅涉及Linux的基础操作,还包括如何重装Linux系统,Linux的文件管理,shell脚本等知识,其实这本书主要是面向Linux系统管理员的,但是它前面13章的内容对于入门Linux系统来讲是一个绝佳之选。获取电子书的方法:在我的微信公众号回复“vbird”。
3. C语言基础
前面我们说过BSP工程师主要是和底层硬件、系统打交道,所以C语言是最主要的编程语言。学习C语言,我强烈推荐“C语言之父”Dennis Ritchie的著作——《The C Programming Language》。这本书仅仅有200多页,去掉附录才100多页,但是字字珠玑,甚至连文中的示例程序都直接是libc库里面的函数,比国内某著名C教材里面的计算器例子不知要经典多少倍!获取电子书的方法:在我的微信公众号回复“clg”。
4. Linux操作系统
这里所说的Linux系统和上面的Linux操作完全不一回事。上面讲的Linux操作指的是你的工作电脑是linux系统,你需要在上面下载、修改、编译和调试代码,而这里的Linux系统指的是你的目标开发板上跑的Linux系统。如果是BSP工程师,你需要了解系统从硬件上电开始,到Linux系统初始化完成,init进程起来的整个流程,当然这个涉及的知识非常之多,所以我建议新手从Linux驱动程序开始入手。所谓的驱动程序,简单来讲就是Linux系统中的一些模块,这些模块有统一的框架,开发人员只需要在其中填入控制对应硬件的C程序代码就可以了。通过学习Linux驱动,逐步了解驱动程序的框架,并发访问的原理,Linux分离分层的思想,这样在扩展到Linux系统的其他模块、甚至整个Linux系统的学习时就非常容易了。对于Linux设备驱动的修恶习,我首推《Linux device driver》(中文译做《Linux设备驱动》),这本书大部分例子是取一小段内存来模拟一个Linux设备,然后实现了对应的字符设备驱动,并以此为例阐述了设备驱动中常见的知识点。获取电子书的方法:在我的微信公众号回复“ldd”。
在掌握了Linux设备驱动之后,这时对Linux操作系统应该有一个初步的认识和轮廓了,后面就应该要系统的认识一下Linux了。当然,这个时候如果你有强大的毅力,那么直接去读Linux源码也是一个选择。但是,我认为更重要的是结合之前我们从驱动程序中提取出来的Linux思想,从整体上认识一下Linux系统,这就不得不谈到又一本经典的书籍了——《Linux Kernel Development》(中文译做《Linux内核设计与实现》),这本书省略了大量的细节,通篇很少列举大段的代码,而是提纲挈领的阐述了linux设计和实现的原理。获取电子书的方法:在我的微信公众号回复“lkd”。
从整体上掌握了原理之后,我们还缺少Linux实现的具体细节,《Professional Linux Kernel Architecture》(中文译做《深入Linux内核架构》)是一个不错的选择,单从页数上就能体现出来。原版1337页,中文版1055页。我目前也正在看这本书,所以更多的阅读体会,稍后我会以专栏的形式写出,大家也可以一起阅读参与讨论。获取电子书的方法:在我的微信公众号回复“plka”。
三、阅读建议
- 在阅读上述书籍的时候,建议务必坐在电脑前面,书上提到的任何操作,都照着做一遍,看看是否和书上的结果一致,这样不仅可以深化理解,还可以加深印象。
-
上面的书籍除了《鸟哥的linux私房菜》之外,基本都是英文书籍,而且我也给出了中文版,如果有能力,建议大家阅读原版书籍,因为很多时候,中文版并没有准确的翻译出作者的意思。如果实在困难,可以阅读中文版,但建议在遇到疑问或者难以理解的时候,及时对照原版书籍,或许你会发现你理解不了并非你的问题,而是翻译的问题。
-
上述给出的书籍都是经典的书籍,如果某些知识点理解不了,没有关系,先跳过去,过段时间重新再读,你会发现很多问题自然而然就明白了。学习的过程也是一个螺旋上升的过程,经典书籍需要反复阅读咀嚼,才能真正掌握其精髓。
注:以上书籍电子版仅供学习交流使用,请勿用于商业用途,如有侵权,请联系我,我会立刻删除。
另外,关于以上书籍我都购买正版,也推荐大家买正版来学习收藏,尤其是作为程序员,尊重比别人的劳动成果支持正版,也就是尊重自己。
谢谢,学习中~~
非常感谢作者分享,正在准备系统的学习嵌入式,你介绍的书籍都很经典,学习模式也跟我不谋而合,正准备去借这几本英文原著。
您好老师,因为我算是嵌入式新手入门,还有大概半个月要进一个自动驾驶底盘安全控制系统的项目,具体可能是要基于控制系统已有的一些硬件接口实现写一些程序(具体任务还不清楚)。因为我只做过一些基于arduino和树莓派的小机器人,有C/C++的编程基础,本科学过操作系统,编译原理,汇编接口等这些基础课程,但是对于嵌入式这块尤其是linux 编程毫无经验。今天我去图书馆借了computer system 和 linux device driver 这两本书,都看了第一章,对于每本书大概的脉络和之间的联系有一些了解,但是感觉短时间内想啃完这两本书,并且跟实际项目结合起来还是比较困难。 老师有没有什么阅读顺序推荐呢? 比如哪本书的哪几章对实际操作理解帮助较大理解起来较容易,可以优先看的。 更底层的比如CS这本里面优化程序性能这种暂时可以先放一放。 或者有没有稍微薄一些的书籍推荐呢,可以给整个流程有一个简单的梳理? 这样对于我这样的新手,想要短时间内有个宏观的把控可能比较有帮助。请老师指点迷津,非常感谢!!
感谢你对我的博客的支持!我理解你是想对即将参加的项目做一些准备。对此我有以下几点想法,你可以参考一下:
1. 首先,你需要搞清楚将要参与的项目细节。比如:
1)项目所使用的平台是什么?是否跑操作系统?
2)项目所实现的具体功能是什么?
3)你在项目中具体负责哪个模块?
4)根据你负责的模块,搞清楚你负责的和别人负责的具体区别,主要是使用的技术的区别。
5)两周时间还是比较短的,你需要根据上述的分析,结合自身的情况,有针对性的去熟悉一些东西。
2. 其次,我看的出来你对这个项目有些担心,其实你完全不需要担心。因为大部分人都是在工作中成长起来的,边工作边学习其实是大多是人的常态。而且,既然要你参加这个项目,我相信leader肯定也是对你的技术和能力是认可的。
3. 这两本书中CSAPP是一本夯实计算机基础的书,对实际项目的作用很难起到立竿见影的效果。Linux device driver这本书是做linux驱动比较经典的书,如果你将要负责的模块是基于linux的某个设备驱动,而之前又没有类似经验的话,那么可以详细看一下这本书的第2-4章,并且结合书中例子,边看边实践,由此你可以对linux设备驱动的工作模型有一个初步的认识。
以上是我的一些看法,总之,由于只有两周时间,你需要再了解一些项目的细节,做一些针对性的学习。放松心态,在项目实施过程中边工作,边学习。有任何问题包括技术问题,欢迎随时交流!
恩那!感谢博主细致的回答,现在已知项目所用的操作系统基于linux,其他细节因为还没进组,leader没有给我透漏太多。 所以这段时间我准备先把device driver2-4章详细看一下,剩下的就等开始了边做边学。因为这算是我的第一个项目,没有经验确实很紧张!不过很开心能有这个机会在项目中成长,也谢谢您给我的鼓励!
有问题我回积极交流讨论的!感激!
非常感谢!急需补充操作系统方面的知识。