容易混淆的嵌入式(Embedded)术语
因为做嵌入式开发工作虽然跳不出电子行业,但还是能接触到跨度较大的不同行当,身处不同的圈子。诸如医疗,银行,车载,工业;亦或者手机,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的答案。
程序?
应用程序是一种计算机软件,它被设计用于执行特定的任务或功能,例如文档编辑、图像处理、游戏等。应用程序通常是由程序员编写的,可以在计算机、手机、平板电脑等设备上运行。
大部分新闻上称的程序员,都是做应用开发的。他们能够面对到真实的用户需求,而用户使用他们的程序只需要登陆某个网址或者下载某个APP就可以了。而我们嵌入式写的程序,只能在特定的智能硬件设备上运行。那我们将交通,或者工业医疗等行业相关的业务逻辑在某个智能手环或者车载雷达中实现的时候,我们在做应用开发吗?我认为并不是。就拿车载雷达EOL标定功能,它的应用背景是在汽车产线上安装雷达时,可能会由于操作的原因将雷达在可以补偿的范围内装歪了,我们通过标定流程(将汽车驶入标定工位,识别原点角反)来补偿安装过程中引入的误差。这部分实现确实是我们嵌入式开发的范畴,但是它不是应用开发。它太固定了,而应用开发需要遇到更多问题,并发,资源互斥,组件间相互调用,等等一整套完整的思路,一说应用开发就是基于web应用,UNIX环境高编,安卓/ios应用开发,会有基于一套统一的API,按照一种框架和模型进行开发,而我们嵌入式“应用”做的,远没有那么多。所以,依然是嵌入式开发范畴。
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』 ,大家喜欢的话,给个 👍 ,更多关于嵌入式相关技术的内容持续更新中。
相关文章:
容易混淆的嵌入式(Embedded)术语
因为做嵌入式开发工作虽然跳不出电子行业,但还是能接触到跨度较大的不同行当,身处不同的圈子。诸如医疗,银行,车载,工业;亦或者手机,PC,专用芯片;甚至可能横跨系统开发、…...
Nodejs 中 JSON 和 YAML 互相转换
JSON 转换成 YAML 1. 安装 js-yaml 库: npm install js-yaml2. 在程序中引入依赖库 const yaml require(js-yaml);3. 创建一个 js 对象, 代表 json 数据 const jsonData {name: John,age: 30,city: New York };4. 使用 yaml.dump() 把 js 对象转换成 YAML, 返回 YAML 字符…...
C++入门教程||C++ 修饰符类型||C++ 存储类
C 修饰符类型 C 允许在 char、int 和 double 数据类型前放置修饰符。修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求。 下面列出了数据类型修饰符: signedunsignedlongshort 修饰符 signed、unsigned、long 和 short 可应用于整型&#…...
Android开发面试:Java知识答案精解
目录 Java 集合 集合概述 HashMap ConcurrentHashMap 泛型 反射 注解 IO流 异常、深浅拷贝与Java8新特性 Java异常 深浅拷贝 Java8新特性 并发 线程 线程池 锁 volatile JVM 内存区域 内存模型 类加载机制 垃圾回收机制 如何判断对象已死 Java 集合 …...
Windows上一款特别好用的画图软件
安装 废话不多说,打开windows的应用商店,搜索draw.io,点击获取即可。 画图 draw.io的布局左边是各种图形组件,中间是画布,右边是属性设置,文件扩展名是.drawio。 点击左边列表中的图形可以将它添加到画…...
html--学习
javascrapt交互,网页控制JavaScript:改变 HTML 图像本例会动态地改变 HTML <image> 的来源(src):点亮灯泡<script>function changeImage() {elementdocument.getElementById(myimage) #内存变量࿰…...
关于递归处理,应该怎么处理,思路是什么?
其实问题很简单,就是想要循环遍历整个data对象,来实现所有name转成label,但是想到里面还有children属性,整个children里面可能还会嵌套很多很多的name,如此循环,很难搞,知道使用递归,…...
重磅!牛客笔试客户端可防ChatGPT作弊
上线俩月,月活过亿。爆火的ChatGPT能代写文,撕代码,善玩梗,秒答题,几乎“无所不能”,争议也随之而来。调查显示,截至2023年1月,美国89%的大学生利用ChatGPT应付作业,53%的…...
春季训练营 | 前端+验证直通车-全实操项目实践,履历加成就业无忧
“芯动的offer”是2023年E课网联合企业全新推出集训培优班(线下),针对有一定基础(linux、verilog、uvm等)在校学生以及想要通过短时间的学习进入到IC行业中的转行人士,由资深IC设计工程师带教,通…...
2.详解URL
文章目录视图函数1.1endpoint简介1.2 装饰器注册路由源码浅析1.3 另一种注册路由的方式---app.add_url_rule()1.4 视图函数中添加自定义装饰器2 视图类2.1 视图类的基本写法3 详细讲解注册路由的参数3.1常用的参数3.2不常用的参数(了解)视图函数 1.1endpoint简介 endpint参数…...
Android特别的数据结构(二)ArrayMap源码解析
1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成,一个int[] mHashes用来存放Key的hash值,一个Object[] mArrays用来连续存放成对的Key和ValuemHashes数组按非严格升序排列初始默认容量为0减容ÿ…...
减少if else
1. 三目运算符 可以理解为条件 ?结果1 : 结果2 里面的?号是格式要求。也可以理解为条件是否成立,条件成立为结果1,否则为结果2。 实例: public String handle(int code) {if (code 1) {return "success";} else {return &quo…...
硕士毕业论文常见的排版小技巧
word排版陆续更新吧,更具我所遇到的一些小问题,总结上来 文章目录1.避免题注(图或者表的标题)与图或表格分不用页注意点:光标移动到表的题注后面2.设置论文的页眉关键点:需要将每一章节末尾,都要…...
JAVA开发(数据类型String和HasMap的实现原理)
在JAVA开发中,使用最多的数据类型恐怕是String 和 HasMap两种数据类型。在开发的过程中我们每天都使用的不亦乐乎。但是相信很多人都没有考虑过String数据类型的实现原理或者说是在数据结构中的存储原理,还有一个就是是HashMap,也很少有人去了…...
Hbase 映射到Hive
目录 一、环境配置修改 关闭掉hbase,zookeeper和hive服务 进入hive312/conf 修改hive-site.xml配置, 在代码最后添加配置 将hbase235的jar包全部拷贝到hive312的lib目录,并且所有的是否覆盖信息全部输入n,不覆盖 查看hive312下…...
14_MySQL视图
1. 常见的数据库对象2. 视图概述2.1 使用视图的好处视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据…...
做程序界中的死神,斩魂刀始解
标题解读:标题中的死神,是源自《死神》动漫里面的角色,斩魂刀是死神的武器,始解是斩魂刀的初始解放形态,卐解是斩魂刀的觉醒解放形态,也是死神的大招。意旨做程序界中程序员的佼佼者,一步一步最…...
顺序表——“数据结构与算法”
各位CSDN的uu们你们好呀,今天小雅兰的内容是数据结构与算法里面的顺序表啦,在我看来,数据结构总体上是一个抽象的东西,关键还是要多写代码,下面,就让我们进入顺序表的世界吧 线性表 顺序表 线性表 线性表&…...
嵌入式Linux从入门到精通之第十六节:U-boot分析
简介 u-boot最初是由PPCBoot发展而来的,可以引导多种操作系统、支持多种架构的CPU,它对PowerPC系列处理器的支持最为完善,而操作系统则对Linux系统的支持最好目前已成为Armboot和PPCboot的替代品。 特点: 主要支持操作系统:Linux、NetBSD、 VxWorks、QNX、RTEMS、ARTOS、L…...
UART 串口通信
第18.1讲 UART串口通信原理讲解_哔哩哔哩_bilibili 并行通信 一个周期同时发送8bit的数据,占用引脚资源多 串行通信 串行通信的通信方式: 同步通信 同一时钟下进行数据传输 异步通信 发送设备和接收设备的时钟不同 但是需要约束波特率(…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
