zllfdd 发表于 2019-10-15 10:30:59

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

看下面代码:

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

renpeng009672 发表于 2019-10-15 10:36:23

变量名碉堡了

zllfdd 发表于 2019-10-15 10:41:31

renpeng009672 发表于 2019-10-15 10:36
变量名碉堡了

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

d__xin 发表于 2019-10-15 10:49:30

之前也遇到过,电脑中毒了、系统不正常就会这样。会出现很莫名奇妙的问题。换个电脑就好了,重装也会好。有时重启再编译也会好。

marker 发表于 2019-10-15 10:55:31

变量为0可以进入,单步调将优化调到0,不优化。用过winavr没发现什么问题。

tomzbj 发表于 2019-10-15 10:59:49

贴完整程序? 至少把整个函数贴出来吧...

wye11083 发表于 2019-10-15 12:09:14

avr gcc确实有各种小毛病,比如rom超过16kb就开始不正常了,折腾了一天多放弃,转用riscv。

atommann 发表于 2019-10-15 12:12:49

WinAVR-20100110 是调用 avr-gcc, 这个是 2010 年的版本。
我建议你用最新的 avr-gcc, 或者安装 Arduino IDE 来编译你的代码。Arduino 环境是可以用纯 C 开发的。

jueenkay 发表于 2019-10-15 20:35:54

变量在中断中值被修改过?

zxq6 发表于 2019-10-15 21:00:33

最近也在被zynq的gcc编译搞得头疼,以太网通信,2017.4编译出来,本来正常可以跑800多M,然额,代码中再增加一句话,比如printf一个字符串,就杯具了,通信速度下降到可怜的几M,还在矛盾,是不是跑linux会有所改善?

freeboyxd 发表于 2019-10-15 21:11:04

光这两句也看不出来问题,代码写的不够规范时优化级别会有一些影响的

dellric 发表于 2019-10-15 21:51:44

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

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

zxq6 发表于 2019-10-16 08:18:18

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

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

Gorgon_Meducer 发表于 2019-10-16 19:30:31

试试看-O0下行为对不对。记住:无论你用什么芯片,哪怕是RV,高优化等级情况下,单步调试是不可信的。

hpdell 发表于 2019-10-19 17:33:02

怎么不使用 iar-avr 编译器,这个编译器很好用,而且还能够直接操作 寄存器的 任意位

zllfdd 发表于 2019-10-20 20:42:46

tomzbj 发表于 2019-10-15 10:59
贴完整程序? 至少把整个函数贴出来吧...

程序比较乱,不好意思贴。不是很确定winavr有bug,不想再试了,暂时放弃了。
后来调这个程序时,想起两年前用winavr时也发现了一些问题,同时也为了支持64位整数就换了新版本的编译器。
查相关资料时发现也有人说winavr有bug,不过我不是很确定:
https://stackoverflow.com/questions/21791440/avrstudio-4-19-toolchain-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

zllfdd 发表于 2019-10-20 20:45:22

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

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

zllfdd 发表于 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/avr-support/avr-and-arm-toolchains-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)

zllfdd 发表于 2019-10-20 20:57:03

jueenkay 发表于 2019-10-15 20:35
变量在中断中值被修改过?

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

zllfdd 发表于 2019-10-20 21:08:12

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

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

zllfdd 发表于 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用的很少,暂时放弃了。

duxingkei 发表于 2019-10-20 21:16:57

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

用volatile修饰下也许。。。。

hpdell 发表于 2019-10-20 21:35:19

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

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

tomzbj 发表于 2019-10-20 22:05:43

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

至少把你的fuck的声明/定义贴出来, 是函数内的局部变量? static? volatile? 还是全局static变量? 跨文件变量? 有没有在中断里操作?
以及fuck地址前面是不是有数组, 访问越界了?
页: [1]
查看完整版本: 用WinAVR编译器,遇到一个奇怪的问题。