原创 avr的flash和ram存放的数据问题

2009-4-1 22:34 3579 9 11 分类: MCU/ 嵌入式

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中的变量定义方法不一样。

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户377235 2012-12-13 16:46

avr的RAM数据内存中存放的内容有: 1)data: 存放全局变量、静态变量和字符串 字符串是常量,应该还是放在flash中吧?

用户214529 2009-8-9 16:01

写的真好! 赞一个!
相关推荐阅读
lg05128018_230568758 2010-10-24 17:21
4052原理,扩展四串口原理
4052原理 cd4051,cd4052,cd4053, 都是数控模拟开关,4051是单刀8掷开关,4052是2刀4掷开关,4053是3刀2掷开关,4051有3个控制端abc,控制8个输入端中的1个与...
lg05128018_230568758 2010-10-13 02:45
Menu
/*********************************************************************************/code KbdTabStruct...
lg05128018_230568758 2010-09-01 08:13
指针-指针数组-数组三者之间的关系
/****************lg05128018**************2009-8-19*****************************//***************指针,指...
lg05128018_230568758 2010-02-22 20:38
EBOOT通过bin文件形式读取、下载LOGO
一般的WINCE系统都是在EBOOT阶段初始化LCD,所以要想显示自己的LOGO就需要在EBOOT阶段将LOGO内容显示出来,读取LOGO的方式可以和从存储器中读取NK一样,具体位置自己来定义。 在E...
lg05128018_230568758 2010-02-22 20:27
nk.bin和nk.nb0的区别(转帖)
 nk.bin 和nk.nb0都是CE的镜像。然而,我们在下载的过程中常常会遇到,有时候下载nk.bin,有时确是下载nk.nb0,这两者到底有什么区别呢? 首先,NK.BIN中的内容是被压缩过的,N...
lg05128018_230568758 2010-02-03 17:53
从一维数组看sizeof和strlen
作者:王姗姗,华清远见嵌入式学院讲师。前几天学习一维数组的赋值的时候遇到这样一个问题,程序如下:char a[]="hello";        char b[5]={'h','e','l','l',...
EE直播间
更多
我要评论
2
9
关闭 站长推荐上一条 /3 下一条