搜索
bottom↓
回复: 23

用WinAVR编译器,遇到一个奇怪的问题。

[复制链接]

出0入0汤圆

发表于 2019-10-15 10:30:59 | 显示全部楼层 |阅读模式
看下面代码:

代码运行不正常,调试时发现循环中一条if语句,单步执行每次都会意外的进入,看不出问题,无奈把代码改上图上的样子,依然可以执行到,真是崩溃了。
看了下生成的汇编代码,感觉不太正常,因为优化等级的原因,顺序完全是乱的。由于对汇编不熟悉,也看不出具体原因。
不知道是不是winavr有bug,版本是WinAVR-20100110

本帖子中包含更多资源

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

x

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

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

出0入0汤圆

发表于 2019-10-15 10:36:23 | 显示全部楼层
变量名碉堡了

出0入0汤圆

 楼主| 发表于 2019-10-15 10:41:31 | 显示全部楼层

临时加的,代表我此时的心情。

出0入169汤圆

发表于 2019-10-15 10:49:30 | 显示全部楼层
之前也遇到过,电脑中毒了、系统不正常就会这样。会出现很莫名奇妙的问题。换个电脑就好了,重装也会好。有时重启再编译也会好。

出0入0汤圆

发表于 2019-10-15 10:55:31 来自手机 | 显示全部楼层
变量为0可以进入,单步调将优化调到0,不优化。用过winavr没发现什么问题。

出0入362汤圆

发表于 2019-10-15 10:59:49 | 显示全部楼层
贴完整程序? 至少把整个函数贴出来吧...

出0入442汤圆

发表于 2019-10-15 12:09:14 来自手机 | 显示全部楼层
avr gcc确实有各种小毛病,比如rom超过16kb就开始不正常了,折腾了一天多放弃,转用riscv。

出0入4汤圆

发表于 2019-10-15 12:12:49 | 显示全部楼层
WinAVR-20100110 是调用 avr-gcc, 这个是 2010 年的版本。
我建议你用最新的 avr-gcc, 或者安装 Arduino IDE 来编译你的代码。Arduino 环境是可以用纯 C 开发的。

出0入0汤圆

发表于 2019-10-15 20:35:54 | 显示全部楼层
变量在中断中值被修改过?

出0入22汤圆

发表于 2019-10-15 21:00:33 来自手机 | 显示全部楼层
最近也在被zynq的gcc编译搞得头疼,以太网通信,2017.4编译出来,本来正常可以跑800多M,然额,代码中再增加一句话,比如printf一个字符串,就杯具了,通信速度下降到可怜的几M,还在矛盾,是不是跑linux会有所改善?

出0入0汤圆

发表于 2019-10-15 21:11:04 | 显示全部楼层
光这两句也看不出来问题,代码写的不够规范时优化级别会有一些影响的

出0入71汤圆

发表于 2019-10-15 21:51:44 | 显示全部楼层
zxq6 发表于 2019-10-15 21:00
最近也在被zynq的gcc编译搞得头疼,以太网通信,2017.4编译出来,本来正常可以跑800多M,然额,代码中再增加 ...

printf是最影响速度的,你看看串口的波特率和千兆网波特率相差了几个数量级哟

出0入22汤圆

发表于 2019-10-16 08:18:18 | 显示全部楼层
dellric 发表于 2019-10-15 21:51
printf是最影响速度的,你看看串口的波特率和千兆网波特率相差了几个数量级哟
...

这个printf只是在初始化的时候输出一次,不是在主循环里面输出的哈。

出0入296汤圆

发表于 2019-10-16 19:30:31 | 显示全部楼层
试试看-O0下行为对不对。记住:无论你用什么芯片,哪怕是RV,高优化等级情况下,单步调试是不可信的。

出0入0汤圆

发表于 2019-10-19 17:33:02 | 显示全部楼层
怎么不使用 iar-avr 编译器,这个编译器很好用,而且还能够直接操作 寄存器的 任意位

出0入0汤圆

 楼主| 发表于 2019-10-20 20:42:46 | 显示全部楼层
tomzbj 发表于 2019-10-15 10:59
贴完整程序? 至少把整个函数贴出来吧...

程序比较乱,不好意思贴。不是很确定winavr有bug,不想再试了,暂时放弃了。
后来调这个程序时,想起两年前用winavr时也发现了一些问题,同时也为了支持64位整数就换了新版本的编译器。
查相关资料时发现也有人说winavr有bug,不过我不是很确定:
https://stackoverflow.com/questi ... ain-using-gcc-4-7-x
“Avrstudio 4.19 + Jtagice MKII CN + gcc 4.3.2 + make works somehow. But my problem is that gcc 4.3.2 is rather buggy. ”

另外感谢大侠,看了你的这个帖子才知道如何显示程序的大小:
https://www.amobbs.com/thread-5641036-1-1.html

出0入0汤圆

 楼主| 发表于 2019-10-20 20:45:22 | 显示全部楼层
wye11083 发表于 2019-10-15 12:09
avr gcc确实有各种小毛病,比如rom超过16kb就开始不正常了,折腾了一天多放弃,转用riscv。 ...

avr我也不是很熟,用过几次,入门用的avr studio4.19+winavr,一起用到现在。老项目加新功能,折腾了下,还是放弃了。

出0入0汤圆

 楼主| 发表于 2019-10-20 20:55:43 | 显示全部楼层
atommann 发表于 2019-10-15 12:12
WinAVR-20100110 是调用 avr-gcc, 这个是 2010 年的版本。
我建议你用最新的 avr-gcc, 或者安装 Arduino ID ...

感谢提醒,winavr的gcc版本很老了,是4.3.3,多年未更新了。
换了新版本的编译器好多了,版本是3.6.2,gcc版本是5.4.0从这里下载的:
https://www.microchip.com/mplab/ ... lchains-c-compilers
Arduino IDE可能用的也是这个版本。

我用的是avr studio4.19,手头上只有串口的那种jtagice,所以不想换新版本的ide。
avr studio4.19用新版本的编译器有几个地方需要注意,我也写在这里吧:
1.如果有#include <avr\pgmspace.h>,需要定义#define __PROG_TYPES_COMPAT__
2.编译选项-gdwarf-2要改为-gstrict-dwarf -gpubnames,不然点调试时程序会直接崩溃。

新版本编译器化好很多,同样的程序,同样是-Os,结果差别很大:
avr8-gnu-toolchain-3.6.2.1759-win32.any.x86编译结果:
AVR Memory Usage
----------------
Device: atmega16
Program:   16004 bytes (97.7% Full)
(.text + .data + .bootloader)
Data:        877 bytes (85.6% Full)
(.data + .bss + .noinit)
===================================================
WinAVR-20100110编译结果:
AVR Memory Usage
----------------
Device: atmega16
Program:   17256 bytes (105.3% Full)
(.text + .data + .bootloader)
Data:        887 bytes (86.6% Full)
(.data + .bss + .noinit)

出0入0汤圆

 楼主| 发表于 2019-10-20 20:57:03 | 显示全部楼层
jueenkay 发表于 2019-10-15 20:35
变量在中断中值被修改过?

有可能,但应该不是这个原因,我在单步调试的时候是关闭中断的,不然会一直进中断,无法单步运行。

出0入0汤圆

 楼主| 发表于 2019-10-20 21:08:12 | 显示全部楼层
Gorgon_Meducer 发表于 2019-10-16 19:30
试试看-O0下行为对不对。记住:无论你用什么芯片,哪怕是RV,高优化等级情况下,单步调试是不可信的。 ...

非常感谢,确实如此,单步调试的时候程序跳来跳去,不是按原始代码的顺序执行的。
但是无法用-O0调试,因为程序中有很多字符串,在-Os模式下程序空间已经快要满了。
其实用winavr2010时,程序已经超出flash空间。换了新版本的编译器,优化的更好了,才可以装进mega16。详见18楼。

出0入0汤圆

 楼主| 发表于 2019-10-20 21:12:28 | 显示全部楼层
hpdell 发表于 2019-10-19 17:33
怎么不使用 iar-avr 编译器,这个编译器很好用,而且还能够直接操作 寄存器的 任意位 ...

iar挺好的,放在flash中的常量也可以直接访问,不像gcc,很麻烦。
这是个老项目,一开始用的是win-avr,换起来太麻烦,好像iar也不支持jtagice。我用的还是avr studion4.19。装在虚拟机里的,avr用的很少,暂时放弃了。

出0入0汤圆

发表于 2019-10-20 21:16:57 | 显示全部楼层
zllfdd 发表于 2019-10-20 21:12
iar挺好的,放在flash中的常量也可以直接访问,不像gcc,很麻烦。
这是个老项目,一开始用的是win-avr, ...

用volatile修饰下也许。。。。

出0入0汤圆

发表于 2019-10-20 21:35:19 | 显示全部楼层
zllfdd 发表于 2019-10-20 21:12
iar挺好的,放在flash中的常量也可以直接访问,不像gcc,很麻烦。
这是个老项目,一开始用的是win-avr, ...

iar-avr  v6.80.7 版本的是支持 jtag ice 的, 不过最新的版本里面有个 Atmel ICE  , 不知道这个是不是就是以前的 jtag ice 功能了 ?

出0入362汤圆

发表于 2019-10-20 22:05:43 | 显示全部楼层
zllfdd 发表于 2019-10-20 20:42
程序比较乱,不好意思贴。不是很确定winavr有bug,不想再试了,暂时放弃了。
后来调这个程序时,想起两年 ...

至少把你的fuck的声明/定义贴出来, 是函数内的局部变量? static? volatile? 还是全局static变量? 跨文件变量? 有没有在中断里操作?
以及fuck地址前面是不是有数组, 访问越界了?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-2 14:16

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

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