AVR Studio: Simulator User's Guide

仿真器用户手册

这一小节主要介绍除了AVR Studio用户指南中提到的默认设置外，AVR Studio内部软件仿真器的功能特点。

这套软件仿真器支持所有的现有 AVR 器件。它不仅能够仿真 CPU 的行为，而且可以仿真几乎所有的片上 I/O 模块和存储单元以及 I/O 端口。我们应当特别注意的是必须确保器件得到适当的仿真，而且仿真结果与实际的操作只有一些细小的差别。 软件仿真不需要与外部硬件相连接，而是根据事先计算好的激励信号描述文件进行仿真。但是当所有的PC存储单元都被仿真完毕后，用户还需进一步进行所有的片上功能的仿真。

无法支持的功能和模块有：
SPM 指令
休眠指令
ADC (支持中断)
模拟比较器 (支持中断)
TWI
USART (支持与 UART 的兼容)
看门狗
锁定位和熔丝位
定时器的异步时钟选项
ATmega128可以设置成ATmega103工作方式，仿真中不支持ATmega128的这种工作方式

自动检测平台
如果 AVR Studio 无法成功识别外部硬件仿真器， 就会以内部的软件仿真加以替代。

请注意，这一小节介绍的只是 AVR Studio默认设置以外的功能。如需了解基本功能说明，请参看 AVR Studio 用户指南。

帮助标题
仿真器选项卡
I/O 模块仿真器
端口记录及激励
跟踪缓冲区内容
存储单元窗口
I/O终端窗口
参看
返回主目录


AVR Studio: Simulator Options

仿真器选项卡
仿真器具有各种选项卡。如果在菜单选项中选择了仿真器选项一栏，则仿真器选项对话框将在屏幕上弹出显示。仿真器选项隔一段时间就作一回记录。任何数值的改变都会导致AVR Studio强制执行复位命令。

器件
在仿真器选项卡对话框中，用户可以在9个不同的标准配置中任选其一。一旦选定了某个标准配置，存储单元大小和结构上的细节都会自动被填写。用户也可以根据需要进行自定义配置。

参看

  • 用户自定义器件选项卡
  • 仿真器 I/O 模块
  • 仿真器用户手册


AVR Studio: Custom Device Options

用户自定义选项卡
如果选择用户自定义配置，用户就被允许在存储单元区和构造区输入数值。这对于使用硬件仿真平台之前进行的 ASIC 器件软件仿真是非常有用的。

程序存储单元
程序存储单元大小是以字来计算的。可输入的最大值为 65536 (64 K 字) 。

数据存储单元
数据存储单元的大小是以字节来计算的。最大输入值为 65536 (64 K 字节) 。数据存储单元内的数值就是SRAM 的最高地址，可以用来对 SRAM 进行寻址。必须将SRAM 的空间大小计算在内，才能得出寄存器文件和I/O区（如果映射在 SRAM 区）的准确空间大小。

EEPROM 存储单元
EEPROM 存储单元大小是以字来计算的。 最大输入值为 65536 (64 K 字节) 。EEPROM 地址寄存器的位数刚好够您所需大小的EEPROM的寻址。

I/O 数量
I/O 数量是以字节来计算的。 所允许的 I/O 数量为: 64, 128 和 256。

硬件堆栈
用户可以选择仿真器是否使用硬件堆栈。如果硬件堆栈被选用，用户可以设置硬件堆栈的值。

寄存器文件
AVR核心有32个通用寄存器，用户不可以设置通用寄存器的数量。

存储器映射I/O
用户可以选择是否能在SRAM的地址空间对I/O端口进行寻址。如果能在SRAM区寻址I/O端口，I/O端口占用的空间应为0x20及其以上地址空间。

参看

  • 仿真器选项卡
  • I/O 模块仿真器


AVR Studio: Simulator I/O Modules

I/O 模块仿真器

端口
端口的仿真就像在实际器件上运行的那样。 在实际的AVR器件中标准的端口逻辑硬件仿真要考虑到1.5 个时钟周期的消抖延时。当一个 I/O 模块控制一个引脚时，从PINx 的寄存器中读到的数值是由该I/O模块产生的。

定时器/计时器0
软件仿真器支持对定时器/计数器0的仿真。如果已经选择了一个标准器件，相应的定时器/计数器0的溢出中断向量和外部计数引脚都被自动设置。若是选择了一个用户自定义器件，定时器/计数器0的溢出中断向量和外部计数引脚将按照AT90S1200来设置。

定时器/计时器1
软件仿真器支持对定时器/计数器1的仿真。如果已经选择了一个标准器件，相应的定时器/计数器1的中断向量、外部计数引脚和输入捕捉引脚以及输出引脚都会被自动设置。对于器件 AT90S8515 和 AT90S4414 来说， 引脚PD4的ICP功能和引脚PD6的OC1B功能将被使能。 若是选择了一个用户自定义器件，定时器/计数器1将不作显示。

定时器/计时器2
软件仿真器支持对定时器/计数器2的仿真。如果已经选择了一个标准器件，且这个器件支持定时器/计数器2，则定时器/计数器2的中断向量，外部计数引脚和输出引脚被自动设置。若是选择了一个用户自定义器件，定时器/计数器2将不作显示。异步操作也无法支持。

UART
软件仿真器支持对 UART 的仿真。如果已经选择了一个标准器件，且这个器件支持 UART ，则相应的 UART 中断向量表和接收/发送引脚将被自动设置。向 UART 数据寄存器 (UDR) 写入数据不会启动数据发送。数据寄存器必须由目标应用程序来写入。若是选择了一个用户自定义器件，UART 将不作显示。当前不支持 USART。

SPI
软件仿真器支持对SPI的仿真。 如果已经选择了一个标准器件，且这个器件支持 SPI ，则相应的 SPI 中断向量表和SCK/MISO/MOSI/SS 等引脚将被自动设置。SPI 数据寄存器是指 SPI 的接收寄存器。 即使在主机模式 SPI 被使能的情况下，编辑 SPI 数据寄存器也不会启动数据发送。数据寄存器必须由目标应用程序来写入。若是选择了一个用户自定义器件，SPI 将不作显示。

外部中断
软件仿真器支持对外部中断的仿真。如果已经选择了一个标准器件，外部中断会被自动设置。若是选择了一个用户自定义器件，就AT90S1200而言只有一个外部中断可以使用。

EEPROM
软件仿真器支持对 EEPROM 的仿真。简而言之，完成一个写操作的时间在软件仿真中被设定为16个时钟周期，这比实际器件所花的时间要短的多。若是选择了 AT90S1200 或是一个用户自定义器件，EEPROM的写入与其它AVR器件不同，不按照安全写入顺序来操作。

EEPROM 中断
软件仿真器支持对 EEPROM 中断，WE 和 WEE 的仿真。若是选择了一个用户自定义器件，EEPROM中断将不作显示。

参看

  • 用户自定义器件选项卡
  • 仿真器选项卡


AVR Studio: Port Logging and Stimuli

端口记录及激励

端口记录
用户可以记录输出端口的各种行为。如果在菜单选项中选择了仿真器端口记录一栏，则记录文件对话框将在屏幕上弹出显示。

用户必须选择记录哪些端口。一旦选择了一个端口，用户就得选择存放记录数据的文件。其内容包括端口、端口寄存器等。记录文件的每一行都按照以下格式：周期：数据。周期记录区的数据是十进制的，而数据记录区的是十六进制的。如果在一个周期内寄存器中的内容不改变，则不产生输出。

每当程序被复位后，记录文件都会被删除。每次AVR Studio中加载程序，记录过程均要进行手动激活。

外部激励
用户可以设置端口值。若是在菜单选项中选择了仿真器端口激励一栏，则激励文件对话框将在屏幕上弹出显示。

如果选用了一个端口，用户必须指明激励信号描述文件存放的位置。 在特定的执行周期内，可以将激励信号描述文件中的数值写入特定端口的引脚寄存器内。激励信号描述文件的格式与端口记录文件相同。请注意，仅当引脚被设置为输入的时候才能生效。

激励信号描述文件的最后一行必然是这样的形式：9999999999 ：FF ，否则会出错。（译者：原英文中有段A large number before the :FF，本人认为该句无关紧要，所以略去）

参看

  • 仿真器用户指南


AVR Studio: Contents of Trace Buffer

基于指令的跟踪缓冲区内容
从前一部分我们可以看到，不同指令的执行对应不同列的内容。这一部分讲述了如何解释跟踪缓冲区的内容，其内容是基于执行何条指令的。

所有的解释都标有号码。这个数字表明在指令执行过程中的周期数(只对多周期执行指令有意义)。N/A 是指这个区域不包含任何有效值信息。

算术和逻辑指令

指令 | 程序存储单元地址 | 寄存器值 | 数据地址 | 数据值
ADD Rd,Rr | 指令地址 | 和值 | N/A | N/A
ADC Rd,Rr | 指令地址 | 和值 | N/A | N/A
SUB Rd,Rr | 指令地址 | 差值 | N/A | N/A
SUBI Rd,K | 指令地址 | 差值 | N/A | N/A
SBC Rd,Rr | 指令地址 | 差值 | N/A | N/A
SBCI Rd,K | 指令地址 | 差值 | N/A | N/A
AND Rd,Rr | 指令地址 | 逻辑与值 | N/A | N/A
ANDI Rd,K | 指令地址 | 逻辑与值 | N/A | N/A
OR Rd,Rr | 指令地址 | 逻辑或值 | N/A | N/A
ORI Rd,K | 指令地址 | 逻辑或值 | N/A | N/A
EOR Rd,Rr | 指令地址 | 逻辑异或值 | N/A | N/A
COM Rd | 指令地址 | 取反值 | N/A | N/A
NEG Rd | 指令地址 | 取补值 | N/A | N/A
SBR Rd | 不会出现 (反汇编成 ORI 指令) | N/A | N/A | N/A
CBR Rd | 不会出现 (反汇编成 ANDI 指令) | N/A | N/A | N/A
INC Rd | 指令地址 | 增加值 | N/A | N/A
DEC Rd | 指令地址 | 减小值 | N/A | N/A
TST Rd | 不会出现 (反汇编成 AND 指令) | N/A | N/A | N/A
CLR Rd | 指令地址 | 运算值 (总为 0x00) | N/A | N/A
SER Rd | 不会出现 (反汇编成 LDI 指令) | N/A | N/A | N/A
ADIW Rdl,K | 1. 指令地址 2. 下一条指令地址 | 1. 和值的低字节 2. 和值的高字节 | 1. N/A 2. N/A | 1. N/A 2. N/A
SBIW Rdl,K | 1. 指令地址 2. 下一条指令地址 | 1. 差值的低字节 2. 差值的高字节 | 1. N/A 2. N/A | 1. N/A 2. N/A
MUL Rd,Rr | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
MULS Rd,Rr | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
MULSU Rd,Rr | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
FMUL Rd,Rr | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
FMULS Rd,Rr | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
FMULSU Rd,Rr | 当前硬件仿真器暂不支持 | N/A | N/A | N/A

转移指令

指令 | 程序存储单元地址 | 寄存器值 | 数据地址 | 数据值
RJMP k | 1. 指令地址 2. N/A | 1. N/A 2. N/A | 1. N/A 2. N/A | 1. N/A 2. N/A
IJMP | 1. 指令地址 2. N/A | 1. N/A 2. N/A | 1. N/A 2. 目标地址 | 1. N/A 2. N/A
EIJMP | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
JMP k | 1. 指令地址 2. 双字指令的首地址 3. N/A | 1. N/A 2. N/A 3. N/A | 1. N/A 2. N/A 3. N/A | 1. N/A 2. N/A 3. N/A
RCALL k | 内部存储器堆栈: 1. 指令地址 2. N/A 3. RCALL 指令目标地址 | 内部存储器堆栈: 1. N/A 2. N/A 3. N/A | 内部存储器堆栈: 1. N/A 2. 堆栈指针 3. 堆栈指针 | 内部存储器堆栈: 1. N/A 2. 返回地址低字节 3. 返回地址高字节
ICALL | 内部存储器堆栈: 1. 指令地址 2. N/A 3. ICALL 指令目标地址 | 内部存储器堆栈: 1. N/A 2. N/A 3. N/A | 内部存储器堆栈: 1. N/A 2. 堆栈指针 3. 堆栈指针 | 内部存储器堆栈: 1. N/A 2. 返回地址低字节 3. 返回地址高字节
EICALL | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
CALL k | 内部存储器堆栈: 1. 指令地址 2. 双字指令的首地址 3. N/A 4. CALL 指令目标地址 | 内部存储器堆栈: 1. N/A 2. N/A 3. N/A 4. N/A | 内部存储器堆栈: 1. N/A 2. N/A 3. 堆栈指针 4. 堆栈指针 | 内部存储器堆栈: 1. N/A 2. N/A 3. 返回地址低字节 4. 返回地址高字节
RET | 内部存储器堆栈: 1. 指令地址 2. N/A 3. N/A 4. N/A | 内部存储器堆栈: 1. N/A 2. N/A 3. N/A 4. N/A | 内部存储器堆栈: 1. N/A 2. 堆栈指针 3. 堆栈指针 4. N/A | 内部存储器堆栈: 1. N/A 2. 返回地址高字节 3. 返回地址低字节 4. N/A
RETI | 内部存储器堆栈: 1. 指令地址 2. N/A 3. N/A 4. N/A | 内部存储器堆栈: 1. N/A 2. N/A 3. N/A 4. N/A | 内部存储器堆栈: 1. N/A 2. 堆栈指针 3. 堆栈指针 4. N/A | 内部存储器堆栈: 1. N/A 2. 返回地址高字节 3. 返回地址低字节 4. N/A
CPSE Rd,Rr | 条件不满足(不执行跳转) 1. 指令地址 条件满足, 跳过单字指令 1. 指令地址 2. 所跳过指令的地址 条件满足, 跳过双字指令 1. 指令地址 2. 所跳过指令的地址, 第一个字 3. 所跳过指令的地址, 第二个字 | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A
CP Rd,Rr | 指令地址 | N/A | N/A | N/A
CPC Rd,Rr | 指令地址 | N/A | N/A | N/A
CPI Rd,K | 指令地址 | N/A | N/A | N/A
SBRC Rr,b | 条件不满足 (不执行跳转) 1. 指令地址 条件满足, 跳过单字指令 1. 指令地址 2. 所跳过指令的地址 条件满足, 跳过双字指令 1. 指令地址 2. 所跳过指令的地址, 第一个字 3. 所跳过指令的地址, 第二个字 | 条件不满足 (不执行跳转) 1. 寄存器数值 条件满足, 跳过单字指令 1. 寄存器数值 2. N/A 条件满足, 跳过双字指令 1. 寄存器数值 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A
SBRS Rr,b | 条件不满足 (不执行跳转) 1. 指令地址 条件满足, 跳过单字指令 1. 指令地址 2. 所跳过指令的地址 条件满足, 跳过双字指令 1. 指令地址 2. 所跳过指令的地址, 第一个字 3. 所跳过指令的地址, 第二个字 | 条件不满足 (不执行跳转) 1. 寄存器数值 条件满足, 跳过单字指令 1. 寄存器数值 2. N/A 条件满足, 跳过双字指令 1. 寄存器数值 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A
SBIC A,b | 条件不满足 (不执行跳转) 1. 指令地址 条件满足, 跳过单字指令 1. 指令地址 2. 所跳过指令的地址 条件满足, 跳过双字指令 1. 指令地址 2. 所跳过指令的地址, 第一个字 3. 所跳过指令的地址, 第二个字 | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. I/O 地址(A)的低5位 条件满足, 跳过单字指令 1. I/O 地址(A)的低5位 2. N/A 条件满足, 跳过双字指令 1. I/O 地址(A)的低5位 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A
SBIS A,b | 条件不满足 (不执行跳转) 1. 指令地址 条件满足, 跳过单字指令 1. 指令地址 2. 所跳过指令的地址 条件满足, 跳过双字指令 1. 指令地址 2. 所跳过指令的地址, 第一个字 3. 所跳过指令的地址, 第二个字 | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. I/O 地址(A)的低5位 条件满足, 跳过单字指令 1. I/O 地址(A)的低5位 2. N/A 条件满足, 跳过双字指令 1. I/O 地址(A)的低5位 2. N/A 3. N/A | 条件不满足 (不执行跳转) 1. N/A 条件满足, 跳过单字指令 1. N/A 2. N/A 条件满足, 跳过双字指令 1. N/A 2. N/A 3. N/A
BRBC s,k | 不会出现 (反汇编成其他转移指令) | N/A | N/A | N/A
BRBS s,k | 不会出现 (反汇编成其他转移指令) | N/A | N/A | N/A
BREQ k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRNE k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRCS k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRCC k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRSH k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRLO k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRMI k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRPL k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRGE k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRLT k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRHS k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRHC k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRTS k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRTC k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRVS k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRVC k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRIE k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A
BRID k | 转移未执行: 1. 指令地址 转移执行: 1. 指令地址 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A | 转移未执行: 1. N/A 转移执行: 1. N/A 2. N/A

数据传送指令

指令 | 程序存储单元地址 | 寄存器值 | 数据地址 | 数据值
MOV Rd,Rr | 指令地址 | 写入寄存器的值 | N/A | N/A
MOVW Rd,Rr | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
LDI Rd,K | 指令地址 | 写入寄存器的值 | N/A | N/A
LDS Rd,k | 内部存储器: 1. 指令地址 2. 双字指令的首地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. 地址(k) | 内部存储器: 1. N/A 2. 读取值
LD Rd,X | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. X指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,X+ | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. X指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,-X | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. X指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,Y | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Y指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,Y+ | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Y指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,-Y | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Y指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LDD Rd,Y+q | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Y+q指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,Z | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Z指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,Z+ | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Z指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LD Rd,-Z | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Z指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
LDD Rd,Z+q | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 读取值 | 内部存储器: 1. N/A 2. Z+q指针指向的SRAM地址 | 内部存储器: 1. N/A 2. 读取值
STS k,Rr | 内部存储器: 1. 指令地址 2. 双字指令的首地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入地址(k) | 内部存储器: 1. N/A 2. 写入值
ST X,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(X)的地址 | 内部存储器: 1. N/A 2. 写入值
ST X+,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(X)的地址 | 内部存储器: 1. N/A 2. 写入值
ST -X,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器 (X)的地址 | 内部存储器: 1. N/A 2. 写入值
ST Y,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(Y)的地址 | 内部存储器: 1. N/A 2. 写入值
ST Y+,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(Y)的地址 | 内部存储器: 1. N/A 2. 写入值
ST -Y,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(Y)的地址 | 内部存储器: 1. N/A 2. 写入值
STD Y+q,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入(Y+q)的地址 | 内部存储器: 1. N/A 2. 写入值
ST Z,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(Z)的地址 | 内部存储器: 1. N/A 2. 写入值
ST Z+,Rr | 内部存储器: 1. 指令地址 2.下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(Z)的地址 | 内部存储器: 1. N/A 2. 写入值
ST -Z,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入寄存器(Z)的地址 | 内部存储器: 1. N/A 2. 写入值
STD Z+q,Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. N/A | 内部存储器: 1. N/A 2. 写入(Z+q)的地址 | 内部存储器: 1. N/A 2. 写入值
LPM | 1. 指令地址 2. 下一条指令地址 3. 所读取的数据的字地址 | 1. NA 2. N/A 3. 读取数据 | 1. N/A 2. N/A 3. N/A | 1. N/A 2. N/A 3. N/A
LPM Rd,Z | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
LPM Rd,Z+ | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
ELPM | 1. 指令地址 2. 下一条指令地址 3. 所读取的数据的字地址 | 1. N/A 2. N/A 3. 读取数据 | 1. N/A 2. N/A 3. N/A | 1. N/A 2. N/A 3. N/A
ELPM Rd,Z | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
ELPM Rd,Z+ | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
SPM | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
ESPM | 当前硬件仿真器暂不支持 | N/A | N/A | N/A
IN Rd,A | 指令地址 | 读取端口的值 | I/O 地址(A)的低6位 | 读取值 from port
OUT A,Rr | 指令地址 | 写入端口的值 | I/O 地址(A)的低6位 | 写入值 to port
PUSH Rr | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 压入堆栈值 | 内部存储器: 1. N/A 2. 堆栈指针 | 内部存储器: 1. N/A 2. 压入堆栈值
POP Rd | 内部存储器: 1. 指令地址 2. 下一条指令地址 | 内部存储器: 1. N/A 2. 堆栈弹出值 | 内部存储器: 1. N/A 2. 堆栈指针 | 内部存储器: 1. N/A 2. 堆栈弹出值

位操作和位测试指令

指令 | 程序存储单元地址 | 寄存器值 | 数据地址 | 数据值
LSL Rd | 不会出现 (反汇编成 ADD 指令) | N/A | N/A | N/A
LSR Rd | 指令地址 | 移位结果 | N/A | N/A
ROL Rd | 不会出现 (反汇编成 ADC 指令) | N/A | N/A | N/A
ROR Rd | 指令地址 | 循环结果 | N/A | N/A
ASR Rd | 指令地址 | 移位结果 | N/A | N/A
SWAP Rd | 指令地址 | 交换结果 | N/A | N/A
BSET s | 不会出现 (反汇编成其他设置标志位指令) | N/A | N/A | N/A
BCLR s | 不会出现 (反汇编成其他清标志位指令) | N/A | N/A | N/A
SBI A,b | 1. 指令地址 2. 下一条指令地址 | 1. N/A 2. N/A | 1. I/O 地址(A)的低5位 2. I/O 地址(A)的低5位 | 1. I/O 口读取值 2. I/O 口写入值
CBI A,b | 1. 指令地址 2. 下一条指令地址 | 1. N/A 2. N/A | 1. I/O 地址(A)的低5位 2. I/O 地址(A)的低5位 | 1. I/O 口读取值 2. I/O 口写入值
BST Rr,b | 指令地址 | N/A | N/A | N/A
BLD Rd,b | 指令地址 | 实际中此位的值反映的是所装载的位的值 | N/A | N/A
SEC | 指令地址 | N/A | N/A | N/A
CLC | 指令地址 | N/A | N/A | N/A
SEN | 指令地址 | N/A | N/A | N/A
CLN | 指令地址 | N/A | N/A | N/A
SEZ | 指令地址 | N/A | N/A | N/A
CLZ | 指令地址 | N/A | N/A | N/A
SEI | 指令地址 | N/A | N/A | N/A
CLI | 指令地址 | N/A | N/A | N/A
SES | 指令地址 | N/A | N/A | N/A
CLN | 指令地址 | N/A | N/A | N/A
SEV | 指令地址 | N/A | N/A | N/A
CLV | 指令地址 | N/A | N/A | N/A
SET | 指令地址 | N/A | N/A | N/A
CLT | 指令地址 | N/A | N/A | N/A
SEH | 指令地址 | N/A | N/A | N/A
CLH | 指令地址 | N/A | N/A | N/A
NOP | 指令地址 | N/A | N/A | N/A
SLEEP | 指令地址 | N/A | N/A | N/A
WDR | 指令地址 | N/A | N/A | N/A
  • 特殊情况考虑(跟踪缓存)
  • 仿真器用户手册


AVR Studio: Special considerations (Trace Buffer)

特殊情况考虑 (跟踪缓存)
这一部分涵盖叙述了之前几部分都没有涉及的一些特殊情况。

外部储存器寻址

访问数据存储单元的指令所用的时间取决于所访问的存储单元时内部还是外部的。访问外部存储单元所用的时间也是由等待状态的数量决定的。本文件没有说明这些指令执行的精确时间，但与上述所说的相当近似。可用于以下几条指令：LD (多种形式), LDD (多种形式), ST (多种形式), STD (多种形式), LDS, STS, RCALL, ICALL, CALL, RET, RETI, PUSH, POP.

硬件调用堆栈

具有硬件调用堆栈的器件 (如 AT90S1200)，使用RCALL, RET 或 RETI 指令时堆栈指针和返回地址在任何仿真区域都是不可见的。

中断处理

中断是常规程序流程中发生的异步事件。没有指令可以控制中断处理过程的开始。然而，一旦处理器将返回地址存在堆栈中，立即将开始执行中断向量地址中的程序。举例如下，当执行指令 LDI R16,0x01 产生了中断。则当该指令执行完毕(单周期指令), 我们可以观察到在开始执行中断向量(在本例中，中断向量为 0x00007)之前程序指针被写入堆栈 0x25F 和 0x25E 的地址空间内。中断程序执行完毕以后(在本例中情况非常简单) ， 再继续执行接下来的程序(本例中为地址 0x00012)。

休眠

在单片机进入休眠状态的情况下，即使跟踪被使能，也不会有任何记录被写入跟踪缓存。这对所有的休眠状态都适用。请注意，单片机休眠时周期计数器仍在计数，当单片机从休眠中被唤醒，利用该值可算出休眠的时间。

复位

在跟踪使能期间发生的的外部复位或看门狗复位，在其复位刚开始阶段，跟踪存储单元为全零。如果在AVR Studio中使用复位按钮，则在复位启动阶段跟踪缓存中不会记录任何值。在硬件仿真器中没有快速启动选项。

参看

  • 基于指令的跟踪缓冲区内容
  • 仿真器用户手册


AVR Studio: Memory Window

存储单元窗口
软件仿真器支持存储单元窗口的所有功能。但有以下几点值得我们注意一下：
  • 当软件仿真运行时，存储单元中的内容不会被刷新。只有当仿真过程暂停才能更新存储单元的内容。
  • 当软件仿真运行时，存储单元中的内容可以修改。 但只有当仿真过程暂停才能向数据区写入新的数值。
  • 未使用的 I/O 存储区包含了常规的 SRAM 存储单元。对于AVR器件来说，读取未使用的区域将返回随机数据。
  • 当仿真目标器件支持外部数据存储单元，整个外部存储单元作为常规的SRAM来看。 如果目标文件包含外部存储单元的原始数据，当打开工程文件时这些数据仍被写入外部存储单元。目标器件的复位并不会恢复这些原始数据的设置。
  • 当开启 AVR Studio 时，软件仿真器将所有的存储单元复位为0x00。这样的设置能令调试更加方便，但并不能保证实际的 AVR 器件也是如此执行。除了某一些器件在其Datasheet有特别说明，否则一般在上电期间不会对存储单元进行初始化。

参看

  • 仿真器用户手册


AVR Studio: Terminal I/O Window

I/O 终端窗口
I/O 终端窗口可以仿真 AVR中IAR 系统C的编译器所编译的程序与 I/O 终端之间的交流过程。当编译器生成 "调试 I/O 终端" 的链接选项时，这一链接会取代 getchar() 和 putchar() 函数进行特定的系统调用。I/O 终端窗口支持这些特殊函数调用，并允许直接在屏幕上对标准I/O数据进行调试。

窗口会在软件仿真器运行并始终显示着当前输入输出数据流的状态时刷新。操作者可以随时对输入数据流进行编辑。 当一个字符从输入数据流中读入以后，它将会被从输入视图窗口中删除。

输出窗口支持 VT100 终端标准。 其最重要的特殊性质有：

注意事项 1: 目标文件必须与“调试I/O终端”的调试格式(默认)相链接。

注意事项 2: 只有软件仿真器具有I/O 终端功能。AVR标准I/O不具有使用取代 getchar() 和 putchar() 函数的功能，却可以使用特殊系统调用，用I/O 终端窗口的内容来代替 r16:r17 的值。

参看

  • 仿真器用户指南