[AVR单片机] 最新winavr(20070101)的问题

[复制链接]
 楼主| cd8484 发表于 2007-1-10 16:57 | 显示全部楼层 |阅读模式
最新的winavr看来是好用一点,帮助文档比那个200604版的也要好,但我发现一个重大缺陷,就是2007版的编译不能用在avr studio中,只要开始debug运行,就会出现图中所示的提示
zsmbj 发表于 2007-1-11 07:54 | 显示全部楼层

看来studio要赶紧出sp5了。呵呵!

21ele 发表于 2007-1-11 16:06 | 显示全部楼层

我也发现有这个问题!!

coldra 发表于 2007-1-11 16:07 | 显示全部楼层

没敢用新版

hotpower 发表于 2007-1-11 22:25 | 显示全部楼层

哈哈~~~还是感觉20040720好用~~~真倒塌了~~~

qjy_dali 发表于 2007-1-14 19:35 | 显示全部楼层

我用来20050214比较多,情人节版本,呵呵

gtw 发表于 2007-1-16 12:41 | 显示全部楼层

难道07版的发行者没有试过吗?

我在98下一次都没有编译成功过
包括06版曾编译成功的程序和新建的程序
jovemeng 发表于 2007-1-16 23:22 | 显示全部楼层

这个不可能是GCC的问题

这个不可能是WinAVR的问题,也许是AVRStudio的问题,也可能的是你的配置有问题,还有可能是你的Makefile有问题,听说WinAVR2007的GCC是4.1.1版的,新版的GCC比以前有了很大的变化。不能生成COFF格式的调试信息所以在AVRStudio中不能调试。

要用GCC还是在Linux下用着正点。
gtw 发表于 2007-1-17 08:26 | 显示全部楼层

05和06版在Clean时会误删我添加的c程序文件

用的是默认模版
有时会误删
gtw 发表于 2007-1-17 08:28 | 显示全部楼层

07版在编译时直接出现__spawny这一错误

gtw 发表于 2007-1-18 08:29 | 显示全部楼层

06版的GCC我用KamAVR解决

07版仍是不行,在KamAVR下仍是__spawnv
gtw 发表于 2007-1-19 11:27 | 显示全部楼层

GCC的编译

均使用s优化,使用GCC的200604版本

在中断函数的编译中,如:
ISR(INT0_vect){
    GICR = ( 0<<INT1 ) | ( 0<<INT0 ) | ( 0<<IVSEL ) | ( 0<<IVCE);
}
编译结果:
0000006E: __vector_1
+0000006E:   921F        PUSH    R1               Push register on stack
+0000006F:   920F        PUSH    R0               Push register on stack
+00000070:   B60F        IN      R0,0x3F          In from I/O location
+00000071:   920F        PUSH    R0               Push register on stack
+00000072:   2411        CLR     R1               Clear Register
24:           GICR = ( 0<<INT1 ) | ( 0<<INT0 ) | ( 0<<IVSEL ) | ( 0<<IVCE);
+00000073:   BE1B        OUT     0x3B,R1          Out to I/O location
+00000074:   900F        POP     R0               Pop register from stack
+00000075:   BE0F        OUT     0x3F,R0          Out to I/O location
+00000076:   900F        POP     R0               Pop register from stack
+00000077:   901F        POP     R1               Pop register from stack
+00000078:   9518        RETI                     Interrupt return
优化效果不好,还有再优化的余地

SREG不用保存
即使保存,只用R0也可以了
gtw 发表于 2007-1-19 11:31 | 显示全部楼层

其次是未被调用的子程序不能优化掉


不知道07版的怎么样,改善不大吧

不过GCC没有模拟堆栈,只使用硬件堆栈,省了几个常用的快速寄存器,在多指针的应用效果较好
IAR使用指针Y做了一个模拟堆栈,就不那么好了
gtw 发表于 2007-1-19 11:32 | 显示全部楼层

IAR可以跨函数优化,GCC似乎不行

gtw 发表于 2007-1-19 17:03 | 显示全部楼层

我想让GCC与IAR程序兼容时发现

我建立在Flash中的表格数据

首先,建立的时候好说,IAR用关键字__flash,GCC用关键字PROGMEM
所以我用宏解决
#ifndef __flash
    #include <avr/pgmspace.h>
    #define __flash PROGMEM
#endif
这样原来在IAR做的表格在GCC就可以正常编译了
但是我访问这些固化表格时就麻烦的多,因为GCC对Flash中数据的操作提供的是几个宏:
pgm_read_byte(prog_void * addr)
pgm_read-word(prg_void *addr)
pgm_read_dword(prg_void* addr)
参阅这几个宏的内容,可见GCC中并没有把Flash区的数据作为变量/常量使用的概念,而这一点其他编译器却是有的。所以要兼容时就麻烦一些,只能让其他编译器兼容GCC,这就麻烦得多。
不知道那位大侠有什么好的办法。
如果改写GCC的头文件看起来似乎也不行
publicrtos 发表于 2007-1-25 08:58 | 显示全部楼层

15楼的,很容易

如果用IAR,定义一下下面的函数不就OK了?
pgm_read_byte(prog_void * addr)
pgm_read-word(prg_void *addr)
pgm_read_dword(prg_void* addr)
gtw 发表于 2007-1-25 12:53 | 显示全部楼层

兼容问题

让大多数兼容少数本身就麻烦
再者可以自己再定义,也要加上对数据类型的判断……比较麻烦
athlon64fx 发表于 2007-1-26 14:18 | 显示全部楼层

很明显是avrstudio的问题

基本上不用考虑代码的兼容. 我一直用gnu99的C标准.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

23

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部