ENCE260 DataIO 嵌入式系统
AVR架构框图
关键概念
- 哈佛架构:
- 哈佛架构是一种将 指令(程序代码) 和 数据 存储在独立的存储空间中的计算机体系结构。这种架构允许同时访问指令和数据,从而提高处理性能。
- 数据总线(8位):
- 图中显示了一个8位的数据总线。这意味着微控制器一次可以处理8位的数据。
除了哈佛架构外,另一个常见的计算机架构是 冯·诺依曼架构(Von Neumann Architecture)。以下是这两种架构的对比表格:
特性 | 哈佛架构 | 冯·诺依曼架构 |
---|---|---|
内存结构 | 指令存储和数据存储分开 | 指令和数据存储在同一个内存空间 |
总线 | 有独立的数据总线和指令总线 | 共享一个单一的总线用于数据和指令 |
并行性 | 可以同时读取指令和数据,提高效率 | 指令和数据需排队处理,可能会影响性能 |
复杂度 | 设计较复杂,需要更多的硬件资源 | 设计相对简单,硬件需求较少 |
成本 | 硬件资源多,成本通常较高 | 硬件简单,成本较低 |
数据吞吐量 | 数据和指令可以同时传输,吞吐量高 | 数据和指令通过同一总线传输,可能导致瓶颈 |
缓存 | 通常有指令缓存和数据缓存 | 通常只有一个通用缓存 |
典型应用 | 应用于需要高性能的嵌入式系统 | 适用于一般计算任务和传统计算机架构 |
例子 | AVR、DSPs、ARM Cortex-M 系列 | 传统PC、微处理器(如x86架构) |
总结
- 哈佛架构:指令和数据分离,能够并行处理,提高性能,但设计复杂,成本较高。常用于嵌入式系统和数字信号处理等需要高效数据处理的领域。
- 冯·诺依曼架构:指令和数据共享同一存储器和总线,设计简单,成本低,但可能存在性能瓶颈。广泛用于传统计算机和普通处理器。
主要组件解释
- Flash程序存储器:
- 这是用于存储程序代码的非易失性存储器。即使断电,Flash存储器中的数据也不会丢失。
- 程序计数器(Program Counter):
- 程序计数器是一个特殊的寄存器,用于保存下一条将被执行的指令的地址。它用于按顺序从Flash存储器中获取程序指令。
- 指令寄存器和解码器:
- 指令寄存器暂时存储从Flash存储器中获取的指令。
- 指令解码器解释这条指令,并决定微控制器应采取的操作。
- 通用寄存器(32 x 8):
- AVR架构中有一组 32个通用寄存器,每个寄存器都是8位宽,用于在计算过程中临时保存数据。
- 这些寄存器使数据操作和算术运算更高效。
- 算术逻辑单元(ALU):
- ALU负责执行算术运算(如加减法)和逻辑运算(如AND、OR、NOT)。运算结果会存储回通用寄存器。
- 数据SRAM(静态RAM):
- SRAM用于临时数据存储。与Flash存储器不同,SRAM在断电时会丢失数据。
- EEPROM:
- EEPROM是一种非易失性存储器,即使断电也能保存数据。通常用于存储需要在电源关闭后保留的少量数据(例如配置设置)。
- I/O模块和线路:
- 图中展示了多个I/O模块和I/O线路。这些是微控制器与外部设备(如传感器、LED、通信模块等)进行交互的接口。
- 中断单元(Interrupt Unit):
- 中断单元是嵌入式系统中的一个重要功能,允许微控制器在响应外部或内部事件(如计时器达到特定值)时暂停当前任务,去执行其他任务。
- SPI单元(串行外围接口):
- SPI是一种通信协议,用于在短距离内连接微控制器与外围设备(如传感器或存储卡)。它是一种同步串行通信方式。
- 看门狗计时器(Watchdog Timer):
- 这是一种安全功能,如果检测到软件无响应或进入死循环时,看门狗计时器会重置微控制器。
- 模拟比较器(Analog Comparator):
- 这个模块比较两个模拟输入电压,并生成一个数字信号来指示哪个电压较高。通常用于阈值检测等应用。
控制流与寻址方式
直接寻址和间接寻址:
- 在 直接寻址 中,指令会直接指定数据的内存地址。
- 在 间接寻址 中,寄存器保存了数据的地址,从而提供了更灵活的内存访问方式。
1. 直接寻址
- 定义:在直接寻址中,指令会直接提供数据所在的内存地址。
- 类比:就好像你在书的目录里找到了一个页面的确切页码,然后你直接翻到那个页码去获取内容。
- 例子:假设一条指令是
LOAD A, 1000
,它的意思是从内存地址1000
读取数据,然后放入寄存器A
。这里的1000
是明确指定的内存地址,所以称为直接寻址。
2. 间接寻址
- 定义:在间接寻址中,指令中提供的是一个寄存器或内存单元的地址,这个地址再指向真正的数据位置。
- 类比:就好像你在书的目录里找到了一段描述,而这段描述指引你去另一个地方去拿到书的页码,最后你再根据这个页码去找内容。
- 例子:假设一条指令是
LOAD A, (R1)
,其中R1
是一个寄存器,寄存器R1
里保存的是1000
这个地址。所以这条指令的意思是从寄存器R1
里取出地址1000
,然后再去这个地址获取数据,最后放入寄存器A
。这里的地址是“间接”获取的,所以称为间接寻址。
对比总结
- 直接寻址:指令直接告诉你数据在哪个内存地址。
- 优点:简单、快速。
- 缺点:灵活性较差,因为地址是固定的。
- 间接寻址:指令通过一个中间地址来找到数据的实际位置。
- 优点:灵活,可以动态改变数据位置。
- 缺点:稍微复杂,需要额外的一步来获取最终地址。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Vincent's Blog!