嵌入式底层软件开发学习系列之三开发与就业方向

来源:互联网 发布:windows金色锁头网络 编辑:程序博客网 时间:2024/04/28 14:48

本节首先按开发的层次划分大类, 对于每一层将分析其主要工作内容。

本节的第2部分将从产品的领域来介绍嵌入式的热门应用领域。


1. 开发层次

(1) 体系结构层(CPU层)

  对于普通的嵌入式产品开发公司, 该层的主要工作目的是选择哪种CPU(Arm, mips, 等) 或 Soc来满足自己的产品需求(成本, 性能,和维护成本). 当芯片一旦选定,可以从芯片公司获得BSP 包,因而只需少量工作人员从事整合与调试工作即可。  其招聘要求一般是了解某种cpu体系结构, 如 "熟悉ARM体系结构;熟悉高通芯片".

  对于芯片公司也分为分为两类,一类是如Intel, ARM. 要负责新的芯片产品和功能开发, 因此配套的软件工作包含新产品的验证, 实现这些新功能对应的体系结构代码(如Linux kernel/Arch/ 目录下的代码).一个简单的例子就是增加cpu64位支持.  另一种较小规模芯片公司则通过购买Arm IP或采用开源cpu来定制自己的嵌入式处理器,当有自己的定义的特性或功能时,也许要修改OS体系结构相关代码; 但工作量与前一类比较起来较少。这类公司往往更加注重基础能力,如:

a. Familiarity with one or more CPU instruction sets. 需要熟悉一种或多种CPU指令集 

b.Detailed understanding of computer architecture. 需要较深入了解计算机体系结构

c. Familiarity with ARM architectures. 熟悉ARM体系结构

有些甚至要求软件工程师了解 Verilog and RTL verification flows, 这样才能更好的和硬件design工程师协同工作。



(2) 板级

  光有了芯片,系统也是无法运行的。需要通过各种电子元器件芯片连接起来。 为此就涉及到电路板的设计与制作等, 但某些规模较小的公司可能需要既懂电路制作又懂软件开发的工程师(但这样的岗位往往软件部分复杂度较低, 笔者认为更适合懂一些软件开发的电子工程师),较大一些的公司会有专门的部分负责电路板设计 。  因此笔者认为作为嵌入式软件工程师的基本要求是能读懂原理图, 能使用常见的示波器就可以了, 因为软件工程师的精力应放在复杂的软件系统上,

   对于软件人员而言,工作主要包含如下几部分:

  (1) Boot Loader的实现或定制, UBOOT是使用较广的一种boot loader

  (2) 协助硬件工程师调试板级硬件, 如通过测试程序测试板上个模块是否能正常工作。 如测试手机各个模块(camera, flash, wifi)等模块是否能正常工作(需要设计测试程序与测试用例)。

        当出现问题时需要具备定位是哪个模块有问题, 是由于电路板的问题, 还是芯片或驱动本身存在问题; 并与相关其他开发人员沟通。


(3) 驱动层

其主要任务是编写与调试驱动程序, 驱动层包含四个部分: 

a. 驱动模型: 对于不同操作系统有不同的驱动框架结构,为此对于驱动的编写者这是必须熟悉的。 对操作系统理解得越深刻,学习与掌握这一部分就越容易。某些简单的嵌入式产品可能连操作系统都没使用,这时驱动模型的设计就完全依赖与开发者了;好的设计有助于软件重用与维护。


b. 硬件spec与datasheet, 这对于开发驱动是最为重要的,他是编写代码与调试的依据。 驱动代码本身往往由芯片公司给出示例实现或直接提供代码, 对一些做应用的公司而言只需要移植这些代码到不同操作系统和平台就可以了, 发现问题可以从芯片公司获得帮助, 因此对规范的掌握要求相对较低。 对于芯片公司的驱动开发者,则需完全理解规范(或直接参与spec指定)。


c.  驱动的验证: 包含验证软件平台的搭建, 测试程序的实现部署等工作。


另外, 对于某些嵌入式产品,光有驱动还是不够的, 还需要算法, 如扫地机器人。 本节第二部分将分析相关领域知识。

          

(4) 内核层

目前国内这方面相对落后(缺乏直接内核开发岗位),但相关工作还是有一些的,主要工作在:

a. 针对自身嵌入式特点: 优化内核参数, 或优化部分代码 (如linux bootup 提速, IO 优化等)

b.  某些公司拥有自己的(或深度定制的) 嵌入式系统, 需要维护与升级它们。

c. 参与开源操作系统内核的维护

下面是一个高级内核职位的要求:

深入理解Linux内核,精通内存、调度、网络、文件系统、调试调测等模块之一
有内核社区补丁提交经验


(5) 硬件抽象层

不同厂商的硬件,有时接口各异, 硬件抽象层为系统层提供了访问硬件的统一接口。 为此不同设备(芯片)厂商针对自身硬件需要设计硬件抽象层到驱动层的接口(某些已经标准化的硬件,厂商不需要实现). 


(6) 系统(框架)层

a.  开发Linux操作系统发行版, Linux 发行版本很多, 国内也有一些发行版本, 如中标麒麟。

b. 为增加自身应用,需要突破原有框架的限制或直接增强原有框架; Andorid的定制中会有一些这样的岗位。


(7) 应用层: 该层不在本系列文章讨论范围之内


下面将从嵌入式领域的角度来分析

2.嵌入式领域 

(1) 网络与通讯类

网卡, 路由器, 光纤通讯, wifi  4G 设备等. 从事该领域需要比较深入了解计算机网络和通讯相关知识。

 下面是一个WIFI芯片公司的招聘要求:

a. 熟悉WIFI相关协议标准和性能指标(802.11a/b/g/n/ac无线网络协议等)  (需要掌握相关协议)

b. 具有WIFI(hostapd /wpa_supplicant)开发经验             (需要掌握上层框架软件的开发与调试方法)

c.熟悉以下技术中的一种或多种:DHCP, HTTP, UDP, ETHERNET, VLAN, TCP/IP  (熟悉常用的网络协议)


(2) 智能传感器与人机交互设备

鼠标,键盘;触摸屏,陀螺仪等等。 复杂的一些设备需要数字信号处理相关知识;  


(3) 音视频与图像处理类

一类为基本设备:如声卡,显卡(GPU), 编解码器等;另一类 产品, 如安防监控类;

 需要掌握多媒体相关知识(如多媒体编解码, 计算机2D/3D图形学), 了解openCV, OpenGL框架等。 


(4) 存储设备类

Flash, 机械硬盘,固态硬盘, 磁盘阵列等。 对于存储设备, 缓存的设计与使用十分重要, 其次就是文件系统, 备份与容灾相关知识。


(5) 总线与控制器类

各种总线控制器, 如USB Host controller(master), 比较简单的有I2C, SPI等总线。 


通过上面分析我们发现, 无论哪一领域学习基本规律是:

(1) 相关协议 (2) 目前已有的框架或软件  (3) 最好对相关算法有一定了解





0 0
原创粉丝点击