AVR架构框图

关键概念

  1. 哈佛架构
    • 哈佛架构是一种将 指令(程序代码)数据 存储在独立的存储空间中的计算机体系结构。这种架构允许同时访问指令和数据,从而提高处理性能。
  2. 数据总线(8位)
    • 图中显示了一个8位的数据总线。这意味着微控制器一次可以处理8位的数据。

除了哈佛架构外,另一个常见的计算机架构是 冯·诺依曼架构(Von Neumann Architecture)。以下是这两种架构的对比表格:

特性 哈佛架构 冯·诺依曼架构
内存结构 指令存储和数据存储分开 指令和数据存储在同一个内存空间
总线 有独立的数据总线和指令总线 共享一个单一的总线用于数据和指令
并行性 可以同时读取指令和数据,提高效率 指令和数据需排队处理,可能会影响性能
复杂度 设计较复杂,需要更多的硬件资源 设计相对简单,硬件需求较少
成本 硬件资源多,成本通常较高 硬件简单,成本较低
数据吞吐量 数据和指令可以同时传输,吞吐量高 数据和指令通过同一总线传输,可能导致瓶颈
缓存 通常有指令缓存和数据缓存 通常只有一个通用缓存
典型应用 应用于需要高性能的嵌入式系统 适用于一般计算任务和传统计算机架构
例子 AVR、DSPs、ARM Cortex-M 系列 传统PC、微处理器(如x86架构)

总结

  • 哈佛架构:指令和数据分离,能够并行处理,提高性能,但设计复杂,成本较高。常用于嵌入式系统和数字信号处理等需要高效数据处理的领域。
  • 冯·诺依曼架构:指令和数据共享同一存储器和总线,设计简单,成本低,但可能存在性能瓶颈。广泛用于传统计算机和普通处理器。

主要组件解释

  1. Flash程序存储器
    • 这是用于存储程序代码的非易失性存储器。即使断电,Flash存储器中的数据也不会丢失。
  2. 程序计数器(Program Counter)
    • 程序计数器是一个特殊的寄存器,用于保存下一条将被执行的指令的地址。它用于按顺序从Flash存储器中获取程序指令。
  3. 指令寄存器和解码器
    • 指令寄存器暂时存储从Flash存储器中获取的指令。
    • 指令解码器解释这条指令,并决定微控制器应采取的操作。
  4. 通用寄存器(32 x 8)
    • AVR架构中有一组 32个通用寄存器,每个寄存器都是8位宽,用于在计算过程中临时保存数据。
    • 这些寄存器使数据操作和算术运算更高效。
  5. 算术逻辑单元(ALU)
    • ALU负责执行算术运算(如加减法)和逻辑运算(如AND、OR、NOT)。运算结果会存储回通用寄存器。
  6. 数据SRAM(静态RAM)
    • SRAM用于临时数据存储。与Flash存储器不同,SRAM在断电时会丢失数据。
  7. EEPROM
    • EEPROM是一种非易失性存储器,即使断电也能保存数据。通常用于存储需要在电源关闭后保留的少量数据(例如配置设置)。
  8. I/O模块和线路
    • 图中展示了多个I/O模块和I/O线路。这些是微控制器与外部设备(如传感器、LED、通信模块等)进行交互的接口。
  9. 中断单元(Interrupt Unit)
    • 中断单元是嵌入式系统中的一个重要功能,允许微控制器在响应外部或内部事件(如计时器达到特定值)时暂停当前任务,去执行其他任务。
  10. SPI单元(串行外围接口)
    • SPI是一种通信协议,用于在短距离内连接微控制器与外围设备(如传感器或存储卡)。它是一种同步串行通信方式。
  11. 看门狗计时器(Watchdog Timer)
    • 这是一种安全功能,如果检测到软件无响应或进入死循环时,看门狗计时器会重置微控制器。
  12. 模拟比较器(Analog Comparator)
    • 这个模块比较两个模拟输入电压,并生成一个数字信号来指示哪个电压较高。通常用于阈值检测等应用。

控制流与寻址方式

直接寻址和间接寻址

  • 直接寻址 中,指令会直接指定数据的内存地址。
  • 间接寻址 中,寄存器保存了数据的地址,从而提供了更灵活的内存访问方式。

1. 直接寻址

  • 定义:在直接寻址中,指令会直接提供数据所在的内存地址。
  • 类比:就好像你在书的目录里找到了一个页面的确切页码,然后你直接翻到那个页码去获取内容。
  • 例子:假设一条指令是 LOAD A, 1000,它的意思是从内存地址 1000 读取数据,然后放入寄存器 A。这里的 1000 是明确指定的内存地址,所以称为直接寻址。

2. 间接寻址

  • 定义:在间接寻址中,指令中提供的是一个寄存器或内存单元的地址,这个地址再指向真正的数据位置。
  • 类比:就好像你在书的目录里找到了一段描述,而这段描述指引你去另一个地方去拿到书的页码,最后你再根据这个页码去找内容。
  • 例子:假设一条指令是 LOAD A, (R1),其中 R1 是一个寄存器,寄存器 R1 里保存的是 1000 这个地址。所以这条指令的意思是从寄存器 R1 里取出地址 1000,然后再去这个地址获取数据,最后放入寄存器 A。这里的地址是“间接”获取的,所以称为间接寻址。

对比总结

  • 直接寻址:指令直接告诉你数据在哪个内存地址。
    • 优点:简单、快速。
    • 缺点:灵活性较差,因为地址是固定的。
  • 间接寻址:指令通过一个中间地址来找到数据的实际位置。
    • 优点:灵活,可以动态改变数据位置。
    • 缺点:稍微复杂,需要额外的一步来获取最终地址。