搜索
bottom↓
回复: 22

WINAVR 编译求助 熟悉WINAVR的帮一下忙吧

[复制链接]

出0入0汤圆

发表于 2014-10-26 11:57:55 | 显示全部楼层 |阅读模式
本帖最后由 not_at_all 于 2014-10-26 21:43 编辑

编译一个大程序,M88,7K代码  但是我发现程序总是生成相对跳转指令(跳转范围小于2k),结果就出现如图的情况:
main函数地址在0x13fe,已经大于2k范围,竟然用了rcall指令  出现了 rcall -3230 这个怪指令 结果程序一运行就死循环了
芯片不支持call  jmp 指令  有哪些设置可以避免这种情况  优化-0s   -02 都试过。



14楼  duxingkei  的意见很值得参考
-----------------------------------
记得 M8 也是只支持RCALL RJMP的 和M88应该差不多吧!  RCALL记得可以相对跳转4K字节的空间吧
然后看你的ROM地址9A(十进制地址:154)处指令如下: Rcall -3230
实际跳转的地址算法如下:  有一个字的地址单位的区别,应该是要加上的。所以可以认为你的RCALL跳转是正确的!!!!不是你程序运行就死循环的原因。

本帖子中包含更多资源

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

x

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入4汤圆

发表于 2014-10-26 12:33:37 | 显示全部楼层
变量初始化?

出0入0汤圆

发表于 2014-10-26 12:43:25 | 显示全部楼层
芯片是否選擇正確?另外WINAVR有一些版本的軟體在64位環境下工作不正常。

出0入0汤圆

 楼主| 发表于 2014-10-26 12:51:33 | 显示全部楼层
farfar 发表于 2014-10-26 12:43
芯片是否選擇正確?另外WINAVR有一些版本的軟體在64位環境下工作不正常。

芯片选择是正确的   我用的是32位XP系统   WinAVR-20100110   avrstudio 4.18

出0入0汤圆

 楼主| 发表于 2014-10-26 12:54:16 | 显示全部楼层

把芯片改为m168  后面提示是main函数
--------------------------------
0000005e <.do_clear_bss_loop>:
      5e:        1d 92               st        X+, r1

00000060 <.do_clear_bss_start>:
      60:        aa 37               cpi        r26, 0x7A        ; 122
      62:        b1 07               cpc        r27, r17
      64:        e1 f7               brne        .-8              ; 0x5e <.do_clear_bss_loop>
      66:        0e 94 33 0a         call        0x1466        ; 0x1466 <main>
      6a:        0c 94 74 0d         jmp        0x1ae8        ; 0x1ae8 <_exit>

0000006e <__bad_interrupt>:
      6e:        0c 94 00 00         jmp        0        ; 0x0 <__vectors>


但是M88 就不是

出0入0汤圆

发表于 2014-10-26 12:56:23 | 显示全部楼层
not_at_all 发表于 2014-10-26 12:51
芯片选择是正确的   我用的是32位XP系统   WinAVR-20100110   avrstudio 4.18

我一直使用WINAVR20060421版,尚未發現有其他問題。
您可以嘗試使用手動命令行編譯試一下。

出0入4汤圆

发表于 2014-10-26 13:27:36 | 显示全部楼层
我刚才对比了一下用AVRStudio和不用AVRStudio(自己写Makefile组织工程)这两种情况生成的.lss,图片如下:

本帖子中包含更多资源

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

x

出0入4汤圆

发表于 2014-10-26 13:34:40 | 显示全部楼层
两者的main()的位置不一样,被调用方式也不同------一个是call,一个是rcall(竟然是很近)

出0入0汤圆

 楼主| 发表于 2014-10-26 14:10:39 | 显示全部楼层
sunliezhi 发表于 2014-10-26 13:34
两者的main()的位置不一样,被调用方式也不同------一个是call,一个是rcall(竟然是很近) ...

现在最大的问题是M88 不支持CALL  JMP 这两个指令   
估计要自己写makefile文件了

出0入0汤圆

发表于 2014-10-26 14:23:08 | 显示全部楼层
WINRAR不是有个自带的Makefile?以前用那个Makefile用的挺好的。

出0入0汤圆

发表于 2014-10-26 17:06:35 | 显示全部楼层
楼主,试一下IAR

出0入0汤圆

 楼主| 发表于 2014-10-26 17:39:28 | 显示全部楼层

实在解决不了再考虑其他编译器吧

出0入0汤圆

发表于 2014-10-26 18:30:10 来自手机 | 显示全部楼层
直接用avrstudio吧,一般没什么问题

出0入0汤圆

发表于 2014-10-26 19:01:16 | 显示全部楼层
记得 M8 也是只支持RCALL RJMP的 和M88应该差不多吧!  RCALL记得可以相对跳转4K字节的空间吧
然后看你的ROM地址9A(十进制地址:154)处指令如下: Rcall -3230
实际跳转的地址算法如下:  有一个字的地址单位的区别,应该是要加上的。所以可以认为你的RCALL跳转是正确的!!!!不是你程序运行就死循环的原因。

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-10-26 19:58:19 | 显示全部楼层
duxingkei 发表于 2014-10-26 19:01
记得 M8 也是只支持RCALL RJMP的 和M88应该差不多吧!  RCALL记得可以相对跳转4K字节的空间吧
然后看你的RO ...

我进行degug时,还没进入main函数就一直死循环。
如果这样不会影响程序运行的话,我再查一查程序上是否有其他原因造成死循环吧!

出0入0汤圆

发表于 2014-10-26 21:13:38 | 显示全部楼层
本帖最后由 xiaolaba 于 2014-10-26 21:22 编辑
not_at_all 发表于 2014-10-26 19:58
我进行degug时,还没进入main函数就一直死循环。
如果这样不会影响程序运行的话,我再查一查程序上是否有 ...


不優化, 可先制定 PROGM 嗎 ?可能 gcc 版本問題
另外看看 io.h 或者其他 .h, 為甚麼定義88的地址變成32位的負數, 問題可能是定義檔出錯.

出0入0汤圆

 楼主| 发表于 2014-10-26 21:40:29 | 显示全部楼层
xiaolaba 发表于 2014-10-26 21:13
不優化, 可先制定 PROGM 嗎 ?可能 gcc 版本問題
另外看看 io.h 或者其他 .h, 為甚麼定義88的地址變成32位 ...

不优化程序超范围    于程序地址关系不大,一旦涉及子程序调用或者跳转,且跳转范围大于2k,跳转相对地址就出现负数。其他地址正常。

出0入0汤圆

发表于 2014-10-26 23:24:53 | 显示全部楼层
not_at_all 发表于 2014-10-26 21:40
不优化程序超范围    于程序地址关系不大,一旦涉及子程序调用或者跳转,且跳转范围大于2k,跳转相对地址 ...

你可以寫個 HELLO WORLD 現確認問題點嗎
除非GCC有改過, 不然很少聽到這樣的問題

出0入0汤圆

 楼主| 发表于 2014-10-27 12:46:03 | 显示全部楼层
xiaolaba 发表于 2014-10-26 23:24
你可以寫個 HELLO WORLD 現確認問題點嗎
除非GCC有改過, 不然很少聽到這樣的問題 ...

只要删掉一大堆程序就正常了,基本上删得越多,出现这样的地方越少

出0入0汤圆

 楼主| 发表于 2014-10-27 12:50:42 | 显示全部楼层
现在基本上像14楼说的那样。优化过程序(之前进不了main函数的原因还没找出,只是纯粹优化过代码),程序基本能运行,但是DEBUG是还是有点怪怪的,有许多地方设不了断点。

14楼  duxingkei  的意见
-----------------------------------
记得 M8 也是只支持RCALL RJMP的 和M88应该差不多吧!  RCALL记得可以相对跳转4K字节的空间吧
然后看你的ROM地址9A(十进制地址:154)处指令如下: Rcall -3230
实际跳转的地址算法如下:  有一个字的地址单位的区别,应该是要加上的。所以可以认为你的RCALL跳转是正确的!!!!不是你程序运行就死循环的原因。

出0入0汤圆

发表于 2014-10-28 09:23:19 | 显示全部楼层
not_at_all 发表于 2014-10-27 12:50
现在基本上像14楼说的那样。优化过程序(之前进不了main函数的原因还没找出,只是纯粹优化过代码),程序基 ...

优化级别越高,被优化掉的代码就越多,当然不能断点咯,
这情况只能一段程序,一段去查!是在不行,查看C变成的汇编,研究下咯。
很有可能是程序不注意,不该优化的地方被优化掉咯。

出0入0汤圆

发表于 2014-10-28 14:02:19 | 显示全部楼层
。。。。。。这个是什么?

出0入0汤圆

发表于 2014-11-24 11:00:10 | 显示全部楼层
not_at_all 发表于 2014-10-27 12:46
只要删掉一大堆程序就正常了,基本上删得越多,出现这样的地方越少

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

本版积分规则

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

GMT+8, 2024-8-26 06:23

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

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