打印
[AVR单片机]

atmega128A程序占用大于32Kbyte运行不正常

[复制链接]
3742|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如图,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)

使用特权

评论回复
5
123654789| | 2013-1-31 10:15 | 只看该作者
有什么奇怪
我以前也使用ICCAVR    还是4K代码限制版

使用特权

评论回复
6
JACK___ZHANG|  楼主 | 2013-1-31 10:29 | 只看该作者
123654789 发表于 2013-1-31 10:15
有什么奇怪
我以前也使用ICCAVR    还是4K代码限制版

编译还没有任何报错信息,就是下载到板上后运行不正常。。。有没有使用过的容量限制的编译器发个链接来学习一下

使用特权

评论回复
7
gdxizhilang| | 2013-2-2 10:41 | 只看该作者
看看熔丝位设置有问题吗,103兼容模式去掉了吗?

使用特权

评论回复
8
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位——本人没测试过。

1.GIF (63.62 KB )

1.GIF

使用特权

评论回复
9
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时运行不正常。

使用特权

评论回复
10
hyhmh| | 2013-3-5 16:26 | 只看该作者
FLASH ROM 的情况也是一样.
只是 上楼贴图时,弄为RAM的.

1.GIF (28.91 KB )

1.GIF

使用特权

评论回复
11
hyhmh| | 2013-3-5 16:35 | 只看该作者
CODE的数据表格——指FLASH ROM 代码中的表
以前,比较喜欢放在 所有程序指令的最后。 当程序 超过0x7FFF时, 0x8000*2= 0x10000。此时,ZH、ZL(16位)就变为0了。

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
qin552011373 + 4
12
JACK___ZHANG|  楼主 | 2013-3-13 16:40 | 只看该作者
hyhmh 发表于 2013-3-5 16:35
CODE的数据表格——指FLASH ROM 代码中的表
以前,比较喜欢放在 所有程序指令的最后。 当程序 超过0x7FFF时 ...

这边说的0x7fff是*16的单位吧,可是我的容量才刚过32K字节,也就是其实才到0x4000*16,这里那个存储器到另一页应该还好长距离啊

使用特权

评论回复
13
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 赞一个!
14
qin552011373| | 2013-3-13 21:18 | 只看该作者
JACK___ZHANG 发表于 2013-3-13 16:50
我做了另一个实验,在flash区建一个自己的块:.myzone=0x5000
#define  PROGEMMYZONE __attribute__((sec ...

估计是什么原因呢

使用特权

评论回复
15
cool_coder| | 2013-3-15 16:08 | 只看该作者
我遇到过超过64KB后烧写程序校验错的,后来发现是烧写软件有BUG。换过后烧写正常,运行也没有问题。

使用特权

评论回复
16
nbmbnn| | 2013-3-16 09:33 | 只看该作者
以前有ICCAVR,编译选项里没有选外部RAM,结果出了一堆问题。

使用特权

评论回复
17
JACK___ZHANG|  楼主 | 2013-4-23 17:15 | 只看该作者
cool_coder 发表于 2013-3-15 16:08
我遇到过超过64KB后烧写程序校验错的,后来发现是烧写软件有BUG。换过后烧写正常,运行也没有问题。 ...

不知道你用什么编译器编译的,我那个超过32K能烧录,校验也没有错,应该是编译器的问题,但是找遍了也没有发现有什么选项说是对编译程序大小有限制的

使用特权

评论回复
18
JACK___ZHANG|  楼主 | 2013-11-21 16:08 | 只看该作者
问题已经解决,是烧写界面的问题,之前progisp1.72烧写后校验通过(包括超过32K的部分),但是用AVR  fighter校验发现超过32K的地方实际是没有数据了,应该是之前的烧写界面寻址有问题,现在到达45K了还是正常的

使用特权

评论回复
19
cqspring| | 2015-11-11 09:08 | 只看该作者
你好,我在论坛上看到了您的M128超32K后不能正常运行的问题,我也遇到了同样的问题,特请您赐教,您是怎么解决的?不胜感激!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

1

粉丝