搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

发表于 2012-11-20 09:42:49 | 显示全部楼层 |阅读模式
建立了一个新工程,定义了如下数组:

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

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


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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-11-20 10:16:45 | 显示全部楼层
论坛很热。贴子沉得真快。

出0入0汤圆

发表于 2012-11-20 13:53:00 | 显示全部楼层
这是怎么回事?

出0入0汤圆

 楼主| 发表于 2012-11-20 14:33:30 | 显示全部楼层
别处定义的RAM太多了,所以缓冲区溢出。默认溢出时,即采用片外RAM时,并不会警告。
减小RAM的定义就可以解决溢出问题。
目前还没找到定义堆栈的起始位置和大小地方。

出0入0汤圆

发表于 2012-11-20 14:45:10 | 显示全部楼层
单片机内部RAM不是就是那么大嘛 这个可以改变?

出0入0汤圆

 楼主| 发表于 2012-11-20 15:40:46 | 显示全部楼层
内部RAM如ATmega128就4K大小,不可以改变。

出0入0汤圆

发表于 2012-11-20 15:58:14 | 显示全部楼层
peterqiu 发表于 2012-11-20 15:40
内部RAM如ATmega128就4K大小,不可以改变。

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

出0入0汤圆

 楼主| 发表于 2012-11-20 16:01:25 | 显示全部楼层
对,程序运行不正常。编译器没报警。不过这些可以从map文件看得出是溢出了内部RAM的地址了。

出0入0汤圆

发表于 2012-11-20 17:39:04 | 显示全部楼层
编译器编译时没有提示图片中相关的错误提示信息????

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-11-20 18:09:04 | 显示全部楼层
我做了个测试程序,程序如下:
#include <avr/io.h>

unsigned char test[5000];

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

环境是Atmel studio 6.

附工程:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-20 20:02:54 | 显示全部楼层
你定义的数组大小哪里超过内部RAM了
这才占了多少啊
你应该向我试的才对 数据搞的更点的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-11-21 09:03:57 | 显示全部楼层
芯片用的是ATmega128。
这个芯片只有4K的内部RAM吧?
数组定义了5000个字节,超过了吧?
附内存表:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-11-21 12:38:50 | 显示全部楼层
peterqiu 发表于 2012-11-21 09:03
芯片用的是ATmega128。
这个芯片只有4K的内部RAM吧?
数组定义了5000个字节,超过了吧?

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 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__这个变量,看来堆栈大小的变量不是这个。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 04:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表