[AVR单片机] atmega128A程序占用大于32Kbyte运行不正常

[复制链接]
 楼主| JACK___ZHANG 发表于 2013-1-31 09:51 | 显示全部楼层 |阅读模式
如图,atmega128a程序运用空间到0x7fff bytes时候程序运行还正常,再往FLASH里面存一个数,使程序空间运用到达0X8000bytes时,运行就不正常了,用atmelstudio6 和iccavr7编译,都是一样的结果,程序空间容量都是通过在flash存数组来控制测试的,大神们指点下
123654789 发表于 2013-1-31 10:10 | 显示全部楼层
是不是你自己使用了32K代码限制版的编译软件啊
 楼主| JACK___ZHANG 发表于 2013-1-31 10:12 | 显示全部楼层
123654789 发表于 2013-1-31 10:10
是不是你自己使用了32K代码限制版的编译软件啊

iccavr7 专业版也会有32K限制?
 楼主| JACK___ZHANG 发表于 2013-1-31 10:14 | 显示全部楼层
123654789 发表于 2013-1-31 10:10
是不是你自己使用了32K代码限制版的编译软件啊

Image Craft IDE for ICCAVR(Professional)
123654789 发表于 2013-1-31 10:15 | 显示全部楼层
有什么奇怪
我以前也使用ICCAVR    还是4K代码限制版
 楼主| JACK___ZHANG 发表于 2013-1-31 10:29 | 显示全部楼层
123654789 发表于 2013-1-31 10:15
有什么奇怪
我以前也使用ICCAVR    还是4K代码限制版

编译还没有任何报错信息,就是下载到板上后运行不正常。。。有没有使用过的容量限制的编译器发个链接来学习一下
gdxizhilang 发表于 2013-2-2 10:41 | 显示全部楼层
看看熔丝位设置有问题吗,103兼容模式去掉了吗?
hyhmh 发表于 2013-2-3 16:21 | 显示全部楼层
注意将 CODE的数据表格放在 低32K区域。
使用汇编习惯上,
ldi ZL, low(RST_TABLE*2)
ldi ZH, high(RST_TABLE*2)
而高于32K的访问时,需要对 RAMPZ0( Extended RAM Page Z-pointer)位置1。
至于,C编译器是否能识别32K以上区域,并置RAMPZ0位——本人没测试过。

本帖子中包含更多资源

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

×
 楼主| JACK___ZHANG 发表于 2013-3-4 16:00 | 显示全部楼层
hyhmh 发表于 2013-2-3 16:21
注意将 CODE的数据表格放在 低32K区域。
使用汇编习惯上,
ldi ZL, low(RST_TABLE*2)

你这边讲到的是对RAM的访问吧,但是我RAM空间还很多,远远低于32K(内部4K RAM还没用完),现在是FLASH运用超过32K时运行不正常。
hyhmh 发表于 2013-3-5 16:26 | 显示全部楼层
FLASH ROM 的情况也是一样.
只是 上楼贴图时,弄为RAM的.

本帖子中包含更多资源

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

×
hyhmh 发表于 2013-3-5 16:35 | 显示全部楼层
CODE的数据表格——指FLASH ROM 代码中的表
以前,比较喜欢放在 所有程序指令的最后。 当程序 超过0x7FFF时, 0x8000*2= 0x10000。此时,ZH、ZL(16位)就变为0了。

评分

参与人数 1威望 +4 收起 理由
qin552011373 + 4

查看全部评分

 楼主| JACK___ZHANG 发表于 2013-3-13 16:40 | 显示全部楼层
hyhmh 发表于 2013-3-5 16:35
CODE的数据表格——指FLASH ROM 代码中的表
以前,比较喜欢放在 所有程序指令的最后。 当程序 超过0x7FFF时 ...

这边说的0x7fff是*16的单位吧,可是我的容量才刚过32K字节,也就是其实才到0x4000*16,这里那个存储器到另一页应该还好长距离啊
 楼主| JACK___ZHANG 发表于 2013-3-13 16:50 | 显示全部楼层
hyhmh 发表于 2013-3-5 16:35
CODE的数据表格——指FLASH ROM 代码中的表
以前,比较喜欢放在 所有程序指令的最后。 当程序 超过0x7FFF时 ...

我做了另一个实验,在flash区建一个自己的块:.myzone=0x5000
#define  PROGEMMYZONE __attribute__((section(".myzone")))
void functionA()PROGEMMYZONE ;
通过这样把函数A定位存在0xa000开始的位置,能正常工作,可是我如果多定义一个函数在这个区里面,
void functionA()PROGEMMYZONE ;
void functionB()PROGEMMYZONE ;
编译没有报错,但是运行就不正常了。

评分

参与人数 1威望 +6 收起 理由
qin552011373 + 6 赞一个!

查看全部评分

qin552011373 发表于 2013-3-13 21:18 | 显示全部楼层
JACK___ZHANG 发表于 2013-3-13 16:50
我做了另一个实验,在flash区建一个自己的块:.myzone=0x5000
#define  PROGEMMYZONE __attribute__((sec ...

估计是什么原因呢
cool_coder 发表于 2013-3-15 16:08 | 显示全部楼层
我遇到过超过64KB后烧写程序校验错的,后来发现是烧写软件有BUG。换过后烧写正常,运行也没有问题。
nbmbnn 发表于 2013-3-16 09:33 | 显示全部楼层
以前有ICCAVR,编译选项里没有选外部RAM,结果出了一堆问题。
 楼主| JACK___ZHANG 发表于 2013-4-23 17:15 | 显示全部楼层
cool_coder 发表于 2013-3-15 16:08
我遇到过超过64KB后烧写程序校验错的,后来发现是烧写软件有BUG。换过后烧写正常,运行也没有问题。 ...

不知道你用什么编译器编译的,我那个超过32K能烧录,校验也没有错,应该是编译器的问题,但是找遍了也没有发现有什么选项说是对编译程序大小有限制的
 楼主| JACK___ZHANG 发表于 2013-11-21 16:08 | 显示全部楼层
问题已经解决,是烧写界面的问题,之前progisp1.72烧写后校验通过(包括超过32K的部分),但是用AVR  fighter校验发现超过32K的地方实际是没有数据了,应该是之前的烧写界面寻址有问题,现在到达45K了还是正常的
cqspring 发表于 2015-11-11 09:08 | 显示全部楼层
你好,我在论坛上看到了您的M128超32K后不能正常运行的问题,我也遇到了同样的问题,特请您赐教,您是怎么解决的?不胜感激!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部