什么是嵌入式?
关于这个问题,在自己刚找到第一份嵌入式软件工程师的工作之后,有一次在学校和师弟师妹们聊天,谈到自己的工作规划,有了以下的对话。
“师兄,你找的工作是什么方面的啊?”
“嵌入式软件工程师”
“啊?这么高端,是干什么的啊”
“就是写写程序啥的”
“哦”
其实当时我自己也不懂嵌入式具体工作内容是什么?只是听说是写程序的。对于一个不同专业的行业,能够在研究生毕业的时候找一个跨专业的工作,对于师弟师妹们来说被定义为“高端”,而自己却一脸懵逼,支支吾吾不能详细回答他们的问题。
那么,到底什么是嵌入式呢?
嵌入式软件工程师具体的工作内容是什么呢??
度娘给出的答案是:
嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。
说这么多我相信对于非这个专业的同学来说,仍然一知半解。
以我个人的理解,嵌入式是那种需要把程序烧写到芯片中,通过芯片控制硬件实现特定功能的系统。
实际上,现实中我们经常会遇到嵌入式系统,像是手环、智能单车锁等。拆开这些产品,你会发现有一块电路板,在电路板上有一个甚至好几个芯片,一般产品会有一个主要的芯片(称为主控芯片),用来整个产品的数据处理、硬件控制等。
嵌入式软件工程师所做的事情便是在芯片上进行程序编写,根据产品的需求编写逻辑及数据采集和处理以及输出等。嵌入式软件一般采用的编程语言为C语言,有些地方会要求有汇编语言。为什么需要用C语言,因为C语言是接近底层的语言,当然汇编是更加接近的语言。但是汇编语言编写复杂,因此在实际应用中,人们并不直接使用汇编语言进行编程,而是使用相对高级的语言C。C语言有一个好处便是在硬件上运行时,速度快。只有在一些特定的环境下,比如芯片的启动代码(cstartup)、初始化芯片内存、直接操作PC指针等情况下人们才会优先考虑汇编,否则,几乎都是C语言。因此,可以说,嵌入式软件工程师就是C语言程序员。
对应的,还有嵌入式硬件工程师。他们的主要工作便是电路板的设计。一个产品比如智能单车车锁。一个简单的动作,比如手机APP解锁。当你扫描二维码解锁时,产品后台会通过短信向产品发送信号,电路板上的短信接收单元接收到短信后,会进行处理并将信号传给主控芯片,主控芯片进行相应的逻辑判断,验证短信正确后从芯片引脚输出高/低电平,高/低电平经电压转换电路(可能转换成5V也可能转换成12V)输送给继电器开关,继电器控制开关动作,实现单车锁的解锁。实际产品中可能会和上面的描述不一样,但是大致原理是相似的。嵌入式硬件工程师便是设计电路板,设计原理图、PCB板图,从而实现产品的功能。
所谓软硬件可裁剪,个人理解是软件功能通用。比如你编写了一个短信验证函数如下:
int message_ver(int data, int num)
{
if (data == ***)
{
if (num == ***)
{
return SUCCESS;
};
}
else
{
return FAIL;
}
}
该函数输入变量为短信内容data以及车牌号num,然后进行相应处理,r如果符合则输出成功,如果不符合判定则输出失败。这里的成功(SUCCESS)和失败(FAIL)是之前使用的宏定义。如
#define SUCCESS (0x01)
#define FAIL (0x00)
所谓可裁剪,便是该函数可以用在其他需要进行短信验证的地方,使用方法直接调用即可。甚至在其他新的产品中,比如公司需要开发智能摩托车,也需要短信验证,但是代码需要重新编写,这时候你完全可以把这块代码直接复制粘贴到摩托车的工程中。裁剪,便是CTRL+X以及CTRL+V,并且裁剪过程中能够保持代码功能的可用性。
硬件可裁剪类似。比如一块升压电路,需要将3.3V的电压升至5V,你在一个产品中设计好了,该电路出入3.3V,输出5V。你设计好了电阻电容等等细节,并且在一个产品中也得到了验证,稳定性很好。这时候公司需要开发另一款产品,也需要升压,你就可以把这块电路搬到新的原理图中。
软硬件可裁剪是嵌入式系统(产品)的一个很重要的特性。这保证了产品能够更好的维护以及复制以及产品的迭代。
嵌入式软件工程师需要什么知识?
我觉得这个问题很有写一写的必要。
作为一个软件开发人员,C语言知识是必须的,这里的C语言知识不是大学里学到的那些,会写一个for循环或者会写一个if语句那么简单。因为在产品设计时,你需要考虑很多东西,比如新产品立项在选择芯片类型时,你需要了解这个芯片都有神马资源(所谓资源一般指的是有多大内存、多大flash空间、有几个串口等等),这些资源能不能支撑你的产品功能。在判断资源够不够的时候,就需要你对C语言代码有更深的理解,你要知道一行代码在经过编译器编译完之后大约占多大的空间,整个项目大概有多少代码量,芯片flash能不能存的下这么多代码。
在这里就需要一些芯片空间的知识。比如32kb的芯片是什么概念?大约多少行的代码量编译完有32kb,当然不同的编译器是不一样的,但是我觉得这需要心里有个数。
想成为一个合格的嵌入式软件工程师,下面几项是必须要牢牢掌握的:
-
指针
这是嵌入式中使用最为广泛的知识点。复杂点的工程几乎所有的函数在传递变量时不会直接传递变量,而是传递变量的指针。这样做有什么好处呢?好处便是这样做是直接操作内存。
举个例子:
我们知道代码中定义的变量都是有内存的。比如 int a = 3;
我们定义完之后,编译器会自动向芯片ram区申请一块区域放置这个数据。比如申请到的ram区的地址是 0x00016。这个时候,在这个区域存放的数据便是3。可以想象成0x00016是一个门牌号,在这家门口挂了一个框子,框子里装的是3。 如果我们传递指针时,直接操作内存相当于芯片直接去寻找0x00016这个门牌号,然后把框子里的3替换成其他数。这样首先提高了代码执行效率,其次避免了在变量传递过程中有可能导致的错误。 -
基本语法
这个是基本功。 -
单片机原理
这个不多说,你需要了解单片机的组成,包括CPU、串口、数据总线地址总线、ADC、时钟、AHB、定时器等等的概念及基本用法。因为在嵌入式编程中,除了编写应用层的代码之外,你还需要设置芯片的时钟(主控频率)、定时器(实现一些中断)等。 -
读懂芯片手册的能力
每个嵌入式软件工程师都是针对一款特定的芯片进行编程,这时候你需要时间与这个芯片打交道,你需要读的懂芯片手册,知道在你需要更改一些芯片操作的时候应该怎么配置。 -
看懂硬件原理图的能力
嵌入式软件工程师不是光和软件打交道,有时候你需要根据硬件来配置串口IO等。这就需要你懂得硬件原理图。当然,有些时候在调试软件功能时还需要你去焊接一些信号线,这就需要更加了解图了。
除了上面几项,其他未尽事项也需要在嵌入式编程中逐渐积累。
因此,回答最初的问题。
什么是嵌入式?
我想每个人都有每个人的理解。嵌入式,说白了,就是把程序(不管是用什么语言编写的)烧录到芯片中,控制芯片外围电路实现特定功能的系统。