返回列表 发新帖

[讨论]WinAVR的bug?

[复制链接]

1

主题

32

帖子

0

积分

一年级

积分
0
发表于 2010-3-10 12:53:38 | 显示全部楼层 | 阅读模式
<p>以前用cv2编程,这几天下了个codeblocks,用WinAVR试试看,结果出现了一个奇怪的问题,如下:</p><p>我定义了串口波特率的宏:</p><p>#define OSC  8000000</p><p>#define Uart_Baud 9600</p><p>关键的在下面:</p><p>#define UBRR_DAT        ((OSC/(16*Uart_Baud))-1)</p><p>...</p><p>{</p><p>UBRRH = (uint8)(UBRR_DAT&gt;&gt;8);       </p><p>UBRRL = (uint8)UBRR_DAT;</p><p>}</p><p>结果,杯具了,编译出现"warning: integer overflow in expression",说数值溢出了;然后在studio里面看了一下,的确错了。</p><p>更杯具的是我把宏改了一下:</p><p>#define UBRR_DAT        (((OSC/16)/Uart_Baud)-1)</p><p>然后编译,无警告。。运行。。正常。。</p><p>不死心的用AVR Studio建了个工程试试,还是一样。。</p><p>难道真的是Bug?<br/><br/><br/><br/></p>
回复

使用道具 举报

0

主题

7

帖子

0

积分

幼儿园

积分
0
发表于 2010-3-22 11:34:48 | 显示全部楼层
<p>#define Uart_Baud 9600</p><p>应该定义成</p><p>#define Uart_Baud 9600L</p>
[此贴子已经被作者于2010-3-22 11:51:06编辑过]
回复 支持 反对

使用道具 举报

1

主题

32

帖子

0

积分

一年级

积分
0
发表于 2010-3-22 11:51:54 | 显示全部楼层
<p>谢谢!</p><p>看来以前用keil和cv都没注意这个问题啊。。</p><p>#define OSC  8000000L</p><p>#define Uart_Baud 9600L</p><p>这样就可以了。</p>
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

积分

幼儿园

积分
0
发表于 2010-3-22 11:52:04 | 显示全部楼层
16*Uart_Baud 已经超过2字节了,所以需要把它变成Long
回复 支持 反对

使用道具 举报

1

主题

32

帖子

0

积分

一年级

积分
0
发表于 2010-3-22 12:15:46 | 显示全部楼层
<p>看来还是GCC做的比较严谨啊。。受教了</p>
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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