peterqiu 发表于 2012-11-20 09:42:49

AVR Studio 6环境下定义数组到RAM中所在的位置问题

建立了一个新工程,定义了如下数组:

/* Model private variables ---------------------------------------------------*/
unsigned char gLcdBuf;      //lcd 显示缓冲区

编译进行仿真,可以看到该数组在内存的位置如下:


从中可以看出,gLcdBuf映射的RAM地址为0x1481.
由于这个是片外RAM地址。(芯片用的是ATmega128a)
所以不可进行修改,不管在程序里付值还是在仿真器里改,
都改不了,实际硬件也没有用到片外RAM。
请问,怎么修改编译选项或者链接选项,使定义的数组映射到片内RAM?
工程的编译选项和链接选项为默认设置。如下:


同时请教大家,如何在AVR Studio 6设置堆栈的起始位置和大小?谢谢。

peterqiu 发表于 2012-11-20 10:16:45

论坛很热。贴子沉得真快。

li_thomas 发表于 2012-11-20 13:53:00

这是怎么回事?

peterqiu 发表于 2012-11-20 14:33:30

别处定义的RAM太多了,所以缓冲区溢出。默认溢出时,即采用片外RAM时,并不会警告。
减小RAM的定义就可以解决溢出问题。
目前还没找到定义堆栈的起始位置和大小地方。

yklstudent 发表于 2012-11-20 14:45:10

单片机内部RAM不是就是那么大嘛 这个可以改变?

peterqiu 发表于 2012-11-20 15:40:46

内部RAM如ATmega128就4K大小,不可以改变。

li_thomas 发表于 2012-11-20 15:58:14

peterqiu 发表于 2012-11-20 15:40 static/image/common/back.gif
内部RAM如ATmega128就4K大小,不可以改变。

这么说,理论上这个程序肯定运行不正常?
按理说,编译器应该报警才对。

peterqiu 发表于 2012-11-20 16:01:25

对,程序运行不正常。编译器没报警。不过这些可以从map文件看得出是溢出了内部RAM的地址了。

yklstudent 发表于 2012-11-20 17:39:04

编译器编译时没有提示图片中相关的错误提示信息????

peterqiu 发表于 2012-11-20 18:09:04

我做了个测试程序,程序如下:
#include <avr/io.h>

unsigned char test;

int main(void)
{
        test = 0x55;
        test = 0x55;
    while(1)
    {
                if(test == test);
      //TODO:: Please write your application code
    }
}
此时,test缓冲区定义的内存超过了内部RAM。

环境是Atmel studio 6.

附工程:

yklstudent 发表于 2012-11-20 20:02:54

你定义的数组大小哪里超过内部RAM了
这才占了多少啊
你应该向我试的才对 数据搞的更点的

peterqiu 发表于 2012-11-21 09:03:57

芯片用的是ATmega128。
这个芯片只有4K的内部RAM吧?
数组定义了5000个字节,超过了吧?
附内存表:

yklstudent 发表于 2012-11-21 12:38:50

peterqiu 发表于 2012-11-21 09:03 static/image/common/back.gif
芯片用的是ATmega128。
这个芯片只有4K的内部RAM吧?
数组定义了5000个字节,超过了吧?


不知道什么原因 软件提示ATMEGA128的RAM是65280byte
也许把外部RAM也算进去了

yklstudent 发表于 2012-11-21 12:46:57

发一长AS4+GCCAVR2006
编译下的提示信息:
总结出,新版本AS6软件下
把ATMEGA128外部的RAM的也算进去了
并且不提示出错信息
感觉这是一个好大的坑
楼主的发现,提示我们以后使用AS6时 要小心才对了

peterqiu 发表于 2012-11-21 14:50:56

本帖最后由 peterqiu 于 2012-11-21 14:52 编辑

谢谢yklstudent的支持。

现在还没找到如何设置堆栈的大小方法?有人知道吗?
之前看到有人说avr32是在选项里定义__heap_size__大小。
链接:http://www.amobbs.com/thread-4270239-1-1.html
但用于ATmega128提示没有__heap_size__这个变量,看来堆栈大小的变量不是这个。
页: [1]
查看完整版本: AVR Studio 6环境下定义数组到RAM中所在的位置问题