avr单片机是基于哈佛结构,它的程序存储器和数据存储器分开。
avr的Flash存储器空间存放的内容有:
(1)text:程序代码区
(2)interrupt vectors:存放中断向量
(3)fun_lit:函数列表区。函数列表区包含了函数的入口地址。
(4)lit:整型数和浮点数常量区。存放的是程序中的常量数据。
(5)idata:全局变量和字符串的初始值存放在该区。
avr的RAM数据内存中存放的内容有:
1)data: 存放全局变量、静态变量和字符串。(注意:全局变量和字符串的初始值保存在Flash中的idata区域,在启动时被复制到RAM中)
2)bss:包括未初始化的全局变量。
avr中的EEPROM存放的是HEX文件。
AVR系列的SRAM和Flash的结构 SRAM实际上就是AVR的内存,运算只能通过32个工作寄存器,而SRAM在这个过程中起到保存数据的作用。
在做简单的工程的时候,你使用的变量可能只需要用的寄存器就足够了,但是在比较复杂的工程下,就要频繁的进行寄存器和SRAM之间的数据交换了。
如果你是使用汇编进行工作,此时你需要知道的是AVR的地址空间分配,对SRAM的操作的汇编指令等,而如果是使用C编译器,知道这些,能有帮助你优化你的程序。
所有的地址空间能被直接或者间接的寻址。
直接寻址:
在要保存(加载)数据到(从)你所指定的直接地址的时候,你可以使用sts、lds指令。
ldi r16,0x55 ;r16装入立即数0x55
sts 0x0190,r16 ;把r16里的数据保存在SRAM中地址为0x190的地方
lds r16,0x0190 ;把SRAM中地址为190的数据装入r16
间接寻址可以象C或者Pascal里的指针那样操作,就是32个寄存器里的(R26,R27)X,(R28,R29)Y,(R30,R31)Z。
还是以地址0x0190为例子
ldi XL, 0x90 ;加载目标地址的低位
ldi XH, 0x01 ;加载目标地址的高位
ld r16, X ;把目标地址的数据加载到r16
间接寻址的加载和存储和直接的指令是不一样的,间接的只能使用ls和st来执行。
AVR的地址空间是由3个主要部分构成的:32个寄存器、I/O寄存器(UART、TIME、等等)、内部SRAM。
另外不同的编译软件对FLASH中的变量定义方法不一样。