嵌入式开发入门

什么是计算机
计算机是一种能够执行计算的设备,1946年2月14日世界上第一台数字计算机ENIAC在美国宾夕法尼亚大学被制造出来,这标志着人类社会进入了信息化时代。
CPU中央处理器是指挥计算机工作的核心部件,在计算机中相当于大脑的地位,承载了计算机中最基本的原理。近70年来,从早期ENIAC计算机的CPU,到现在的手机中超大规模集成电路CPU,CPU变化的只是制作工艺,其根本的工作原理基本没有变。
做计算机 = 做CPU + 做操作系统
一层层的套娃:通过最简单的组件,经过一层层的抽象,做出来复杂的操作。
元器件的变化
继电器一真空管一晶体管继电器、真空管和晶体管是用于实现电信号的开关控制的电子元件。其他元器件原理都是一样,只是体积做的越来越小,现在晶体管开关的最小尺寸可以做到3nm左右
从1945年到现在计算机的电路原理和结构没有发生变化,变化的只是制作工艺
数字电路与二进制
简单来说,数是一个抽象的概念,而数字是用来表示数的符号。数(number)是一种数学抽象概念。数字(digit) 是表示数量的符号,如 0,1,2,3,4,5,6,7,8,9。抽象的概念是看不见的,符号是看得见的。
二进制没那么神秘,只不过是人们又发明出来一种新的组合符号来表示数字
位值计数法
基于位置和数值的一种计数方法
位值记数法是一种数字表示方式,它是基于位置来确定数字的大小的。在位值记数法中,每一个位置上的数字都有一个对应的权值,这个权值是基于它所在的位置而定的。
例如在十进制中,最右边的数字权值为1,次右边的数字权值为10,次次右边的数字权值为100,以此类推。如果是二进制,权值分别为1,2,4,8,16,32…
所以位值记数法是一种数字表示方式,是现代数学和计算机科学中常用的表示数字的方式。
- 计算机的元器件晶体管只有2种状态,通电 (1) & 断电 (0) ,用二进制可直接根据元器件的状态来设计计算机。
- 而且,数学中的“布尔代数”分支,可以用True和False(可用1代表True,0代表False) 进行逻辑运算,代替实数进行计算。
- 信号容易被干扰,计算机使用接近5V的电压为1,接近0V的电压是0,这样可以有效避免干扰,轻微的电压波动不会对数据的结果造成影响。
二进制与8421码
bit位
计算机中的一位二进制表示;
单个数字 1 或 0,1 位二进制数字命名为位(bit),也称1比特byte字节
1byte=8bit,即1byte代表8位数字。最早期的电脑为八位的,即以八位为单位处理数据。为了方便,将八位数字命名为1字节 (1byte)
二进制和十进制对比
十进制看每个数据的值和位置
从最右边开始,个位,十位,百位,千位
二进制的加法运算非常简单
跟十进制一样,按位相加,不过不是逢十进一了,而是逢二进一
计算机中常见的单位
8个bit
是一个byte
迅雷下载或者很多下载软件下载速度10M/s 准确的讲是10Mbit/s8个bit
才是一个byte
所以真是的下载速度是 1.25MB/s电信办的宽带是100M的,理论下载速度也只有12.5MB/s
32位和64位寻址空间
32位
的最大数为43亿左右
64位
的最大数为9.2*10^18
计算机如何存储二进制
计算机通过在内存中使用电子电路
来存储和操作二进制数据。这些电路可以根据二进制值的状态(0或1)来存储和传输数据。
计算机的码表
ASCII(American Standard Code for Information Interchange):ASCII是最早的字符编码表,用于将英语字符和控制字符映射到7位二进制数值(0-127)。它包含基本的拉丁字母、数字、标点符号和一些控制字符。
Unicode:Unicode是一种更为全面的字符编码标准,用于支持全球范围内的字符。它使用16位或32位二进制数值来表示字符,能够涵盖几乎所有的语言和符号。最常见的Unicode编码是UTF-8、UTF-16和UTF-32。
UTF-8(Unicode Transformation Format - 8-bit):UTF-8是一种变长编码,使用8位二进制数值来表示Unicode字符。它可以表示ASCII字符,同时也支持其他Unicode字符,根据需要使用1到4个字节。
UTF-16(Unicode Transformation Format - 16-bit):UTF-16使用16位二进制数值来表示Unicode字符。它可以表示ASCII字符和大部分常用字符,但对于较少使用的字符需要使用2个字节或4个字节。
Unicode编码
Unicode是一种全球字符编码标准,它为世界上几乎所有的字符和符号分配了唯一的标识码。Unicode旨在解决不同语言、文字和符号的字符表示问题。
Unicode编码使用16位或32位二进制数值来表示字符。最常见的Unicode编码是UTF-8、UTF-16和UTF-32。
UTF-8(Unicode Transformation Format - 8-bit)是一种变长编码,使用8位二进制数值来表示Unicode字符。它可以表示ASCII字符,同时也支持其他Unicode字符,根据需要使用1到4个字节。UTF-8是互联网上最常用的Unicode编码之一。
UTF-16(Unicode Transformation Format - 16-bit)使用16位二进制数值来表示Unicode字符。它可以表示ASCII字符和大部分常用字符,但对于较少使用的字符需要使用2个字节或4个字节。
UTF-32(Unicode Transformation Format - 32-bit)使用32位二进制数值来表示Unicode字符。它可以表示任何Unicode字符,并且每个字符都使用固定的4个字节。
二进制表示图片
每个像素在图片中都有一个对应的颜色值,这些颜色值可以用二进制数表示。比如,对于RGB(红绿蓝)颜色模型,每个像素的颜色由三个分量(红、绿、蓝)组成,每个分量占8位(1字节),总共24位(3字节)。通过将这些颜色值编码为二进制数据,可以表示整个图片。
0-255三原色
用0~255255255表示颜色数据
每一个像素点由RGB三种颜色组成。
声音信号的存储
声音采样每一时刻的震动幅度
采样:将声音信号按照一定的时间间隔进行采样,把每个时间点上声音信号的振幅
转换成数字数据
。采样率越高,转换出的数字数据越精确,但也需要更多的存储空间。
量化:将采样得到的连续的模拟信号
,转化为一系列的离散的数字化信号
。将振幅值转换为数字,常见的方法是将其按照一定的精度进行取样,通常使用16位或24位精度。
视频的二进制表示
视频 = 图片+ 声音
把图片+声音按照时间线存储起来,就是视频。
在数字视频中,视频帧被分解为数字像素
,并将每个像素表示为二进制数
。每个像素通常由三个分量表示: 红色、绿色和蓝色分量,即RGB值。每个分量通常使用8位二进制数 (即一个字节) 表示,因此每个像素由24位二进制数 (即三个字节) 表示。
视频的每一帧都由一系列像素组成。如果视频的分辨率为1920 x1080 (高清1080p),则每一帧将包含1920 x 1080 = 2073,600个像素。对于每个像素,计算机将RGB值编码为二进制数字,并将所有像素编码成一长串二进制数字序列。这个序列被存储在计算机的硬盘驱动器中,以便以后可以被读取和播放。
逻辑门电路
布尔运算是基于布尔代数的一种数学运算,它使用真和假值进行运算。
布尔运算包括逻辑与
、逻辑或
和逻辑非
。逻辑运算是电路设计中的运算,它和布尔运算类似,但是用于在电路中进行运算。逻辑运算包括与
、或
和非
。
布尔运算的基本运算符包括与(AND)
、或(OR)
、非 (NOT)
和异或(XOR)
。布尔运算的结果只有真或假两种可能,通常用于程序中的判断语句和逻辑控制。
逻辑门
是一种电路元器件,它能够执行一种或多种逻辑运算。
常见的逻辑门有: 与门 (AND gate)
、或门 (ORgate)
、非门 (NOT gate)
、异或门 (XOR gate)
等这些逻辑门通过接受一些输入信号,并根据逻辑运算规则产生一个输出信号。这些逻辑运算可以用来构建复杂的逻辑电路,实现各种各样的功能。
与门的搭建
AND
与门是计算机里面一种很特殊的门,它有两个输入,叫做A和B。如果A和B两个输入都是1,那么与门的输出就是1,否则输出就是0。与门的作用就像是一个开关,它能够根据两个输入的情况来决定是否让电流通过。
这里上拉电阻和下拉电阻问题后面会有说明
或门的搭建
OR
或门是计算机里面一种很特殊的门,它有两个输入,叫做A和B。如果A和B两个输入有一个是1,那么与门的输出就是1,否则输出就是0。或门的作用就像是一个开关,它能够根据两个输入的情况来决定是否让电流通过。
非门电路的搭建
NOT
异或门的电路搭建
XOR
4个基础门电路的原理图
与或非是计算机逻辑门的最基础的部件,其他任意的部件都可以通过与或非三种门来表示
基础门电路pcb的制作
ALU概念入门
ALU(Arithmetic Logic Unit)是计算机CPU中的算术逻辑单元
,它负责处理计算机中的数学运算和逻辑运算
。它可以执行基本的算术运算(加减乘除) 和逻辑运算(与或非),并且根据运算结果产生相应的输出。 ALU是CPU中最重要的部分之一,负责实现计算机的基本运算功能
半加器的电路搭建
全加器电路的搭建
8位加法器的实现
上拉电阻和下拉电阻
下拉电阻和上拉电阻是两种常见的电路连接方式,用于控制信号的电平。
下拉电阻
(Pull-down Resistor):将信号引脚连接到地(GND)或低电平的电阻。当信号未被外部输入时,下拉电阻会将信号引脚拉低至地或低电平
。这样可以确保信号引脚在未连接时保持稳定的低电平状态。
上拉电阻
(Pull-up Resistor):将信号引脚连接到电源电压(Vcc)或高电平的电阻。当信号未被外部输入时,上拉电阻会将信号引脚拉高至电源电压或高电平
。这样可以确保信号引脚在未连接时保持稳定的高电平状态。
下拉电阻和上拉电阻通常与开关、按钮、传感器等设备一起使用,以确保信号的稳定性。当设备处于未操作状态时,下拉电阻或上拉电阻会将信号引脚维持在特定的电平,避免信号漂浮或产生干扰。
计算机的溢出
溢出是指某物超过了容器的容量而溢出。
计算机溢出的概念:
内容: 在有限的空间内,无法存储位数过大的数,则称为溢出。
说明: 第8位的进位如果为1,则无法存储,此时容易引发错误,数据会归零,所以应该谨慎对待溢出。
计算机的补码表示
把一个正数的二进制按位取反,然后再加一就是负数的补码表示方法。
使用补码表示法的优点在于,补码还可以避免在数值0上的两种表示方式(+0和-0),因此更加方便和精确。
减法电路通过补码加法来实现
乘除法电路的实现
加法和减法都是用加法电路来完成。
乘法就是多次的加法
3x5就是3+3+3+3+3
除法就是多次的减法
10%3就是10-3-3-3
一直减到发现结果是小于等于0为止。
所以加减乘除都是同一套电路逻辑。
- 了解
Verilog和fpga(大规模逻辑阵列)
逻辑运算电路
NOT,AND,OR
等类型的电路逻辑运算电路就比较简单了.通过与门或门,非门电路来实现。
另外一个重要的电路是零检测电路
,检测一个数据是不是0
。
零检测电路,只需要把所有的数据进行或运算即可.
计算器和计算机的区别
我们可以把CPU的ALU抽象成一种符号
作用: ALU的抽象让工程师不再考虑细节层面的组成,简化工作。
图示内容包括:
- 输入A,B和opcode
- 输出 out
- 标志flag: 溢出标记、零标记
计算机可以编程,计算器不能编程
用电去存储电信号
计算机要运行复杂程序,必须要能记忆数据
锁存器
与门可以存储下来0, 或门可以存储下来1,我们把与门和或门进行一个组合,就能做出来第一个有用的电路结构。
Din data in
数据输入
WEwrite enable
当WE为高电平的时候,Din的数据可以被存储起来
当WE为低电平的时候,out的值不发生变化。
带边缘触发的锁存器
寄存器 = 8位锁存器/16/32位
一次可以存储8位数据。
Din data in数据输入
WE write enable
当WE为高电平的时候,Din的数据可以被存储起来
当WE为低电平的时候,out的值不发生变化
输出使能开关
CPU需要clock来同步内部操作,如执行指令、进行数据传输等。Clock 提供了精确的时间控制,确保每个内部操作在正确的顺序与速度内执行,从而确保 CPU 的正常工作。另外,Clock 还与 CPU 的频率相关,通过控制 Clock频率,可以控制 CPU 的速度。
时钟信号是什么:
- 时钟信号就是
周期性的高低电平变化的信号
我们可以用两个普通的寄存器加上一个非门,组成一个带有边缘触发的奇存器。
在按钮按下的一瞬间,电压从低电平到高电平的一瞬间,Din的数据被存储起来
并行转串行的原理
内存地址:从并行到串行
先设计一个内存单元格,内存单元格要知道自己在哪一行和哪一列,需要有row和column
内存单元要有ld (load) 读的控制
内存单元要有str (store) 存的控制
内存单元要有数据的输入
实际内存的结构
行和列的位置就是内存地址
我们采用二进制去描述行和列的位置
从而定位到特定的内存单元格
就可以完成内存的读写操作
计算机系统的核心组件
ALU (算术逻辑单元)
: ALU是CPU的核心组件,负责执行所有算术和逻辑操作,如加、减、乘、除、与、或、非、异或等。
寄存器
: 寄存器是CPU中的存储器件,用于存储数据和指令。CPU需要许多寄存器来存储不同类型的数据和指令。
内存
: 内存是CPU中的另一个重要组件,它用于存储程序和数据。CPU需要一个内存管理单元来管理内存的读写操作。
时钟
: 时钟是CPU中的一个电子组件,它提供CPU的时序信号,确保所有操作都按照正确的时序执行。
控制单元
: 控制单元是 CPU中 的重要组件,它控制数据和指令在 CPU内部 的流动,并确保它们按照正确的顺序被执行。
CPU内部原理图ALU部分
汇编语言和指令集
汇编语言是对机器指令的文字版抽象,方便我们更容易的理解机器指令,汇编语言由操作码
和操作数
组成
0000 LOAD_A
0001 LOAD_B
0010 ADD
0011 STORE
cpu指令集 汇编语言 LOADA,LOADB,ADD,STORE详细作用描述
内存模块的使用
EPROM和Flash都是可编程只读存储器(Programmable Read-Only Memory,PROM)
的类型,它们都可以用于存储程序代码和其他类型的数据。
可编程可擦除只读存储器 (Erasable ProgrammableRead Only Memory,EPROM) 是一种可写可读的存储器。用户可根据需要来写入,并能把已写入的内容擦去后再改写的ROM。这种存储器擦除原内容的方法很有特点,可以使用点的方法,也可以采用紫外线照射的方法进行擦除数据。
Flash可以通过电子方式进行擦除,这种擦除方式称为电子擦除 (Electrical Erase),通常使用高电压或者脉冲电压来擦除数据
。
这两种存储掉电都会保存,现代单片机的存储代码很多是用flash来实现。
CPU与内存的连接
CPU执行程序的流程:包含取指和执行两个周期
取指周期:
- 把PC(程序位置计数器) 的值放入MAR(内存地址寄存
- PC的值加1,指向下一条程序指令
- 把MAR地址指向的内存中的数据取出来 (操作码+操作数)放入MBR(内存缓存寄存器)
- 把MBR中的数据放入IR (指令寄存器)
执行周期:
- decode操作码
- 根据操作码确定是LOAD_A还是LOAD_B还是add还是
store指令 - 不同的指令对应不同的操作
手动执行第一条机器指令load_A,完成3加5的流程
微操作汇总
取指阶段-全部相同
- 把PC (程序位置计数器) 的值放入MAR(内存地址寄存器)
- PC的值加1,指向下一条程序指令
- 把MAR地址指向的内存中的数据取出来 (操作码+操作数) 放入MBR (内存缓存寄存器)
- 把MBR中的数据放入IR (指令寄存器)
第0步: 清除全部状态,打开PC的OE,打开MAR的WE
第1步: 清除全部状态,打开PC的EN
第2步: 清除全部状态,打开MAR的OE,打开内存的OE,打开MBR的WE
第3步: 清除全部状态,打开MBR的OE,打开IR的WE
译码和执行阶段 OPCODE为0000
OPCODE为0000,意味着是MOVE_A,把内存地址的值放入A寄存器
第0步: 清除全部状态,打开IR的OE ,打开MAR的WE
第1步: 清除全部状态,打开MAR的OE,打开内存的OE,打开MBR的WE
第2步: 清除全部状态,打开MBR的OE,打开RegA的WE
译码和执行阶段 OPCODE为0001
OPCODE为0001,意味着是MOVE_B,把内存地址的值放入B寄存器
第0步: 清除全部状态,打开IR的OE ,打开MAR的WE
第1步: 清除全部状态,打开MAR的OE,打开内存的OE,打开MBR的WE
第2步: 清除全部状态,打开MBR的OE,打开RegB的WE
译码和执行阶段 OPCODE为0010
OPCODE为0010,意味着是ADD,寄存器A和B的数值相加
第0步: 清除全部状态,打开RegA的OE ,打开RegB的OE,打开ALU的OE,打开Output Reg的WE
译码和执行阶段 OPCODE为0011
OPCODE为0011,意味着是STORE,把Output Reg的内容存入内存
第0步:
清除全部状态,打开IR的OE打开MAR的WE打开Out.reg的OE 打开MBR的WE
第1步:
清除全部状态,打开MAR和MBR的OE,打开内存的WE
https://blog.csdn.net/m0_63398413/article/details/128819277
后门和漏洞
后门
是在设计CPU或者芯片的时候,故意定义一些非公开的指令集或者接口用来收集用户的数据和信息。后门是人品问题
。漏洞
是在设计CPU的过程中由于设计者的疏忽,导致攻击者利用非常规手段获取非正常的访问权限,漏洞是水平问题
。
要想消除CPU的隐患,只能是不受制于人,自己拥有核心技术,使用risc-V
这种开源的架构和指令集,自己设计CPU的ip核、用自己的CPU才能消除这种隐患。
光刻工艺
改进 (提升CPU的性能)减少电路状态的切换时间
,提升CPU的速度
,例如把继电器升级到电子管 再升级成晶体管,减少集成电路的大小和体积。
电路长度减少一倍,运算速度就可以提升一倍。
给CPU设计专门的电路做复杂运算,比如说除法电路,乘法电路,游戏中的渲染电路,追光电路,视频解码电路(MMX,3DNOW,SSE处理器)
流水线技术
缓存(提高数据传输速率)
在CPU的内部设计一小块内存,称为缓存,让RAM中的数据,一次性传递一批到CPU中,提升数据传输的效率。提升缓存命中算法效率
高级CPU技术
其他技术:
堆叠套娃,多核CPU,一个CPU芯片,多个独立的处理单元,共享资源,同时运行多条指令流。
一台计算机中,使用几百万个CPU,可以做非常复杂的运算,模拟宇宙的形成,中国的:神威-太湖之光
软硬件生态系统
指令集就是机器语言支持哪些指令
指令集是指一组计算机程序可以执行的指令的集合。这些指令包括了进行基本运算和数据传输的指令,以及控制计算机程序流程和执行条件语句的指令。指令集是计算机系统的基础,每种计算机都有自己的指令集。指令集架构是指CPU所支持的指令集的类型和体系结构。
每一颗芯片都是从指令集开始设计的,苹果公司的M1芯片和intel芯片所采用的指令集是不同的,指令集不相同会导致两个平台下的软件不能兼容运行,所以苹果系统上的软件是不能在基于intel的Windows上运行的。
CPU家族庞大,种类众多,根据不同的方式可以分类按照功能分类:
- 专用CPU
- 通用CPU
按照使用场景分类
- 科学计算CPU (TPU)
- 信息化设备CPU (Intel,AMD)
- 移动计算CPU (高通,华为麒麟)
- 嵌入式CPU (stm32,gd32)
- 微控制器CPU(单片机)