前言
大家好,我是科岩。
这是一篇科普文章,分享嵌入式能干啥,到底什么是嵌入式。
你大概应该知道嵌入式就是基于51单片机,stm32等等芯片,还有Linux操作系统做的硬件设备,但可能这些在你脑子里都是隐约的概念。
我从一个朋友家借来了一些嵌入式设备,它们有的主控是51单片机,有的是stm32,有Linux,还有一台英伟达的AI设备。
由于不是我的,就把它们拆开,帮大家一探究竟。
文章后面,还会讨论硬件工程师和软件工程师工作内容的区别,以及大家经常问的一个问题,就是初学者要不要学51单片机,我会分享一些我不建议学习51单片机的理由。
文章比较长也比较干,希望能给刚入门的你或多或少一些启发。
还是用一个脑图呈现给大家,高清版可以到公众号下载。
51单片机
首先来看51单片机。
使用51单片机的产品一般有着非常简单的逻辑。
逻辑是什么呢?其实就是【如果xxx,就xxx】,这样的一种条件判断,所有的处理器其实做的就是这一件事。
最常见的51产品就2大类:家电和玩具。
比如遥控车:
玩具枪:
遥控器:
牙刷、筋膜枪:
破壁机:
多功能锅:
用的基本都是51单片机。
先来拆个遥控器。
里面的构造非常简单,就是一块电路板,一颗芯片和一个红外发射头。
芯片上一般都会写字,我们叫丝印,会写明这个芯片的型号,这个遥控器芯片的型号是AD918C。
这是一颗遥控器专用的芯片,我没查到具体的资料,只能说大概率是一颗51芯片。
我们再看一下多功能锅,这个锅的功能可以火锅、烧烤、清蒸,通过旋钮可以控制火力大小,有2个按键可以控制开关和定时。
所以多功能锅芯片的处理逻辑是什么呢?如果旋钮旋在某一个档位,就给对应的火力;如果按了定时按钮,就可以定时做饭。
把它拆开:
那个主控芯片是一颗韩国现代半导体公司的,A96T218芯片,是一颗51单片机。
51单片机芯片的价格非常便宜,在几毛钱到几块钱之间。
它的处理器位数只有8位,位数越大,能处理的数据量和复杂度越高。
通常我们在谈论51单片机的时候,这个【51】的意思,实际上指的是单片机的一种指令集架构,它是英特尔公司发明的8051指令集,由于它比较经典,使用广泛,所以我们在说起51单片机时,常常用它代指所有的8位微处理器。
像前面的多功能锅,用的是韩国现代半导体的芯片,而芯片用的指令集是英特尔的8051指令集。
而其实8位处理器除了8051,还有很多种指令集,像microchip的PIC,ATMEL的AVR、意法半导体的stm8。
后面是指令集对应的芯片型号,这些也都很常见,只不过没有8051使用广泛而已。
8位MCU的主频一般在1MHZ到100MHZ之间,这个主频越大处理速度越快。
内存的范围是128字节到8K字节,硬盘或者说flash范围是2K到128K字节,这个量级的硬盘所能容纳的代码量是几百行到几千行。
它的引脚数量一般是8个到40个脚,引脚就是芯片伸出来的这些细细的铁丝或者说导线,芯片要通过这些导线控制其他的装置或者电路,比如电机的旋转或者是金属盘的加热。
所以【嵌入式】这个概念我们也可以定义一下了,就是把处理器嵌入到电气装置或者机械装置的内部,控制这些装置。
51单片机的电路板一般是1到4层,这个层数是什么意思?
我们看到的电路板表面密密麻麻有许多芯片啊、电阻、电容等等元器件,仔细看上面还有许多电线。芯片的引脚,就是通过这些导电的电线连接到元器件上控制它们。
电路板的材料是绝缘的,表面上我们只能看到正面和背面,实际上中间还有很多层,每个层上也都有导线,层数越多,这个电路板越复杂。
8位MCU的电路板一般都很简单。
那么,再看我们需要掌握的技术栈有哪些。
C语言是最基本的,之后就是GPIO、定时器、中断、串口这些最常用的,想使用这些功能,就需要学习寄存器、电子学知识,再深入些,还可以看看汇编指令集。
8位MCU的知名厂商,我简单列了国内2家和国外2家。
总结一下,我们常常说的51单片机,一般用来处理最简单的逻辑功能,51的意思是英特尔的8051指令集,由于使用广泛,常常在日常口语语境下用它泛指8位的微处理器。
32位机
接下来,我们再说下stm32,它能处理的逻辑功能要比8位机更加复杂,常用的产品包括家居、安防、汽车等等,非常广泛。
先看这个智能门锁,它通过机械结构控制门上的锁芯。
它支持4种开锁方式,指纹、刷卡、机械钥匙、和密码,所以主芯片的处理逻辑很容易想到,如果指纹比对正确,就开锁;如果读卡信息正确、密码正确,就开锁。
拆开也可以看到一块电路板,上面有指纹读取的芯片、读卡的芯片、还有和手机通信的蓝牙芯片,它的主芯片型号是EFM32,是美国芯科的32位单片机。
你可能没听过这个品牌。
没事品牌不重要,你只要知道它不是8位机,而是32位的就可以了。
我们再来拆这个模拟射击的产品。
这款产品可以用来模拟训练打靶,整个系统由枪、靶、报靶系统构成。
枪不断发射激光信号,靶收到激光后,通过无线发射坐标数据给报靶端,报靶端会在靶面上画轨迹。
扣动扳机后,枪会发一个射击信号给报靶端,报靶端计算坐标,语音播报射击环数。
演示一下:
拆开看下,枪的主控芯片是一颗华大的HC32,芯片和电路板非常精细,有主控MCU,有通信芯片、激光芯片,还有控制电机的芯片。
靶面芯片是一颗兆易创新的GD32F103。
报靶端是一个STM8的8位MCU,用来接受无线信号,触摸屏的主控是安卓系统,通过串口和STM8通信,使用的是一颗64位的全志的A64芯片。
这个射击系统算比较复杂的系统了,从8位单片机,到32位单片机,再到64位的高端处理器,都有涉及。
ok,你可能会问,怎么到现在还没有STM32,STM32其实是意法半导体公司生产的arm指令集MCU的一种型号,因为它的开发工具、生态做的都很好,拉低了单片机开发的门槛,价格也不贵,所以使用非常广泛,大部分人都知道。
一款单片机做到这个程度确实很棒,让我不由得想竖起一个大拇指,如果你看到这里还没划走,会发现屏幕下方有个拇指,拜托点赞支持下科岩,鼓励我做出更好的内容。
由于大部分人都知道,所以常常说起stm32,就代指了32位单片机。
32位单片机的价格在几块钱到几十块钱的价格区间。
不像51单片机,我搜了半天没找到1块以内的。
常见32位芯片的指令集架构有这些。
最常用的当然是arm公司的Cortex M系列,使用这个架构的芯片型号有你们熟知的stm32芯片,国内兆易创新完全复制了对应版本,像我们刚刚拆的靶面,用的就是这款GD32F103。
另外,上面拆的锁的主控EFM32是Cortex M指令集,枪的主控华大HC32也是Cortex M,这个Cortex M后面如果举例常用芯片的话,这一个脑图都列不完,实在太多了。
所以与其说stm32使用广泛,不如说是arm Cortex M架构使用广泛。
除了arm,还有最近几年火热的RISC-V指令集,这是加州大学伯克利分校开源的指令集。
另外像中天微的指令集C-SKY,后来被阿里收购成了平头哥;atmel也有32位指令集,叫AVR32、微芯的PIC32也是32位的指令集。
32位MCU的主频范围大概在几十MHZ到几百MHZ之间,基本也是51的10倍。
内存范围,最小4K,最大640K字节;磁盘从2K到2M字节,能够容纳几千行到几万行的代码量。引脚数量是20到100脚,电路板层数最高6层,可能也有更多的,不过我没搜到。
软件的技术栈呢,由于代码量增加了,需要学习更多软件相关的知识,要懂数据结构、实时操作系统、还有网络,而和硬件相关的寄存器啊、电子学这些知识,稍微懂一点就够用,不用像51那样,研究每个寄存器的功能才能使用。
知名的厂商有这些。
如果你工作久了,应该都听过这些名字。
总结一下,stm32只是一款使用了arm Cortex M指令集的32位单片机的型号,由于它上手简单,所以在市场上使用广泛,而除了stm32,其实还有很多其他32位的arm指令集芯片,或者其他指令集芯片。
Linux
接下来是Linux,它比32位MCU更复杂了。
价格当然也更贵,最便宜的也要几十块钱,最贵的几千也有,它的位数是32位和64位,对应的,它做的产品也更贵了。
Linux和前面2个概念又都不相同,它既不是指令集架构,也不是某款芯片的型号,而是一个软件操作系统。
你细品会发现,这其实是个挺有意思的事。
8位单片机领域,火出圈的是英特尔的51指令集;一说32单片机,火出圈的是意法半导体这家厂商的芯片型号;32位和64位的高性能处理器领域,火出圈的是纯软件的操作系统。
广为流传的东西完全不是一回事,为什么是这样呢?
我想,可能是因为,在8位单片机上写软件,常常需要操作寄存器,调用汇编指令,所以8位机的工程师会对汇编比较熟悉,哪个汇编指令好用就用哪个芯片;
而在32位单片机上写软件,芯片厂商把寄存器的使用都封装成了方便调用的函数,大家很少需要调用汇编指令,也不需要关心芯片的架构是什么,只关心哪个厂商的函数更好用更方便就行了;
到了Linux上,芯片厂商封装的函数已经由操作系统的驱动程序调用了,我们不关心芯片架构,不用汇编,连芯片的厂商现在也不需要关心了,只需要调用Linux操作系统提供的统一的、标准的接口就能实现各种各样的功能。
所以你看,在哪个层面工作,那个层面最广泛的技术就会广为流传,当然这只是我自己的一些看法哈。
拆个家用路由器看看。
用的是一颗海思的芯片,SD5650。
再拆个马路上的摄像头。
也有一颗海思的芯片,型号是3516。
除了这个采集摄像头图像的3516,还有一颗意法半导体STM8的8位机,应该是对摄像头做简单的控制。
再拆个智能音箱。
主控是一颗晶晨的A113X。
上面这3个设备,路由器、摄像头、智能音箱,相比51或STM32的设备,又更加复杂了,使用单片机性能不够,无法实现功能,必须使用性能更高的芯片,配合功能复杂的操作系统了。
常见的能够运行Linux的芯片和指令集架构包括这些,这里嵌入式领域使用最多的是Arm Cortex A系列,其他这几种架构大部分都是用在电脑上。
能运行Linux的芯片,主频的范围一般是几百MHZ到几个GHZ,我看英特尔的CPU已经能达到6GHZ了。内存范围128M到32G,硬盘128M到1T字节,引脚的数量,我查到最少的引脚是40个,最多可以有几千个。电路板层数大致是4到30层,各个领域不太一样。
这里的软件技术栈,多了Linux操作系统的使用,和进程、线程、socket接口的调用,当然,也还有GPIO、串口这些基础的硬件接口。
在Linux 上写代码,又比32单片机更高一层,可以完全不懂寄存器、电子学和指令集,只写C语言也是没问题的。
知名厂商我也只列了一些,前面这些是国内的,下面的都是美国的,这个领域的芯片也是咱们天天说的“卡脖子”的技术,前面的32还有51都是低性能的处理器,技术含量不是特别高,美国都不管咱们,我们也并不落后。
但到了这高性能的芯片,最新的技术,上面几家和下面几家相比,还有很大差距的。
SOC
接下来再分享一个概念,SOC,它是system on chip的缩写,翻译过来叫做“片上系统”。
这个概念是相对MCU或者CPU来说的,它的意思是把WiFi、蓝牙或者4G、5G等等这些功能与MCU或CPU集成到同一颗芯片上。
如果非要咬文嚼字,其实手机、平板上的,你知道的高通、联发科还有苹果的芯片,严格来说都属于SOC,而只有电脑上的英特尔啊、AMD这些芯片才是真正CPU的概念。
SOC一般使用在集成度高的产品上,比如手机、手表、手环等。
先拆一下这个大人用的理疗仪,实际图片就不展示了,这是我画的抽象现实主义写真图。
它由一个主控板外加3个震动马达组成,主控芯片是一颗TI的CC2541,这是一颗蓝牙芯片,可以通过手机控制。它的逻辑也很简单,就是控制马达的震动频率。
再拆一个儿童手表。
手环和手表的功能大家应该都知道,除了看时间,还可以计步、定位、测心率、代替公交刷卡,相比手环,手表还能打电话、安装一些APP。
可以看到,主控芯片是一颗紫光展锐的SL8521。
它集成了arm的A系列处理器,性能更高了,还集成了WiFi、蓝牙、GPS、4G通信等等的功能。
我们来画个图更直观做个对比看看。
如果一个智能手表用MCU的方案实现,大概会是这样:
中间是处理器,其他功能用特定的模块通过spi、i2c、串口等等协议进行通信。
如果是SOC实现的方案:
会将蓝牙、wifi等等这些常用功能,集成到一颗芯片中,再通过spi或者其他协议和不是很常用的功能芯片通信。
相比之下,MCU的方案更加灵活,可以任意增减功能;而SOC的方案集成度更高,可以做成非常小巧的产品。
SOC的厂商,除了上面提到的那些手机、平板芯片,还有蓝牙、wifi的芯片,下面是比较常见的厂商。
XPU
我们再说最后一种芯片,XPU,就是各种PU,有GPU、NPU、TPU还有DPU,这些能进行大规模人工智能算法的芯片。
GPU:Graphic Processing Unit,图形处理器
NPU:Neural Processing Unit,神经处理器
TPU:Tensor Processing Unit,张量处理器
DPU:Data Processing Unit,数据处理器
这类芯片的常见产品包括自动驾驶、人脸识别等等功能。
我那个朋友从这种人脸识别自动售货柜里:
拆下来了一个盒子,可以看到,这个盒子上有很多接口,可以接485、继电器、网线,还能插SIM卡。
现在把它打开看看。
有一颗4G的通信模组,用来和云平台通信。
有一颗stm32f407的MCU,这应该是实现货柜的开关门之类的控制功能用的。
还有一个英伟达的Jetson边缘AI处理器,用它实现人脸识别。
XPU的位数一般都是32或64位,指令集架构呢,我搜到这几个:
PTX是英伟达自己的,MLU是咱们国内专做AI芯片的一家公司寒武纪自己的指令集。
XPU的性能呢,是用TOPS作为单位,意思是处理器一秒钟可进行几万亿次的操作,也可以换算成CPU的主频。
然后,比较知名的芯片厂商有这些:
前面几家都是国内的,后面是国外的几个大厂。
相关岗位
再来说下嵌入式的相关岗位。
我前面说到的,51单片机、stm32、linux还有XPU,所有的产品都是芯片、电阻电容、电路板,外面套个壳子组成的。
你能看见的外壳,其实是结构工程师的工作。
比如门锁:
它里面结构很复杂,电路板怎么摆放、哪里需要打螺丝开孔,哪里需要装电池,哪里是塑料,哪里是金属,最后这个外观好不好看,外观是工业设计我就不细分了,我们都认为是结构工程师的工作。
一名结构工程师的工作就是画图,需要的技能包括机械设计、材料、建模这些知识。
硬件工程师的工作也是画图,他要把芯片、电容电阻这些元器件用电线连起来,画成电路图给电路板的生产厂家来生产电路板。
需要掌握的技能就是各个芯片、元器件的功能、特性是什么样的,按照一定的规则把它们用电线连起来。
最后是软件工程师的工作,就是写代码控制各个元器件,软件工程师的工作是表面上你看不到的,他们实现了整个产品的各项具体功能。
需要掌握的技能就是操作系统、数据结构这些计算机软件相关的知识了。
无论是51、stm32还是Linux、XPU,本质上,这几个岗位工程师的工作没有任何区别,只不过就是简单与复杂的关系。
51单片机的电路板一般就2层,代码量一般也就几百行,无论是软件还是硬件都不复杂,很多公司都是一个人搞定软硬件。
stm32这种32位MCU做的产品有的简单,有的复杂,也有一个人搞定软硬件的,也有一个团队软硬件分工明确来开发的。
到Linux、XPU这种级别,无论是软件还是硬件的开发,都比较复杂了,基本没有哪家公司是一个人做了所有的软硬件工作,都是几个人负责硬件,几个人负责软件。
为什么不建议初学者学51
首先我要说明的一点是,51单片机无论是技术还是产品,永远都不会过时。
从技术角度看,51芯片和8051指令集可以说是计算机的鼻祖,无论后面的MCU、CPU多么复杂,其本质或者说其内部的处理器结构仍是一样的,都需要时钟、计算单元、内存、中断控制器、定时器这些最基本的模块。
所以无论怎么发展,51芯片所体现出来的计算机结构知识是不会过时的。
从产品角度看也一样,无论何时,我们都需要微波炉、洗衣机、冰箱、榨汁机这些家用电器,小孩也都需要电动玩具。家电和玩具的控制逻辑简单,用51完全能实现,而且是成本最低的,51单片机还是很有市场的。
但是,我仍然不建议你学,有3个理由。
第一点,51单片机其实并不适合入门。
有人说51单片机比stm32简单,我不这么认为。
如果比喻成数学的话,我觉得大家都是加法,一个层面的东西,并不是51单片机是加法,stm32是微积分。
有同学说直接学32学不明白,那我觉得你直接学51大概率也学不明白。
要么就是你学错了,什么总线、时钟分频、中断优先级,各种各样功能的寄存器,让一个没有计算机学科知识、没有电路基础的人去学,肯定是学不会的。
要么就是你看的书不会讲,或者教你的人不会教。
我之前说过,学习技术就3个阶段,会用、知道怎么实现、知道为什么这么实现。
作为初学者,会用C语言操作单片机就可以了,并不需要了解汇编指令集、寄存器功能、处理器体系结构这些知识。
比如串口收发数据的操作,如果你学习51单片机,就得看串口的各个寄存器的功能,不了解这些,你都没法使用串口。
但stm32不一样,它把这些内容都封装成函数,非常简单,点灯用函数,发数据用函数,这更顺应初学者的思维方式,并且符合C语言的语法习惯。
第二点,51单片机没有学习的必要性。
如果一个初学者直接学习51单片机,那他需要学习各种寄存器的功能,设置不同的值会产生什么不同的效果,甚至还要学一点8051的汇编,然后才能控制它。
而如果一个初学者直接学习stm32,随便调用几个函数就能实现点灯啊、定时器啊、串口收发数据这些功能了。
接着应该把时间花在学习数据结构、实时操作系统、网络通信,或者其他的无线模块这些知识上。
因为稍复杂功能的产品,比如说智能锁,没有良好的数据结构、代码结构,那写出来的代码一定漏洞百出,改一个旧bug,造一个新bug出来。
但这些知识在51里基本用不上,因为51的产品功能逻辑都非常简单。
如果你说,你学习51的目的就是为了学习计算机的体系结构,或者学习汇编语言,那直接学习arm的体系结构,而不是8051的结构不是更好么,因为体系结构,汇编语言其实大家都类似啊,看这2张对比图。
这是51的体系结构和汇编:
这是STM32的体系结构和汇编:
区别并不大,STM32仅仅多了几个常用外设,这些外设也是你不得不学的东西。
也就是说,你学8051和学arm,其实学的是一个东西,都是计算机的结构,它们的复杂度相差不大,你所花费的时间、精力是一样的。学会51的结构,arm的很快也可以学会;学会arm的,51的也可以很快掌握。
那我们为什么不学习一个使用场景更广泛的架构呢?
最后一点,只会51,你大概率找不到工作,注意我说的是只会51,不会其他的。
我去各大招聘网站搜“51单片机”,没有一个招聘需求只写51单片机而不写stm32的。
为什么会这样?因为51单片机的技术已经成熟得熟透了,各个产品功能简单,也早就固定没有什么变化了,一个做51产品的公司,可能有几十甚至上百种产品,每种产品功能早就很稳定,不再需要迭代新功能了,没有必要招一个工程师专门做51的开发。
技术的进步就有着这样的规律,原本复杂的技术,随着时间的推移,会变得越来越容易上手,因为有许多公司用,并且很多人做科普做培训。
20年前51算是高科技,10年前stm32是高科技。
你现在觉得一个嵌入式工程师基于AI芯片训练AI算法简直高大上,但10年之后,随着用的人、科普的人越来越多,那个时候使用AI芯片,和现在的STM32也会一样的简单。
这是一个很容易就能得出的结论,因为过去的51和stm32都是这么过来的。
所以现在大多数公司都是有32单片机的项目,顺便做做51的产品。你直接学习32,完全能胜任51。
ok,这3点是我自己的想法,基于这样的想法,我在设计我自己的嵌入式培训课程时,只涉及stm32和Linux,并不包括51单片机,因为没有必要性。
我见识也有限,可能不对,欢迎你在评论区跟大家分享你的看法。
另外如果你是学生需要考试,或者你就是想学习51的指令集,那也没有问题,如果期望靠学会51就能找到工作,我觉得很难。
end
ok,这篇文章内容就到这里啦,如果对你有帮助有启发,欢迎点赞、收藏、转发。
END