打印
[AVR单片机]

最新winavr(20070101)的问题

[复制链接]
4463|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cd8484|  楼主 | 2007-1-10 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zsmbj| | 2007-1-11 07:54 | 只看该作者

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

使用特权

评论回复
板凳
21ele| | 2007-1-11 16:06 | 只看该作者

我也发现有这个问题!!

使用特权

评论回复
地板
coldra| | 2007-1-11 16:07 | 只看该作者

没敢用新版

使用特权

评论回复
5
hotpower| | 2007-1-11 22:25 | 只看该作者

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

使用特权

评论回复
6
qjy_dali| | 2007-1-14 19:35 | 只看该作者

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

使用特权

评论回复
7
gtw| | 2007-1-16 12:41 | 只看该作者

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

我在98下一次都没有编译成功过
包括06版曾编译成功的程序和新建的程序

使用特权

评论回复
8
jovemeng| | 2007-1-16 23:22 | 只看该作者

这个不可能是GCC的问题

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

要用GCC还是在Linux下用着正点。

使用特权

评论回复
9
gtw| | 2007-1-17 08:26 | 只看该作者

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

用的是默认模版
有时会误删

使用特权

评论回复
10
gtw| | 2007-1-17 08:28 | 只看该作者

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

使用特权

评论回复
11
gtw| | 2007-1-18 08:29 | 只看该作者

06版的GCC我用KamAVR解决

07版仍是不行,在KamAVR下仍是__spawnv

使用特权

评论回复
12
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也可以了

使用特权

评论回复
13
gtw| | 2007-1-19 11:31 | 只看该作者

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


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

不过GCC没有模拟堆栈,只使用硬件堆栈,省了几个常用的快速寄存器,在多指针的应用效果较好
IAR使用指针Y做了一个模拟堆栈,就不那么好了

使用特权

评论回复
14
gtw| | 2007-1-19 11:32 | 只看该作者

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

使用特权

评论回复
15
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的头文件看起来似乎也不行

使用特权

评论回复
16
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)

使用特权

评论回复
17
gtw| | 2007-1-25 12:53 | 只看该作者

兼容问题

让大多数兼容少数本身就麻烦
再者可以自己再定义,也要加上对数据类型的判断……比较麻烦

使用特权

评论回复
18
athlon64fx| | 2007-1-26 14:18 | 只看该作者

很明显是avrstudio的问题

基本上不用考虑代码的兼容. 我一直用gnu99的C标准.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

23

帖子

0

粉丝