哈佛结构与普林斯顿结构❗

计算机体系结构主要分为两种:哈佛结构和冯诺依曼结构(也称普林斯顿结构)。

冯诺依曼(普林斯顿)结构

  • 特点:
    • 程序和数据存储在同一个存储器中,使用同一个地址空间
    • 程序和数据共用一条总线

哈佛结构

  • 特点:
    • 程序和数据存储在不同的存储器中,使用不用的地址空间
    • 程序和数据使用独立的总线

80C51采用哈佛结构,这使得它能够同时访问程序存储器和数据存储器,提高了执行效率。
Cortex-M3/4可视为改良的哈佛结构。对外呈现统一的地址空间(冯诺依曼特点),内部则通过分离总线实现指令和数据的并行访问

80C51存储器(哈佛结构)映像图❗

notion image
 
  1. 物理上有 4 个存储器空间:
      • 程序存储器(ROM):
        • 片内程序存储器(4KB)
        • 片外程序存储器(64KB)
      • 数据存储器(RAM):
        • 片内数据存储器(256B)
        • 片外数据存储器(64KB)
  1. 逻辑上有 3 个存储器地址空间:
      • 片内、片外统一的 64 KB 程序存储器地址空间。
      • 片内 256 B 数据存储器地址空间
        • 包括片内RAM特殊功能寄存器SFR
      • 片外64KB的数据储存器地址空间
💡
这是因为:PC(程序计数器)、DPTR(数据指针)都是16位的,可以寻址64KB的地址空间

2.4.1 程序储存器❗

片内片外两部分

CPU访问片内和片外存储器,可由(External Access)引脚所接的电平来确定:
  • 引脚接高电平时:**程序从片内程序存储器0000H开始执行,即访问片内存储器;当PC值超出片内ROM容量时,会自动转向片外程序存储器空间执行。
    • 当PC值超出片内ROM容量时,8051单片机会从片外程序存储器中与超出值相对应的地址开始执行,而不是从片外的0000H开始执行
  • 引脚接低电平时:**迫使系统全部执行片外程序存储器0000H开始存放的程序

程序存储器的某些单元被保留用作特定程序的入口地址

  • *系统复位:**PC地址为0000H,系统从0000H单元开始取指,执行程序。通常在该单元设置一条绝对转移指令,转向用户主程序。
  • *初始单元:**0000H~0002H单元保留用于初始化。
  • *中断服务程序入口地址:**0003H~002DH单元保留用于5个中断源的入口地址,共6个特定地址:
      • 复位:0000H
      • 外部中断0:0003H
      • 计时器T0溢出:000BH
      • 外部中断1:0013H
      • 计时器T1溢出:001BH
      • 串行口中断:0023H
因此,主程序一般跳转到0030H以后执行。一个8051程序典型结构如下:

片内程序存储器

notion image
notion image

2.4.2内部数据储存器(RAM)❗

  • 数据存储器分类:
    • 片内数据存储器(IRAM):由随机存储器RAM构成,存放随机数据。
    • 片外数据存储器(ERAM):扩展的数据存储器。
  • 片内数据存储器特点:
    • 地址为8位,最大寻址范围为256个字节。
    • 所以一个普通的8位寄存器就可以存放内部数据的地址
  • 片外数据存储器特点:
    • 通过数据指针DPTR访问,DPTR为16位寄存器。
    • 可扩展至64KB的存储器容量。
片内和片外一部分地址空间是重合的,通过指令来区分(MOV/MOVX)

片内数据存储器

工作寄存器区()❗

0-31(00H-0FH),共32个单元,是4个通用寄存器组每组包含8个通用寄存器
在某一时刻,只能选用一个寄存器组使用。其选择是通过软件对程序状态字(PSW)中的RS0、RS1两位的设置来实现的。设置RSO、RS1时,可以对PSW字节寻址,也可用位寻址方式,间接或直接修改RSO、RS1的内容。通常采用后者较方便。
字节寻址方式:
这段代码展示了如何通过字节寻址方式修改PSW。
位寻址方式:

位寻址区❗

片内数据存储器区的32~47(20H~2FH)的16个字节单元,共包含16*8=128位,是可位寻址的存储器区。这16个字节单元既可以进行字节寻址,又可位寻址。
这16个位寻址单元,再加上可位寻址的特殊功能寄存器(128位)一起构成了布尔(位)处理器的数据存储器空间(共256位)
位寻址只是一种逻辑上的寻址方式(内置的读-写-改机制),不会直接受到物理地址线的约束。CPU的寻址总是以字节为单位的
这样我们就可以直接操作20H字节中的任意一位。
NOTE THAT:位地址00H和工作寄存器区的字节地址00H在数值上重复,但是可以通过指令加以区分(对字节的指令/对位的指令)位地址只能用于位操作指令,例如:
notion image

字节寻址区❗

从片内数据存储器区的48~127(30H~7FH),共80个字节单元,(只)可以采用直接字节寻址的方法访问。

堆栈区及堆栈指示器SP

SP(stack pointer)是一个在80C51中存放当前的堆栈栈顶所存储的单元地址的8位寄存器
  • 80C51的堆栈是向上生成的,后进先出
  • 系统复位后,SP的内容为07H❗。如果不重新定义,则以07H为栈底,压栈的内容从08H开始存放(工作寄存器组1的位置)
    • 这就意味着:
      如果程序在复位后 没有 重新定义 SP,并且 切换 到了 Bank 1 (通过修改 PSW 寄存器),那么 使用 Bank 1 的寄存器执行压栈操作 将会使用 同一片内存区域 (08H 开始),从而导致数据相互覆盖和程序错误。

特殊功能寄存器SFR区❗

在80C51系列单片机的128 B特殊功能寄存器(SFR)空间中,虽然只定义了20个特殊功能寄存器,但这些寄存器大都被有意地安排在以8结尾的地址上其余未使用的地址是保留的,这样做有两个主要目的:
  1. 未来扩展预留空间,便于后续开发新的功能寄存器
  1. 简化了硬件译码电路的设计,因为所有特殊功能寄存器的地址最低三位都是0
  1. 方便位地址的定义
从图片中可以看到,SFR区域占用80H-FFH的地址空间,但只有少数特定地址被实际使用,其他地址是不可访问的。如果程序试图访问这些未定义的地址,将会得到未定义的结果。
 
标红色的是可以位寻址的区域
标红色的是可以位寻址的区域
notion image
  • 这里的字节地址和位地址恰好是对应的,显然在硬件设计上有特殊的考虑
  • 从表中可以看出,一些可以位寻址的位还有自己的特殊名称,例如:PSW.7(按位访问)=D7H(位地址)=CY(特殊名称)

2.4.3片外数据存储器

  • 在外部存放数据的区域
  • 只能用寄存器间接寻址的方法访问
    • 所用寄存器为:DPTR,R1,R0
notion image
使用R0间接寻址外部数据存储器的示例代码:
注意事项:
  • 使用MOVX指令访问外部数据存储器
  • R0可以寻址范围为0-255(因为R0是8位)
  • @R0表示R0中存放的是地址,这是间接寻址的标志
Loading...