因为做嵌入式开发工作虽然跳不出电子行业,但还是能接触到跨度较大的不同行当,身处不同的圈子。诸如医疗,银行,车载,工业;亦或者手机,PC,专用芯片;甚至可能横跨系统开发、驱动开发、应用开发。计算机本身以及涉及的一众基础学科无外乎都是舶来品,再加上不同圈子存在思维模式上的差异。所以就会出现每一种不同的圈子,可能对同一个东西,有不同的称谓,而同一种称谓,也可能对应的东西不一样,容易出现很多驴唇不对马嘴的沟通。
本文针对常见在不同圈子容易引起误解的嵌入式概念,尽可能的说明白有哪些差异,这些差异是怎么来的。💾
下图是典型的计算机系统,还可以看到负责CPU与内存的数据交换、图形处理、CPU与PCIE数据交换的北桥芯片,现在的CPU制造工艺越来越先进,集成度越来越高,内存控制器已被集成到CPU里,就连显卡也被收进CPU了(就是我们所说的核显),而PCIE控制器收归南桥管理了,因此北桥芯片组的功能被瓜分了,所以现在的Intel芯片组把北桥取消掉只剩南桥了,而AMD也只有早期的主板还保留着北桥和南桥。
处理器
处理器的这种解释我个人比较认同:计算机处理器是解释和执行指令的功能单元,也称为中央处理器或cpu,它是计算机的中枢神经系统,与处理器和内存周围被称为外设的设备形成对比,如键盘、显示器、磁盘、磁带机等都是外设。 每一种处理器都有一套独特的操作命令,可称为处理器的指令集,如存储、调入等之类都是操作命令。
而典型的计算机系统处理器(central processing unit),则是我们在嵌入式开发中最容易混淆的一个概念,因为我们在沟通时常常忽略了中央(central)这个定语。这个定语描述了这个处理器在整个系统架构中的地位,GPU也是处理器,但是它不能称为中央处理器。而我们只要在计算机背景下,那么处理器往往都是指中央处理器,但是针对别的电子产品,则不尽然,尤其是嵌入式行业,我们把处理器分成了以下常见的几种:
-
MCU(Mirco Controller Unit):这个是我们常说的微控制器。在是计算/控制单元小型化后出现了运行频率低、运算能力一般,但是需要集成化程度高(集成原“芯片组"的各类接口和部分"外设")、价格低廉(辅助系统不应增加太多成本)等因素。由于主要完成“控制”相关的任务的芯片形态。也就是根据外界的信号(刺激),产生一些响应,做一点简单的人机界面。针对在技术推演过程中产生的这种需求,芯片的主频普遍不高,并不需要很强的运算/处理能力,也不需要由大容量的存储器来支撑大的程序。
-
MPU(Micro Processor Unit):这个就是我们常说的微处理器。MPU从一开始就定位了具有相当的处理和运算能力,一帮需要运行较大型的操作系统来实现复杂的任务处理。因此这就决定了MPU应该具备比较高的主频,和较为强大的运算能力。早期经典的Arm 9系列MPU频率就在200MHz-400MHz。现在手机上使用的高端MPU更是到达了3GHz,和主流的桌面处理器是一个级别了。和通用的桌面处理器一样,MPU现在也普遍“多核化”。
-
DSP(Digital Signal Processing):DSP 芯片能够实现数字信号处理技术的芯片,内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,可以用来快速的实现各种数字信号处理算法。它的主要特点就是运算速度快,强调数字信号处理的实时性,适合较复杂的多算法任务。如果想要更快的处理信号,还有FPGA可供选择,但是它就不具有软件的灵活性。
-
SoC(System on Chip):片上系统,如果说中央处理器(CPU)是大脑,那么SoC就是把大脑、心脏、眼睛和手集成到一个片子上,通过一条流片线来生产制作。这意味着,在单个芯片上,就能完成一个电子设备所需要的所有功能,而这个设备在以前往往需要一个或多个电路板,以及板上的各种电子器件、芯片和互连线共同配合来实现。SoC有两个显著的特点:一是硬件规模庞大,通常基于IP设计模式;二是软件比重大,需要进行软硬件协同设计,通用的SDK可以将Soc应用到不同的场景。
存储
我们在京东等网购平台买苹果手机的时候,不同的机身内存,128GB和256GB往往能差出几千块钱,但作为计算机出身的你,肯定对这个内存的大小产生疑惑,我PC机16G的内存已经很大了呀,手机竟然能到128GB?👀莫急,我们去看看苹果官方对这个参数描述为"存储空间",这就准确多了。
其实苹果手机的内存容量不过6GB,而这个动辄几百GB的存储空间是非易失性存储(掉电不丢失)。这个问题是怎么引入的?究其原因还是个翻译问题,内存原本叫 Memory,存储叫 Storage,问题就就是从内置存储(Internal Storage)被翻译成了“内存”开始。既然这个非易失存储器占了"内存"这个坑,那么在手机行业还有个"运存"的说法。嵌入式对存储器又进行了更为细致的划分:
存储器可以从是否可重复写入,是否可随机访问,是否可以掉电存储分成很多种类。
-
随机存取存储器(Random Access Memory,RAM),也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。它与ROM的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。其中DRAM主要用于容量较大的主存储器,PC中的DDR就是双倍速率同步动态随机存储器,而SRAM多用于容量较小的高速缓冲存储器。
-
ROM 是 read only memory的简称,表示只读存储器。只读存储器(ROM)是一种在正常工作时其存储的数据固定不变,其中的数据只能读出,不能写入,即使断电也能够保留数据,要想在只读存储器中存入或改变数据,必须具备特定的条件。
-
FLASH闪存是在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。NVRAM在FLASH的基础上又提供了更快的以字节为单位的访问以及更快的读写速度,EEPROM这个称法是对于紫外擦除的rom来讲,非常适合需要频繁的改写某些小量数据且需掉电非易失。
架构、驱动与应用
当我们在讨论架构的时候,我们在讨论什么,到底什么是架构?下面是ChatGPT给我的答案:
架构指的是系统或应用程序设计的结构,包括组件、模块、数据流等的组织关系、通信协议、部署方式、运行环境等方面的设计,旨在满足用户需求、提高系统性能、可靠性和可维护性。架构是系统设计的基础,它决定了软件系统的质量、可扩展性、可重用性和适应性。架构设计需要考虑多个因素,如系统规模、业务需求、技术选型等,具有高度的综合性和复杂性。
我针对AI给我们的答案,对比上图所示安卓系统的架构,给出一个我对架构的理解。首先,架构是针对一个完整的产品或者程序工程而言,其次它定义了这个完整应用或者系统程序的层级结构,每一层处理的事务不同,层与层之间会有统一的接口相互调用用以传输数据和事件。最后每一个层级内部又进一步划分了不同的功能模块,功能模块统一在本层进行管理。
下图是Ti公司AM273X芯片中SDK的架构,这个我们嵌入式开发中接触到的架构可以类比为安卓的系统架构,它还提供了一个应用Demo用于连接其提供的上位机软件来配置波形和显示点云数据。
下图是汽车开放系统架构(AUTOSAR),这个我们嵌入式开发过程中接触到的架构可以理解对比理解为安卓应用架构,是汽车领域对于其应用程序的开发需要符合的标准架构。
现在我们知道了什么是架构,那么什么是架构开发?以系统开发为例,1991年10月5日,Linus发布了Linux的第一个“正式”版本: 0.02版。Linus做的工作是系统开发吗?当然是,而且我相信他一定具有很强的跳跃性思维。那现如今由全世界几百个程序员共同共同设计开发维护,他们是不是做的架构开发,当然也是了。那我们嵌入式工程师,在别人提供的SDK之上,裁剪了一部分不需要的功能,又基于别人写的应用demo,适配了行业对应用架构的部分要求,我们是在做架构开发吗?不,我们不是,这里我没有妄自菲薄,整个行业技术的推演就是这样,我们做的,仅仅就是嵌入式开发。我相信只有对自己干的事情又清楚的定位,才能干的长久,干的更好。
什么是驱动?我们继续来看看ChatGPT给我们的答案。
驱动是一种软件程序,它连接着计算机系统中的硬件组件和操作系统,充当着硬件与操作系统之间的翻译器。驱动程序将操作系统所需的指令转换为硬件能够理解和处理的指令,从而使操作系统能够与硬件组件进行通信和交互。驱动程序一般由硬件制造商或第三方公司开发,用于支持特定的计算机硬件设备,如显卡、网卡、声卡、打印机等,使其能够正常工作。为了保证驱动的兼容性和稳定性,用户需要根据自己的计算机硬件配置选择正确的驱动程序,并确保驱动程序得到及时更新和维护。
这次ChatGPT给我的答案我比较满意,驱动程序一般由硬件制造商或第三方公司开发,用于支持特定的计算机硬件设备,如显卡、网卡、声卡、打印机等。这句话点出了驱动的真正编写者的身份,他提供的显卡驱动可能是针对某个特定的系统,比如Windows系统,或者Linux系统,而我们嵌入式工程师可能需要基于别人提供的驱动程序,在一些实时操作系统(没有设备管理)下使用,做一些裁剪。我们可能为一些诸如DS18B20这种小的传感器,包一层符合Linux系统定义的驱动模型,包括模块的加载以及一系列调用接口实现,而后将其加载进Linux系统。我们是在做驱动开发吗?显然也不是。
这里我没有提基于STM32标准库的开发,因为诸如SPI/I2C控制器我们大部分也是改改参数适配外围相连的传感/控制器,而传感/控制器本身运行复杂的又有写好的驱动,简单的照着手册上功能/寄存器说明也就够了,但这不是驱动开发,我想读到这里的你应该理解我的意思📀。所以,我们做的这些工作,依然是嵌入式开发的范畴。
什么是应用?我们来看看ChatGPT的答案。文章来源:https://www.toymoban.com/news/detail-645658.html
程序?
应用程序是一种计算机软件,它被设计用于执行特定的任务或功能,例如文档编辑、图像处理、游戏等。应用程序通常是由程序员编写的,可以在计算机、手机、平板电脑等设备上运行。
大部分新闻上称的程序员,都是做应用开发的。他们能够面对到真实的用户需求,而用户使用他们的程序只需要登陆某个网址或者下载某个APP就可以了。而我们嵌入式写的程序,只能在特定的智能硬件设备上运行。那我们将交通,或者工业医疗等行业相关的业务逻辑在某个智能手环或者车载雷达中实现的时候,我们在做应用开发吗?我认为并不是。就拿车载雷达EOL标定功能,它的应用背景是在汽车产线上安装雷达时,可能会由于操作的原因将雷达在可以补偿的范围内装歪了,我们通过标定流程(将汽车驶入标定工位,识别原点角反)来补偿安装过程中引入的误差。这部分实现确实是我们嵌入式开发的范畴,但是它不是应用开发。它太固定了,而应用开发需要遇到更多问题,并发,资源互斥,组件间相互调用,等等一整套完整的思路,一说应用开发就是基于web应用,UNIX环境高编,安卓/ios应用开发,会有基于一套统一的API,按照一种框架和模型进行开发,而我们嵌入式“应用”做的,远没有那么多。所以,依然是嵌入式开发范畴。文章来源地址https://www.toymoban.com/news/detail-645658.html
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』 ,大家喜欢的话,给个 👍 ,更多关于嵌入式相关技术的内容持续更新中。
到了这里,关于容易混淆的嵌入式(Embedded)术语的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!