作者:匿名用户
链接:https://www.zhihu.com/question/19593847/answer/719385507
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我以我这几年的所见所闻,对嵌入式行业进行总结,可能我的理解水平或者经历有限一些地方还无法照顾的到,但是希望对嵌入式感兴趣的人能够有所帮助,认清楚自己的定位和发展方向。
嵌入式这个东西,每个公司根据自己的业务需求都有自己的组成架构对于公司发展战略的重点也会独立出来一个部分用专人负责。这里基于嵌入式的层次结构,对其分类。大致可分为:
协议层(Protocal),硬件抽象层(HAL)\板级支持包(BSP),驱动(Driver),内核(Kernel),框架(Framework),软件开发包(SDK),应用软件开发(AE),中间层(MiddleWare),工具开发(Kits)
每个层都需要人来进行负责,里面涉及很多开发人员也有很多更细致的分支。大部分人一开始能接触到的是应用软件开发,在大学学习阶段和培训机构基本上都是拿嵌入式的应用软件进行入门,可嵌入式的范围并不局限于此,以上协议层、硬件抽象层、板级支持包的开发都属于嵌入式的范畴。
I. 协议层(Protocal)协议层的开发,举通俗的例子,通信领域的,4G,WiFi这样的基带,里面对于协议的支持,知识也不仅仅需要掌握嵌入式的知识,也需要有相关专业领域领域知识,如通信有各种的标准形势的协议,电源里面也有专用PMBus的这样的协议,这部分放在协议层需要专人开发。举个例子:如图所示。
II. 硬件抽象层(HAL)\ 板级支持包(BSP)硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。 为什么要引入硬件抽象层?
这是由嵌入式系统硬件多样性这样的特性才决定的,同一系列芯片又分为多种型号,为了解决这样的差异性所以引入硬件抽象层。
所以取嵌入式系统硬件多样性的共性部分利用标准的C语言实现,使用存储器进行种类和参数的配置,地址分配,外设控制的部分给用户编写代码。那么,这部分由用户编写的与操作系统之间提供接口和支持平台的代码成为硬件抽象层,提供这种代码的套件叫做板级支持包。
我相信,每一个嵌入式开发人员,无论是MSP430的开发还是STM32的开发,还是DSP开发,都会有从官网上下载板级支持包(BSP)配置到自己的工程里面,然后通过C语言包含头文件的方法对其进行调用,然后就可以编写自己需要的应用程序了。那么总有人来开发这个BSP包,所以这个职位值得考虑的。
可有一点,我国半导体水平落后,所以围绕半导体的生态也并不完善,对于板级支持包也只有这些处理器的制造商才会需要人开发,而这些也算是半导体驱动软件的核心部分,很少有中国人能参与进去,但一些制造商一些开发部分和社区共同完成的,这也算是个机会。
III. 驱动开发(Driver)驱动的开发分为有操作系统的与无操作系统的,很多人一开始都接触的是无操作系统的,作为嵌入式学习和开发人员我相信或多或少都接触过驱动开发,以最简单的例子,点亮板子上的一个LED,我们可以使用C语言调用板级支持包提供给我们的IO控制接口,完成LED的点亮,或者基于操作系统的调度,间接点亮LED。当然这是最简单的例子,复杂一点的,开发一款ADC芯片或者DAC芯片驱动,这都是驱动开发,驱动开发有驱动开发的规范和要求,完整的数据管理,完善的API接口,兼容性等等。
在非操作系统的世界, 驱动开发算是单刀直入的了,摸准时序和功能写好API做好数据管理和流向即可,最常见的外设基本上就是各种类型的传感器,输入输出设备,常常驱动和应用混在一个工程里面。可在操作系统的世界,驱动开发是一个比较大的话题,Linux的驱动开发自成体系,甚至有自己的社区,对开发Linux驱动的人来说,向下需要对开发的针对特定主机的硬件平台有所了解,向上需要掌握Linux内核的知识,包括内核的工作机制与系统组成,还涉及设备中的并发、多线程、互斥这些操作,因此,这个地方需要的也比较多,在大部分招聘职位上面可以看到。
IV. 内核(Kernel) / 框架 (Framework)之前和一个人谈,说Linux谈及内核,android都是框架,没做过我有点不理解。这边自己可以看看职位。
VI. 软件开发包(SDK)VII. 中间层(Middleware)VIII. 编译器机库(Kits)
|