Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2251783
  • 博文数量: 187
  • 博客积分: 1457
  • 博客等级: 上尉
  • 技术积分: 2423
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-13 09:41
个人简介

如需要绘制PCB,设计电路可以和我联系。sunhenu@163.com.

文章分类

全部博文(187)

文章存档

2017年(2)

2016年(2)

2015年(7)

2014年(13)

2013年(80)

2012年(83)

分类: LINUX

2014-06-20 11:49:51

在调试STM32 IAR开发环境的时候碰到如下问题,宏定义
#define SDA_IN()     {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=8<<28;} (此行提示警告)
#define SDA_OUT() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=3<<28;}  (此行没有提示警告)

编译结果总是提示警告,针对上面红色的宏定义。
Warning[Pe068]: integer conversion resulted in a change of sign (整数转换导致符号变化
============================================================
实际上那个GPIOB->CRL是32位的寄存器,数值没有溢出啊。
后来google一下,有个网友的意见说,左移就是乘法,是有符号整数计算的。
8<<28的值,如果按照有符号乘法已经溢出了,如果是无符号的话就没有问题了。
下面的一个条宏定义3<<28即使按照有符号乘法也没有溢出,所以它没有提示警告。

解决方法强制类型转换,将有符号的转变为无符号的。
#define SDA_IN()         {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} 
#define SDA_OUT()    {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=3<<28;}  (此行没有提示警告) 

其实如果不管这个警告,程序运行也是正确的,但是我们在调试程序的时候还要多解决一些警告问题,不然代码总是有点缺陷的。


阅读(13322) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~