搜索
bottom↓
回复: 7

如何修改winavr自带初始化.o文件以修正LGT stack初始化错误问题

[复制链接]

出0入0汤圆

发表于 2012-5-17 14:57:15 | 显示全部楼层 |阅读模式
刚才在另一个帖子里才发现我们一直使用WINAVR编译LGT的代码的Stack初始化错了
初始化Stack的汇编代码如下:
     652:        cf ef               ldi        r28, 0xFF        ; 255
     654:        d2 e0               ldi        r29, 0x04        ; 2
     656:        de bf               out        0x3e, r29        ; 62
     658:        cd bf               out        0x3d, r28        ; 61

可以看到stack被初始化成0x4ff,LGT的stack最大值只有0x2ff,因此这样子初始化后LGT对应的stack是0xff, 已经落在SRAM之外了。
这样子程序应该很不正常才是。结果看起来运行的挺好。(不知为什么,难道SPH写 0x4 执行不成功?)

为解决这个问题我们需要手动修改winavr的相关文件。

我们用WINAVR编译LGT的时候是用mega164p (以WinAVR-20090313为例)

WinAVR-20090313\avr\include\avr\iom164.h里有个RAMEND的宏,但是修改这个宏的值到0x2ff 重新编译还是一样。

WinAVR-20090313\avr\lib\avr5\crtm164p.o 这个是初始化的一段代码
先用objdump打印出汇编代码:
其中有个.init2的段

Disassembly of section .init2:

00000000 <.init2>:
   0:        11 24               eor        r1, r1
   2:        1f be               out        0x3f, r1        ; 63
   4:        c0 e0               ldi        r28, 0x00        ; 0
   6:        d0 e0               ldi        r29, 0x00        ; 0
   8:        de bf               out        0x3e, r29        ; 62
   a:        cd bf               out        0x3d, r28        ; 61

用 readelf看这个段有一个relocation
Relocation section '.rela.init2' at offset 0x990 contains 2 entries:
Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000004  00002a06 R_AVR_LO8_LDI     000004ff   __stack + 0
00000006  00002a07 R_AVR_HI8_LDI     000004ff   __stack + 0

就是把.init2里面偏移4和6的地方换成0x4ff

这个就是stack的大小了。

用utraedit打开.o文件,找到“FF 04” 这个值,把它改成“FF 02” 就可以了 (注意要备份原文件)。

重新编译再看汇编就会改过来了:
     652:        cf ef               ldi        r28, 0xFF        ; 255
     654:        d2 e0               ldi        r29, 0x02        ; 2
     656:        de bf               out        0x3e, r29        ; 62
     658:        cd bf               out        0x3d, r28        ; 61

出0入618汤圆

发表于 2012-5-17 16:31:10 | 显示全部楼层
本帖最后由 gzhuli 于 2012-5-17 17:31 编辑

应该不用改.o这么麻烦,工程里可以设置的:

出0入0汤圆

 楼主| 发表于 2012-5-17 16:37:12 | 显示全部楼层
gzhuli 发表于 2012-5-17 16:31
应该不用改.o这么麻烦,工程里可以设置的:

能帮忙看下最终的Makefile是用了哪个选项么? 我这没有AVR Studio 也不用。 谢谢!

出0入618汤圆

发表于 2012-5-17 16:40:34 | 显示全部楼层
bozai 发表于 2012-5-17 16:37
能帮忙看下最终的Makefile是用了哪个选项么? 我这没有AVR Studio 也不用。 谢谢! ...

本帖子中包含更多资源

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

x

出0入618汤圆

发表于 2012-5-17 16:49:00 | 显示全部楼层
本帖最后由 gzhuli 于 2012-5-17 17:29 编辑

看了AVR GCC的说明,__stack要设置成0x800000 + 真实SRAM地址,所以参数应该是--defsym=__stack=0x8002ff才对。

http://www.nongnu.org/avr-libc/user-manual/using_tools.html最后一段。

出0入0汤圆

 楼主| 发表于 2012-5-17 16:52:28 | 显示全部楼层
gzhuli 发表于 2012-5-17 16:40

谢谢! 原来是这个选项。 当时还看help来着,没找到这个选项。

出0入0汤圆

发表于 2012-5-17 17:14:19 | 显示全部楼层

IAR不用担心SP初始值。

出0入8汤圆

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

本版积分规则

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

GMT+8, 2024-5-4 19:45

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

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