容易混淆的嵌入式(Embedded)术语

Posted 十六宿舍

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容易混淆的嵌入式(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.
欢迎关注 『十六宿舍』 ,大家喜欢的话,给个 👍 ,更多关于嵌入式相关技术的内容持续更新中。

Qt/Embedded 简介

2006-03-07, by netflying

Qt/Embedded


1、 Qt/Embedded体系结构
Qt/Embedded是基于Qt的嵌入式GUI和应用程序开发的工具包,它可运行多种嵌入式设备上,主要运行在嵌入式Linux系统上,并且需要C++编译器的支持,并为嵌入式应用程序提供Qt的标准API。
Qt/Embedded 的API是基于面向对象技术的。在应用程序开发上使用与Qt相同的工具包,只需在目标嵌入式平台上重新编译即可。使用所熟悉的桌面开发工具,来编写和保存一个嵌入式应用程序的源代码树,在移植到多种嵌入式平台时,只需要重新编译代码。
Qt/Embedded提供自身的轻量级窗口系统,比使用Xlib和X Window更加紧凑; Qt/Embedded 的设计原则是不依赖于X server或者Xlib,而是直接访问帧缓存,同其他解决方案如Qt/X11相比这样做最显著的效果是减少了内存消耗。只需要一个Qt/Embedded动态链接库就足以替代X server、Xlib库和其他嵌入式解决方案的图形工具包。
Qt/Embedded还可以在编译时去掉运行时所不需的特性,以减少内存的占用。Qt/Embedded动态链接库可以通过编译时去掉用不到的特性来减少在内存中的覆盖。通过设置src/tools/qconfig.h可以在安装时,定制用户所需的原有Qt功能的一个子集。这样就可以在嵌入式系统中减小Qt/Embedded的尺寸,减少应用程序的内存消耗;而且嵌入式系统中的应用程序集合总是相对固定的也是运用这一功能的重要原因。实现这一定制,只需在qconfig.h中定义宏来取消相应的特性。例如:QlistView窗口部件若要在编译时去掉,只需在qconfig.h中定义QT_NO_LISTVIEW宏即可。若一些特性是依赖于其他特性的,依赖关系是在文件src/tools/qfeatures.h中描述的。Qt/Embedded提供了超过200种可以设置的特性,通过选择链接,可以生成700KB到5000KB(Intel X86)之间大小的动态链接库。大部分用户使用的设置在1500KB到4000KB之间。而且QtE的应用程序也比其他工具开发的应用程序所占用的内存少。在系统中许多CUP时间和内存空间是被ELF(excutive linked file一种为Linux系统所采用的通用文件格式,支持动态连接)链接过程占用了。若使用静态链接技术就可以极大的减少资源的消耗。若运行时所需的应用程序和组件在编译前就可以确定下来,则把所有的应用程序编译链接成唯一的可执行文件,并静态链接于一个静态链接库(libqt.a)的方法比使用动态链接库(libqte.so)和一组链接于这个库的可执行文件更能减少资源消耗。这种方式减少了应用程序开始运行时的代价,提高了内存的利用率,所付出的代价就是降低了程序的灵活性(若添加新的应用程序,需要编译链接所有程序)和健壮性(如果其中一个应用程序又bug,很有可能会影响到其他的应用程序)。但这种方法对CPU和内存使用要求比较高的设备是非常有利的。若要编译Qt为静态链接库,把-static选项添加到设置中。若在编译时Qt所使用的应用程序和组件并不能完全确定,可以把一些Qt组件编译成动态链接库文件或者插件。客户定义外观组件,数据库引擎,字体格式阅读器,图片格式转换,文本编解码及窗口部件都能够被编译为插件,以减少核心动态链接库的尺寸,提供更多的灵活性。


2、Qt/Embedded应用程序的运行方式
Qt/Embedded的窗口系统由多个程序组成,其中一个作为主窗口程序,用来分配子窗口的显示区域,并产生鼠标和键盘事件。主窗口程序提供输入方式和启动子应用程序的用户界面。主窗口程序处理行为类似于子窗口程序,但有一些特殊。在命令行方式中键入-qws选项,任何应用程序都可以运行为主窗口程序。子窗口程序通过共享内存方式于主窗口程序进行通讯。通讯保持在一种很低的水平,子窗口程序可以不通过主窗口程序,而把所有绘制窗口的操作直接写到帧缓存,包括自身的标题栏和其他部件。所有这些都是由Qt/Embedded链接库自动完成,对开发者来说是完全透明的。子窗口程序使用QCOP通道于主程序交换信息。主程序只需简单的向QCOP广播信息,所有正在监听特定信道的应用程序就会收到。应用程序可以通过与received()信号相连的槽作出响应。QProcess类提供了另外一种同步进程间通讯方式,通过直接写外部程序的标准输入、读标准输出和标准错误信息。


3、Qt/Embedded的开发环境及工具
Qt/Embedded的应用程序也可以使用 标准工具在用户熟悉的环境下的工具开发,如Window平台下的Visual C++和Borland C++ Builder,Unix平台下的KDevelop等。在Unix平台下编译Qt/Embedded应用程序,可以在独立的控制台模式,也可以用X11应用程序虚拟的帧缓存。通过指定目标设备的长、宽和色深,虚拟帧缓存可以点对点的模拟物理设备,免除了调试过程中反复擦写闪存,加快了编译、链接、运行的环节。Qt/Embedded提供许多支持嵌入式开发的工具,其中两个非常重要的Qt工具qmake和Qt Designer。Qmake可以为Qt/Embedded链接库和应用程序生成makefile文件。Qmake可以从项目文件(.pro)为多种平台生成makefile文件,通过不同设置可以使应用程序方便的在多种平台间移植。Qt Designer可以使用可视化的方式设计对话框、窗口的,替代了设计代码手工编写。在Qt Designer中还可以使用布局管理器来平滑的设置窗口部件的布局,使用代码编写器编写代码,并且整合了qmake。

 

以上是关于容易混淆的嵌入式(Embedded)术语的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot Web Applications: Embedded Containers(嵌入式容器)

如何通过嵌入式 URL 将参数传递给 PowerBI Embedded

嵌入式系统(Embedded System)概述及其应用

WIN7 嵌入式系统安装教程 Windows Embedded Standard 2011 安装

运行 Ubuntu 12.04 64 位的 Target 嵌入式机器是不是支持 Qt for Embedded Linux?

[转] 语音识别基本原理介绍----gmm-hmm中的embedded training (嵌入式训练)