公司嵌入式开发的日常

504 阅读9分钟

什么是嵌入式系统

日常工作中,经常听到“嵌入式系统”这个词,那么到底什么是嵌入式系统呢?

IEEE(美国电气和电子工程师协会)对嵌入式系统的定义为:用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统。

英国电器工程师协会的定义是:一种完全嵌入受控器件内部,为特定应用而设计的专用计算机系统。

维基百科上对嵌入式系统词条的定义则是:一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。嵌入式系统常被用于高效控制许多常见设备,被嵌入的系统通常是包含数字硬件和机械部件的完整设备,例如汽车的防锁死刹车系统。

由此可见,其实对于嵌入式系统,并没有一个严格的定义,国内普遍认同的一种定义是:以应用为中心,以计算机技术为基础,软硬件可剪裁,适应应用系统对功能、成本、体积、可靠性、功耗严格要求的专用计算机系统。

通常来说,一个典型的嵌入式系统架构如下图所示:

图片

图1 一个典型的嵌入式系统示意图

嵌入式系统既包含软件,也包含硬件;软件用来控制硬件,硬件用来支撑软件的运行。我们通常将嵌入式系统包含的所有硬件(CPU、RAM、ROM、定时器和 I/O 设备等)从整体上称为微处理器或者微控制器。

还是有点抽象对不对,我们来举几个日常生活中的例子:

1.电视遥控器

不管是传统的红外遥控器,还是现代的蓝牙或其他无线遥控器,都是一个非常典型的嵌入式系统,包含完整的输入输出、处理器和通信。

图2 某米蓝牙遥控器

图3 某米蓝牙遥控器电路板

2.空调遥控器

相比电视遥控器,空调遥控器则更近一步,大多数空调遥控器都会有一块小液晶屏,用来显示空调的设置信息和运行状态。

图片

图4 空调遥控器

3.智能手表

现在市场上的各种智能手表,也都是典型的嵌入式系统,其输入不仅有物理按键,还包括触摸屏、光电传感器、加速度计、陀螺仪等,输入的数据丰富了,智能手表的功能自然也就丰富了很多。现在头部厂商的智能手表甚至支持心电测量,还跟医疗机构合作建立大数据平台,能够分析和预测个体的身体健康状况。

其实老式的电子手表,虽然没那么多功能,但也是一个典型的嵌入式系统。

图片

图5 智能手表

4.手机

手机也是典型的嵌入式系统,尤其是在以前的功能机时代,手机、对讲机、寻呼机等都是典型的嵌入式系统,而到了智能机时代,通常认为依然是嵌入式系统,但现代智能手机的复杂程度已经大幅度提高,算力也非常强大,通用性甚至可以媲美PC,可以看作是由若干嵌入式系统组成的复杂系统。

图片

图6 功能机主板

图片

图7 智能机主板

嵌入式系统开发

了解了什么是嵌入式系统之后,基本就知道了嵌入式系统开发主要做什么。前面有提到,嵌入式系统通常既有硬件,又有软件,所以嵌入式系统开发工作一般分为嵌入式系统硬件开发和嵌入式系统软件开发。

一个典型的嵌入式系统开发流程是这样的:

图片

图8 嵌入式系统开发典型流程

硬件是软件运行的基础,软件是硬件实现功能的载体,这也是嵌入式系统有别于其他电子电气系统的重要特征,有很多电路系统是不需要软件就能实现功能的,最简单的比如以前家里的电灯开关,复杂一点比如现在的很多模拟传感器,还有一些纯模拟系统,也是不用处理器不用软件就可以实现其功能的。我们可以看到,现代的嵌入式系统,通常是一个模数混合系统。这里再简单说一下模拟系统和数字系统的概念,顾名思义,模拟系统是以模拟信号为主要处理对象的系统,数字系统是以数字信号为主要处理对象的系统。那么什么是模拟信号,什么是数字信号呢?模拟信号是指用连续变化的物理量所表达的信息,如温度、湿度、压力、长度、电流、电压等等,我们通常又把模拟信号称为连续信号,它在一定的时间范围内可以有无限多个不同的取值。而数字信号是指在取值上是离散的、不连续的信号。实际上,现实世界中的几乎所有信号都是模拟信号(目前已知的有量子力学领域会涉及到真正的离散信号,即便如此,宏观表现上依然是连续的),但是与此同时,几乎所有的系统又都是数字系统,几乎所有的模拟信号都是经过量化处理的。可以说,只要精度有限,所有信号都是数字,认知是由观测所限制的。我们测量和分析信号其实是为了表征和处理信息,但是当测量精度有限时,不同信号就会当作相同信号,举个例子,有一个信号源输出4.16V和4.17V两路信号,我们用一个分辨率0.1V的数字电压表去测量,那这两路信号表显读数都是4.2V;那我们用模拟电压表去测量还有没有这个问题呢?没错,模拟电压表可以表现出这两路信号的区别,问题在于读数的人是否可以,对着表盘读数,实际上就是一个量化的过程。有人说数字信号就是10100101这样的序列,这种说法是片面的,是因为现在绝大多数数字处理系统都采用二进制给大家造成了错觉。

经典冷笑话:

甲:世界上只有10种人,一种懂二进制,一种不懂。

乙:世界上有10种人,一种懂三进制,一种不懂,还有一种以为它是二进制。

丙:以为它是二进制的还是不懂嘛!世界上还是只有10种人。

好了,现在言归正传,我们具体说一说嵌入式软硬件的日常工作。

嵌入式硬件

嵌入式硬件工程师最主要的工作就是设计、调试、验证各种电路板,比如我们的控制器主板。

图片

图9 控制器主板T面

图10 控制器主板B面

一个典型的嵌入式硬件开发流程是这样的:

图片

图11 嵌入式硬件典型开发流程

看到这里,大家应该能想到图9的电路板处在哪个环节了吧。

嵌入式硬件工程师的日常是这样的:

图片

图12 入门级

图片

图13 初级

图片

图14 中级(好奇什么是面包板的小伙伴可以查一查)

图片

图15 高级

图16 发烧偶像(一看就是摆拍,对吧?)

图片

图17 大神

图片

图18 大神必须多来两张

图19 大神也烦恼

图片

图20 大神的大局观

图21 空旷如脑袋(应该符合5S吧?)

嵌入式软件

嵌入式软件工程师最主要的工作就是为嵌入式硬件工程师设计的电路板编写软件程序,当然了,软件也需要调试和验证。目前最主流的嵌入式软件开发语言是C,一段典型的C代码:

图片

图22 C语言入门国际惯例“hello world”

也有比较讲究的,会认真写注释,像这样:

图片

图23 秀注释版

当然了,这都是高级C开发工程师干的事情,毕竟一个printf()消耗的资源对于资源紧张的MCU来说还是很奢侈的,我们在MCU上跑程序,也就点点灯、数数数之类的。这里先说说MCU,Micro Control Unit,其实就是一片将CPU、内存、硬盘集成在一起的系统芯片,现代的MCU通常还会集成多种外设,可以类比PC的声卡、网卡等,但是处理速度和运算能力跟主流PC要差出几个数量级。从名字上也能看出,这种芯片主要是面向各种控制类应用的,比如,点个灯。我们现在用的这颗MCU,算是主流产品中的高级货:主频80MHz,内存128KB,硬盘1MB。没错,这就是我们的软件运行的硬件平台资源。

对于PC上的各种骚操作,我们都得慎之又慎,天天活在资源不足的恐惧之中。

图片

图24 C语言骚操作

如果印刷足够清晰,拿着放大镜应该能看到,这是一段C代码,对,没错!这段代码格式化成炮姐(御坂美琴)的样子,编译后运行,可以唱歌,是的,是真的唱歌。编译运行环境:Win10 + VS2017。感兴趣的同学可以电击从这里下载源码:raw.githubusercontent.com/3150601355/…

编译后运行时记得戴耳机,切记切记!

嵌入式软件的开发流程通常是这样的:

图片图片

图25 嵌入式软件开发流程

从上面这个图我们就可以看出嵌入式软件开发与普通软件开发最大的区别:嵌入式软件开发与硬件密切相关,耦合非常紧密,有时就只是电路板上修改一个电阻,软件也需要随之修改。

图片

图27 能控器的一小段代码

这个才是我们的日常,上电运行后,对各种底层硬件电路进行初始化。可能大家想问,那初始化完成之后呢?别问我,问我就点灯!