资讯详情

计算机/微机组成及相关概念

计算机概述

计算机硬件开发:

计算机系统组成:

主机及外设:

计算机系统的层次结构:

计算机速度指标:

计算机数制

这一块比较简单繁琐,可以直接参考:

详细介绍二进制、八进制、十进制、十六进制的相互转换_哔哩哔哩_bilibili

几个更容易理解的转换:十进制到其他进制,其他进制到十进制,十六进制八进制和二进制

数据运算

数学上将,CPU中的ALU算术上只做了两件事,加法,移位,最多加上反向,逻辑上只有与或非不同。

加法->加法。

减法->取反,加法。

乘法->移位、逻辑判断、累积

除法->移位、逻辑判断、累减(口语)

至于为什么乘法除法是这样的,说白了就像我们熟悉的十进制计算流程一样,搜索二进制数如何乘法除法。

因此,只有加法器、移位器和基本逻辑门电路构成一个简单的ALU。

从硬件实现的角度来看,实现这四个基本操作只需要上述硬件组件。早期的cpu内部结构简单,只有这些组件,没有特殊的乘法器和除法器。但可想而知,效率也很低(除法效率最低,因为每次移位后比乘法多一次试错操作),后来cpu集成专用并行处理电路cpu内建协处理器(如浮点运算器,很早cpu没有专门计算浮点的电路),在硬件上实现,使计算速度更快。当然,计算逻辑没有改变。

ASCLL码

ASCII_百度百科

ASCLL一些字符用7位或8位二进制数表示。

注:单引号表示字符,双引号表示字符串。

注意区分十进制0和字符0;十进制0对应字符的空字符;字符0对应的十进制数为48。

BCD码

记住最常用的,8421码。

8421 BCD码是最基本、最常用的BCD代码,类似于四位自然二进制码,权值为8、4、2、1,故称有权BCD代码。与四位自然二进制码不同,它只选择了四位二进制码中的前10组代码,即0000~1001分别代表其对应的十进制数,不需要剩余的六组代码。

计算机单位

基本概念 bit(位,又称比特):bit的缩写是b,是计算机中最小的数据单位(属于二进制范畴,实际上是0或1)

Byte(字节):Byte的缩写是B,它是计算机文件大小的基本计算单位。例如,一个字符是1Byte,若为汉字,则为2Byte。

换算关系: 1B(字节)=8b(位) 1 KB = 1024 B 1 MB = 1024 KB 1 GB = 1024 MB 1TB = 1024GB

基本单位:字节,进一步总结:

2^10是1K;

2^20是1M;

2^30是1G;

记住以下常用的次方:

2^6=64;

2^7=128;

2^8=256;

2^9=512;

冯诺依曼结构和哈佛结构

程序运行时有两个核心元素:程序运行时: 数据

程序是我们编译汇编后编写的源代码获得的机器代码,可以提供给这些机器代码CPU解码执行,CPU不会也不应该修改程序,所以程序只读。

数据是程序运行过程中定义和产生的变量值,可以读写,程序运行实际上是为了改变数据值。

程序和数据都放在内存中,不相互分离的结构称为冯诺依曼结构。Intel的CPU均采用冯诺依曼结构。 程序和数据分别放置在不同的内存块中,完全分离的结构称为哈佛结构。例如,大多数单片机(MCS51、ARM9等)均采用哈佛结构。

程序和数据在冯诺依曼结构中没有区别,所以安全性和稳定性是个问题,优点是处理起来简单。 程序在哈佛结构(通常在哈佛结构中)ROM、flash中)和数据(一般放在中)RAM中间)独立存储,优点是安全稳定性高,缺点是软件处理比较复杂(链接地址需要统一规划等)。

又称为普林斯顿体系结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。指令和操作数在同一总线上,分时重用;缺点是指令和操作数不能同时达到,形成传输过程的瓶颈。程序指令和数据宽度相同,因为程序指令存储地址和数据存储地址指向同一存储器的不同物理位置。

它是一种将程序指令存储和数据存储分开的存储结构。它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器都有独立的地址和访问,以减少程序运行中访问存储的瓶颈。

哈佛结构的中央处理器首先在程序指令存储器中读取程序指令,解码数据地址,然后在相应的数据存储器中读取数据,并进行下一步操作(通常执行)。程序指令存储与数据存储分开,可以同时存储数据和指令,使指令和数据具有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,数据是8位宽度。

虽然改进的哈佛结构也使用了两个不同的存储器:程序存储器和数据存储器,但它合并了两个存储器的地址总线和数据总线,即原哈佛结构需要四条不同的总线,改进后需要两条总线。

一般来说,哈佛机构的高性能体现在单片机上DSP在芯片平台上,程序类型和模式较少,因为各种电子娱乐产品中的软件升级较少,应用程序可以汇编为核心,最高效地利用装配线技术获得最高效率。 冯诺依曼结构主要是基于计算机买家使用计算机——各种娱乐用户、各种专业开发用户等,安装各种软件、升级、各种软件同时处理优先级模糊,因为特尔芯片没有完全智能分配程序优先级和装配线机制,机械分配优先级和装配线容易使用户不便。 冯结构简单,易于实现,成本低,但效率低;哈佛结构效率高但复杂,对外围设备的连接和处理要求高,不适合外围存储器的扩展。现在的处理器,依CACHE两者的存在已经很好一了。虽然目前的处理器在外部总线上是诺依曼结构的,但由于内部CACHE存在,所以其实内部类似于改进型哈佛结构。

寄存器

不要把寄存器想象成内存或硬盘,它是一个独立的整个磁盘; 寄存器是一种设计电路,可用于存储指令、地址、数据等CPU在控制器和运算器的设计中,有许多寄存器,当控制器或运算器需要存储一些东西时,就会使用这种设计电路。例如,要加两个数,CPU读取内存中的两个数字后,应使用寄存器暂存和处理数据。

参考这个视频:寄存器是什么?_哔哩哔哩_bilibili

CPU 寄存器 与内存的关系_Firm陈的博客-CSDN博客_寄存器在cpu里面吗

内寄存器:指的是CPU内核寄存器,如r0,r1等;

外设寄存器:一般是指一些特殊的能的物理地址,嵌入式通过编程来控制外设寄存器从而控制芯片外部的外设。

寄存器属于CPU的组成部分,就算有的名字叫做外设寄存器???

我一开始想的是寄存器在外设接口那里,比如在USB接口那里,后来想想,寄存器不是在CPU内部嘛。

查了很多资料还是没弄明白寄存器到底是个啥?

既然说寄存器在CPU内部,那么为什么又说外设寄存器,难道外设寄存器在CPU外部?

还有一个问题,既然是统一编址,分的是地址,为什么要占用实际的内存空间?还是说,只占用内存的空间地址?

参考了这两篇文章:

外设寄存器在STM32中的什么位置?它们是在皮层-m核心还是在外围单元本身? - 问答 - 云+社区 - 腾讯云单片机外设(ram、寄存器)地址详解_wx60bf0f6c32435的技术博客_51CTO博客

大概意思是,外设寄存器并非存在于CPU内部,而是存在于外设上。我们通过统一编址的方式来控制这些外设寄存器。外设寄存器在STM32中的什么位置?它们是在皮层-m核心还是在外围单元本身? - 问答 - 云+社区 - 腾讯云​​​​​ 也可以直接理解成就是外设的地址。

外设寄存器属于CPU外设的硬件组成部分,CPU可以像访问内存一样访问外设寄存器,外设寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关” 。正如汇编指令集是CPU的编程接口API一样,外设寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。

编程操作寄存器类似于访问内存 寄存器中每个bit位都有特定含义,因此编程操作时需要位操作。 单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率。

SoC中有2类寄存器:通用寄存器和SFR(special function register,特殊功能寄存器)

通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。

SFR(special function register,特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。

注意:

C语言无法操作内部寄存器,但是可以操作外部寄存器;

汇编语言可以操作内部寄存器。

以SD卡模块为例,我一开始还以为会不会卡槽那边有寄存器设计。现在看来,在SOC里针对每个外设都有个外设模块,这些模块里面就有寄存器的设计,这些电路的总和加上CPU就构成了SOC,各外设模块对外的具体控制就体现在各个引脚上。

总线

CPU通过地址总线寻址,然后通过数据总线与外部设备互换信息。 地址总线的位数决定CPU寻址范围;数据总线的位数决定CPU单次通信能交换的信息数量; 总线的速度决定CPU和外设互换信息的速度。

一根线只能传输一位二进制数,很好理解,电流只有两种状态。所以,一般32位系统有32根地址总线,这样才能完整地表示所有的地址(地址是32位的),有32根数据总线,这样才能表示2^32次方大小的数据。

CPU的地址总线位数和数据总线可以不同(典型代表就是51单片机),但是一般都相同。

CPU的位数指的是数据总线的位数,代表着cpu一次性能够处理的数据的位数。 32位CPU寻址的范围是4G,所以最多支持4G内存; 数据总线是32位的,所以编程最好用int,如果传递char,也是跑32根数据总线,只不过24位是在空跑。和传递int耗费的资源是一样的。

SoC

SoC和CPU有啥区别?

SoC = System on Chip

以前的电路:CPU+总线+外设,焊接在一块板子上;

现在,都集中在一块芯片上,严格来说称为SoC。

平时聊天所说的CPU,一般都指SoC。

芯片的发展方向:从CPU到SoC,现在已经没有纯粹的CPU了,都是SoC。

ARM出卖的内核其实就是CPU(当然还需要总线),各种外设是半导体厂商自己添加的。

外设

外设就是外部设备,SoC中外设大部分都跑进去了,网卡、音频编解码等个别还经常在外面。芯片设计的趋势是更大集成度,近年甚至将音视频编解码、DDR都集成进SoC内做成所谓单芯片解决方案。如海思Hi3518E。裸机学习其实就是学习SoC的内核(CPU,表现为汇编指令集)和各种外设(如串口)

统一编址和独立编址

内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元。

IO(input and output)是输入输出接口,是CPU和其他外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。一般的,IO就是指CPU的各种内部或外部外设。

在不同的系统中,I/O端口的地址编排有两种形式:存储器统一编址和I/O独立编址。 

在这种编址方式中,I/O端口和内存单元统一编址, 即把I/O端口当作内存单元对待, 从整个内存空间中划出一个子空间给I/O端口, 每一个I/O端口分配一个地址码, 用访问存储器的指令对I/O端口进行操作。 

存储器统一编址的优点是: I/O端口的数目几乎不受限制; 访问内存指令均适用于I/O端口,对I/O端口的数据处理能力强; cpu无需产生区别访问内存操作和I/O操作的控制信号,从而可减少引脚。

存储器统一编址缺点是: 程序中I/O操作不清晰,难以区分程序中的I/O操作和存储器操作; I/O端口占用了一部分内存空间; I/O端口地址译码电路较复杂(因为内存的地址位数较多)。

I/O端口编址和存储器的编址相互独立, 即I/O端口地址空间和存储器地址空间分开设置,互不影响。 采用这种编址方式,对I/O端口的操作使用输入/输出指令(I/O指令)。

I/O独立编址的优点是: 不占用内存空间; 使用I/O指令,程序清晰,很容易看出是I/O操作还是存储器操作; 译码电路比较简单(因为I/0端口的地址空间一般较小,所用地址线也就较少)。

I/O独立编址缺点是:只能用专门的I/O指令,访问端口的方法不如访问存储器的方法多。

编址总概: 上面两种编址方式各有优点和缺点, 究竟采用哪一种取决于系统的总体设计。 在一个系统中也可以同时使用两种方式, 前提是首先要支持I/O独立编址。 如:Intel的x86微处理器支持I/O独立编址, 因为它们的指令系统中都有I/O指令, 并设置了可以区分I/O访问和存储器访问的控制信号引脚。 而一些微处理器或单片机,为了减少引脚,从而减少芯片占用面积, 不支持I/O独立编址,只能采用存储器统一编址。

ARM采用的就是统一编址。

最近看到SDRAM的课程,发现内存SDRAM只有0—13的14根数据总线,就算是两个并联在一起,也只有28根,即256M的内存空间。我很疑惑,怎么不是32根呢?不是说arm210是32位数据总线和32位地址总线吗?

对呀,到底是为啥?

首先,32位CPU通常指的都是数据总线的根数,一次性读取32位数据(4个字节),说明了这个CPU处理数据的效率,而并不是根据地址总线来决定的,这个能理解。

数据总线的根数和地址总线的根数没有必然联系,数据总线决定数据读取效率,地址总线决定能够编址的范围。

我猜想,32位指的是该CPU所能编址的最大范围是4G,但是,并不是说这些地址都要给内存,因为采用的是统一编址,所以这32位地址其实是分配给了不同的功能,比如说寄存器占用了一部分地址编码。这样能理解。

在arm210中,内存实际是占用了0x20000000-7FFFFFFF这么多的地址空间,即1.5G。

 不过,还是不懂为什么只有14根数据总线。。。

状态机

常说的状态机是有限状态机FSM。FSM指的是有有限个状态(一般是一个状态变量的值),这个机器同时能够从外部接收信号,机器在接收到外部输入的信号后会综合考虑当前自己的状态和用户输入的信息,然后机器做出动作:跳转到另一个状态。

考虑状态机的关键点:当前状态、外部输入、下一个状态

两种状态机:Moore型和Mealy型 (1)Moore型状态机特点是:输出只与当前状态有关(与输入信号无关)。相对简单,考虑状态机的下一个状态时只需要考虑它的当前状态就行了。

(2)Mealy型状态机的特点是:输出不只和当前状态有关,还与输入信号有关。状态机接收到一个输入信号需要跳转到下一个状态时,状态机综合考虑2个条件(当前状态、输入值)后才决定跳转到哪个状态。

状态机的主要用途:电路设计、FPGA程序设计、软件设计 (1)电路设计中广泛使用了状态机思想 (2)FPGA程序设计 (3)软件设计(框架类型的设计,譬如操作系统的GUI系统、消息机制)

状态机解决了什么问题 (1)我们平时写程序都是顺序执行的,这种程序有个特点:程序的大体执行流程是既定的,程序的执行是遵照一定的大的方向有迹可寻的。 (2)但是偶尔会碰到这样的程序:外部不一定会按照既定流程来给程序输入信息,而程序还需要完全能够接收并响应外部的这些输入信号,还要能做出符合逻辑的输出。

嵌入式系统

专用、软硬件可裁剪可配置

低功耗、高可靠性、高稳定性

软件代码短小精悍

代码可固化

实时性

弱交互性

专用开发工具及开发环境

专业开发人员

硬件:微处理器、存储器、I/O接口、输入输出设备等等

软件:嵌入式操作系统、BSP(board support package板级支持包)、应用软件

嵌入式较为明显:

一、以单芯片为核心,使用可编程控制器:

没有操作系统支持

软件以汇编为主

功能单一、处理效率低、存储容器小、没有对外接口

使用简单、价格低

二、以嵌入式CPU为基础、简单操作系统为核心

CPU种类多,通用性弱

系统开销小,效率高

达到一定兼容性,拓展性

用户体验度不高,交互界面不够友好

三、以嵌入式操作系统为标志

兼容性好,适用于不同平台

系统开销小,效率高,具有高度模块化及拓展性

图形化界面,用户界面友好

丰富的外部接口

四、以物联网为标志

传感器技术、互联网技术及传统嵌入式技术综合联系

小型化、智能化、网络化及可视化

低功耗、绿色环保

多核技术SWP、云计算技术及虚拟化技术

交叉编译

两种编程方式:

1、非嵌入式开发,A(类)机编写(源代码)、编译得到可执行程序,发布给A(类)机运行。

2、嵌入式开发,A(类)机编写(源代码)、编译得到可执行程序,发布给B(类)机运行。

嵌入式的这种,A机上编写编译,B机上发布运行的模式,就叫做交叉编译。

为什么要使用交叉编译?

嵌入式开发的CPU比较简单,本身无法搭建开发环境,有些甚至操作系统都没有。 交叉编译可以用高性能机器为低性能机器开发软件(包括裸机软件、系统级和应用级软件)

交叉编译有什么特点?

交叉必须使用专用的交叉编译工具链。 由于可执行程序不能本地运行调试,因此必须配合一定手段(专用调试器、JTAG调试器、USB下载、串口下载、SD启动、网络共享等)将可执行程序加载到目标嵌入式设备上运行及调试。

交叉编译,不便于本机运行调试程序。 嵌入式系统需要bootloader来启动,而bootloader必须首先存在于可启动介质中,这个过程需要专用工具。 嵌入式系统无法通过纯软件实现单步调试,因此必须借助专用的调试器。

比如Jlink:下载可执行程序到目标机。 在目标机上实现单步调试,便于开发bootloader。

比如SD卡:作为启动介质。工作方式是:事先用读卡器将SD卡连接到开发机(一般是Windows电脑),通过写卡软件将交叉编译得到的可执行程序镜像烧录到SD卡,然后将SD卡插入 嵌入式目标机卡槽,设置正确的启动方式启动,则系统可以从SD卡中烧录的镜像处启动。

比如USB转串口线:串口本身用来做嵌入式目标机的调试输出,主要目的是用来监视及调试软件。 因为现在大部分个人电脑(大部分台式机和几乎全部的笔记本电脑)都未配置DB9串口,因此工作中一般直接使用USB转串口线来连接PC和开发板

其他比如:USB OTG线、DB9串口线、交叉网线……

可编程器件

电子器件的发展方向:

模拟器件→数字器件;

专用集成电路(ASIC)→可编程器件。

CPU在固定频率的时钟控制下节奏运行。 CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行。 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的,本质上是一串由1和0组成的数字。这就是CPU的汇编指令集。

程序员用汇编指令编程 --经汇编器汇编成二进制可执行程序文件-->二进制文件被CPU读取进去-->CPU内部电路对二进制文件解码-->解码通过则CPU执行指令、完成指令动作。 如果程序员用C语言等高级语言编程,则编译器先将C语言程序编译为汇编程序,再进行上面的后续部分。

汇编语言

汇编难写,C好写 汇编无可移植性,C语言有一定可移植性,Java等更高级语言移植性更强。 汇编语言效率最高,C语言次之,Java等更高级语言效率更低。 汇编不适合完成大型复杂的项目,更高级语言更适合完成更大、更复杂的项目。

纯机器码编程

汇编语言编程

C语言编程

C++语言编程

Java C#等语言编程

脚本语言编程

汇编的实质是机器指令(机器码)的助记符,是一种低级符号语言。 机器指令集是一款CPU的编程特征,是这款CPU的设计者制定的。CPU的内部电路设计就是为了实现这些指令集的功能。

RISC和CISC

精简指令集CPU(RISC:Reduced Instruction Set Computer)是一种执行较少类型计算机指令的微处理器,类似于提供原材料,更多具体功能由程序员来实现。

RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。因此RISC CPU的指令集中只有很少的指令,这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了。代表性处理器如ARM。

复杂指令集CPU(CISC:Complex Instruction Set Computer)是一种自带有较多指令的微处理器。基本上能想到的功能都有一条单独的指令即可完成。

CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计。51单片机也是这种方式的。

CPU设计方式发展:

早期简单CPU,指令和功能都很有限

CISC年代 —— CPU功能扩展依赖于指令集的扩展,实质是CPU内部组合逻辑电路的扩展。

RISC年代 —— CPU仅提供基础功能指令(譬如内存与寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用基础架构来灵活实现。 

不过当今时代没有纯粹的RISC或CISC,发展方向是RISC与CISC结合,形成一种介于2者之间的CPU类型。

一般典型CISC CPU指令在300条左右 ARM CPU常用指令30条左右

标签: 8b型高稳定性传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台