摘要:BSP代表板级支持包(Board Support Package),是嵌入式系统开发中关键的组成部分。BSP工程师负责开发、调试和维护BSP,确保嵌入式设备能够正常运行。那么什么是BSP?什么是BSP工程师?如何成为一名出色的嵌入式BSP工程师?
1. 嵌入式系统
要了解嵌入式软件工程师,让我们从嵌入式系统(嵌入式设备)开始。根据维基百科的定义:
“嵌入式系统(Embedded System)是安装在机械或电气系统中,具有特定功能和实时计算能力的计算机系统。”
简而言之,嵌入式系统是具有特定功能的计算机系统。我们身边有许多嵌入式设备,例如智能手机、数码相机等消费类电子设备,还有像智能音箱、智能电视、扫地机器人这样的智能家居设备,以及汽车防抱死系统、各种医疗成像设备等。嵌入式设备在各行各业都有广泛应用,尤其是在智能化时代,许多非智能设备也正在逐渐被嵌入式设备取代,如智能门锁。
2. 嵌入式工程师
随着嵌入式设备应用的扩大,对相关人才的需求也越来越大。其中最主要的人才就是嵌入式工程师,他们分为嵌入式硬件工程师和嵌入式软件工程师两类。
-
嵌入式硬件工程师负责设计嵌入式系统的硬件原理图,并绘制PCB图纸,同时与嵌入式软件工程师协作进行系统调试。 -
嵌入式软件工程师可根据系统软件分类为两类:BSP工程师和嵌入式应用软件工程师。嵌入式应用软件工程师主要负责开发基于嵌入式系统的应用软件,类似于Windows平台上的QQ、Word等。而作为BSP工程师的我,我们将重点讨论BSP工程师。
BSP工程师全称为板级支持包工程师,是负责开发、调试和维护BSP的专业人才。所谓的BSP是一套软件组件,提供硬件与软件之间的接口,以确保嵌入式设备正常运行。一个优秀的嵌入式BSP工程师需要熟悉硬件和软件的交互原理,具备扎实的编程技能和硬件调试能力。
3. 成为优秀的嵌入式BSP工程师
要成为一名出色的嵌入式BSP工程师,需要掌握以下关键技能和知识:
-
深入理解计算机体系结构和硬件原理,熟悉各种接口和总线标准。 -
熟悉操作系统的内核原理和驱动程序开发,如Linux和RTOS。 -
熟练掌握C/C++等编程语言,并具备良好的编程风格和调试能力。 -
熟悉常见外设和接口协议,如UART、SPI、I2C、
![image-20240104195402453](https://lxlinux.superbed.verylink.top/item/65969c8d871b83018aad8633.png)
嵌入式工程师分类
三、BSP工程师
BSP,全称Board Support Package,汉语意思即板级支持包。BSP工程师,顾名思义就是负责板级支持包的开发、调试和维护工作。那么什么是板级支持包呢?前面我们讲过,嵌入式硬件工程师负责设计硬件,画出PCB图,工厂会根据PCB图生产出对应的电路板。一个嵌入式系统光有电路板是不够的,还要有对应的软件支持,软件开发的前提是首先使板子正常稳定的工作,然后再在其上编写对应的应用软件以实现其特有的功能。其中使板子正常稳定的工作的代码就属于板级支持包。
那么BSP工程师的具体工作有哪些呢?
我们首先从嵌入式设备谈起,前面我们谈到了很多的嵌入式设备,从系统角度来讲这些设备有些是跑操作系统的,有些没有跑。对于不跑操作系统的设备来讲,其功能相对简单一点,使用的主控芯片一般也比较简单,比如风靡一时的51系列单片机、stm系列的单片机。对于这些简单系统来讲,它对软件开发人员要求相对比较低,当然也就没有我前面所说的分工那么详细,有时候甚至从画板、点亮、开发都是由一个人来完成的。对于跑操作系统来讲的设备,就不一样了。一般来讲,跑操作系统的设备其软件开发分三个阶段:
1. 点亮板子
第一批板子出厂时是不包含任何软件的。BSP工程师需要结合硬件原理图修改从芯片厂商拿到的参考代码,调试板子,使板子上的操作系统能够正常稳定工作,从而提供一个稳定的开发调试环境,这个过程叫做点亮板子,行话叫做Bringup
。这属于BSP工程师最具有价值含量的工作之一,因为它对BSP工程师所掌握的知识的广度和深度都有一定要求。其中会涉及到计算机原理、操作系统,处理器架构等,还包括硬件方面的一些知识。综合起来其最核心的工作就是对内核的移植、裁剪。
2. 使能板子上所有设备
上个阶段中,板子的CPU和基本的器件已经能正常工作,这个阶段中将使能所有的外设,并为后面要开发的应用程序提供对应的软件控制接口。这个过程的实质是对应的操作系统下驱动开发的过程,需要掌握硬件工作的原理,操作系统的相关知识。
3. 为板子开发应用程序
如前文所述,嵌入式系统是一个具有专一功能的系统,其上所有的硬件,软件都应该为这一功能服务。第二个阶段结束的时候,板子上所有的设备都已经可以正常使用了。这个阶段的任务就是开发应用程序来实现某种特定的功能,应用程序中会使用第二阶段提供的软件接口控制板子上的设备来完成这一功能。
四、BSP工程师应具备的能力
上述前两个阶段属于BSP开发的内容,第三个阶段属于嵌入式应用软件开发的过程。综上所述,BSP工程师主要应该具备的能力主要有:
-
掌握计算机原理方面的知识; -
掌握操作系统的相关知识,深入研究某种操作系统,目前来讲,研究linux操作系统应该是大部分人的选择; -
基本的linux(开发环境)操作 -
精湛的C语言功底和一定的C++/汇编的知识。 -
掌握一定的硬件和电路原理方面的知识; -
熟悉常见的接口协议,如I2C, SPI, UART, USB等。
当然作为一个软件开发人员也必须掌握一些通用的软件,比如:
-
代码管理软件,常见的如git等; -
代码阅读软件,这个就因个人喜好而不同了,比如:opengrok,source insight,vim下ctags/cscope插件组合等。
简单来讲,作为一名嵌入式BSP工程师,既要和懂硬件工作原理,还要能编写对应的软件使之正常工作。其学习和开发难度就不言而喻了。那么,究竟学习哪些知识,怎么学习才能成为一名合格的嵌入式BSP工程师呢?
简单来讲,作为一名嵌入式BSP工程师,既要和懂硬件工作原理,还要能编写对应的软件使之正常工作。其学习和开发难度就不言而喻了。那么,究竟学习哪些知识,怎么学习才能成为一名合格的嵌入式BSP工程师呢?
五、专业背景
我们首先从专业背景谈起。经过我的了解,从事嵌入式BSP开发的人员主要来源于计算机专业和电子信息专业。这两个专业是和嵌入式BSP最相关的专业了。当然也有一些同事是从其他专业转过来的(比如我,熟悉我的朋友知道我大学学的是物理专业,这相对来讲是比较偏的一个专业了)。所以,如果你是计算机或者电子信息专业的,你的基础已经足够好了。因为结合上篇文章我们知道,对于BSP工程师来讲,主要的工作就是使硬件及其上的操作系统稳定的工作,所以理解硬件原理、计算机原理和操作系统是最基本的要求,而这两个专业都会学习到像模拟电路,数字电路之类的硬件原理基础,计算机原理和一门高级语言也是这两个专业的必修课,这些已经基本构成了BSP工程师的必需的知识面。当然,不是这两个专业的同学也不用灰心丧气,毕竟大学里学的课程大家能掌握到说明程度都懂的,所以即便没有经历过系统的学习,只要兴趣足够,再加上一定的自制力,完全自学也不是不可能的。
六、推荐书籍
言归正传,我们结合上篇文章里BSP工程师必备的知识来介绍一下如何学习。
1. 计算机原理
前面我们谈到过,跑操作系统的嵌入式系统也属于典型的计算机系统,既然我们要把操作系统移植到计算机上,那么了解计算机运行原理的细节对于开发来讲是必不可少的。在处理一些疑难杂症时,这些知识尤其能凸显其作用来。这里推荐一本计算机原理的经典书籍——《Computer Systems: A Programmer’s Perspective》(中文译作:《深入理解计算机系统》),本书从这本书从程序员的视角系统的讲述了计算机程序的存储,运行的基本原理,并结合实例分析了如何优化计算机程序,第二部分结合计算机原理引出了操作系统中一些重要的概念,并对这些概念从程序运行的角度做了详细的阐述和诠释。
从2010年至今,个人已经反复研读了几遍,每次重读依然感觉有很多收获。因此,在本博客中,我专门新建了一个主题,从一个“程序员编写出来的C文件到编译生成可执行文件,最终到程序运行的过程”的角度来总结我对本书部分知识的理解和收获。本书从出版至今已经推出了三版,我自己收藏了第二版英文版和最新版第三版高清扫描的中文电子书(文件大小501M)。
2. 基本的Linux操作
多数嵌入式开发都是在Linux操作环境进行开发的,因为在其上存在很多优秀的开源开发工具,可以方便快速的搭建编译环境,有很方便的debug工具可供使用。很多同学可能压根就没有接触过Linux系统,开机之后一片茫然,甚至连文件都找不知道。这并不是问题,毕竟它的设计思想和我们熟知的Windows完全不一样,对于程序员来讲,当你适应了Linux系统之后,你可能甚至都不愿意再用回Windows。关于学习Linux基础操作的书,我推荐《鸟哥的linux私房菜》,里面由浅入深的介绍了Linux系统,不仅涉及Linux的基础操作,还包括如何重装Linux系统,Linux的文件管理,shell脚本等知识,其实这本书主要是面向Linux系统管理员的,但是它前面13章的内容对于入门Linux系统来讲是一个绝佳之选。
3. C语言基础
前面我们说过BSP工程师主要是和底层硬件、系统打交道,所以C语言是最主要的编程语言。学习C语言,我强烈推荐“C语言之父”Dennis Ritchie的著作——《The C Programming Language》。这本书仅仅有200多页,去掉附录才100多页,但是字字珠玑,甚至连文中的示例程序都直接是libc库里面的函数,比国内某著名C教材里面的计算器例子不知要经典多少倍!
4. Linux操作系统
这里所说的Linux系统和上面的Linux操作完全不一回事。上面讲的Linux操作指的是你的工作电脑是linux系统,你需要在上面下载、修改、编译和调试代码,而这里的Linux系统指的是你的目标开发板上跑的Linux系统。如果是BSP工程师,你需要了解系统从硬件上电开始,到Linux系统初始化完成,init进程起来的整个流程,当然这个涉及的知识非常之多,所以我建议新手从Linux驱动程序开始入手。所谓的驱动程序,简单来讲就是Linux系统中的一些模块,这些模块有统一的框架,开发人员只需要在其中填入控制对应硬件的C程序代码就可以了。通过学习Linux驱动,逐步了解驱动程序的框架,并发访问的原理,Linux分离分层的思想,这样在扩展到Linux系统的其他模块、甚至整个Linux系统的学习时就非常容易了。对于Linux设备驱动的修恶习,我首推《Linux device driver》(中文译做《Linux设备驱动》),这本书大部分例子是取一小段内存来模拟一个Linux设备,然后实现了对应的字符设备驱动,并以此为例阐述了设备驱动中常见的知识点。
在掌握了Linux设备驱动之后,这时对Linux操作系统应该有一个初步的认识和轮廓了,后面就应该要系统的认识一下Linux了。当然,这个时候如果你有强大的毅力,那么直接去读Linux源码也是一个选择。但是,我认为更重要的是结合之前我们从驱动程序中提取出来的Linux思想,从整体上认识一下Linux系统,这就不得不谈到又一本经典的书籍了——《Linux Kernel Development》(中文译做《Linux内核设计与实现》),这本书省略了大量的细节,通篇很少列举大段的代码,而是提纲挈领的阐述了linux设计和实现的原理。
从整体上掌握了原理之后,我们还缺少Linux实现的具体细节,《Professional Linux Kernel Architecture》(中文译做《深入Linux内核架构》)是一个不错的选择,单从页数上就能体现出来。原版1337页,中文版1055页。
七、阅读建议
-
在阅读上述书籍的时候,建议务必坐在电脑前面,书上提到的任何操作,都照着做一遍,看看是否和书上的结果一致,这样不仅可以深化理解,还可以加深印象。 -
上面的书籍除了《鸟哥的linux私房菜》之外,基本都是英文书籍,而且我也给出了中文版,如果有能力,建议大家阅读原版书籍,因为很多时候,中文版并没有准确的翻译出作者的意思。如果实在困难,可以阅读中文版,但建议在遇到疑问或者难以理解的时候,及时对照原版书籍,或许你会发现你理解不了并非你的问题,而是翻译的问题。 -
上述给出的书籍都是经典的书籍,如果某些知识点理解不了,没有关系,先跳过去,过段时间重新再读,你会发现很多问题自然而然就明白了。学习的过程也是一个螺旋上升的过程,经典书籍需要反复阅读咀嚼,才能真正掌握其精髓。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !
![137e00002230ad9f26e78-265x300](https://lxlinux.superbed.verylink.top/item/65969c8d871b83018aad862f.png)