KEIL 宏定义 BUG?

[复制链接]
5612|10
 楼主| sfesdm 发表于 2012-6-26 19:16 | 显示全部楼层 |阅读模式
LPC2103,设置管脚模式的宏定义,如下:
#define P00(MODE)   PINSEL0 &= (~(0x00000003 << 0)); PINSEL0 |= (MODE << 0)
#define P01(MODE)   PINSEL0 &= (~(0x00000003 << 2)); PINSEL0 |= (MODE << 2)
#define P02(MODE)   PINSEL0 &= (~(0x00000003 << 4)); PINSEL0 |= (MODE << 4)
#define P03(MODE)   PINSEL0 &= (~(0x00000003 << 6)); PINSEL0 |= (MODE << 6)
#define P04(MODE)   PINSEL0 &= (~(0x00000003 << 8)); PINSEL0 |= (MODE << 8)
#define P05(MODE)   PINSEL0 &= (~(0x00000003 << 10));PINSEL0 |= (MODE << 10)
#define P06(MODE)   PINSEL0 &= (~(0x00000003 << 12));PINSEL0 |= (MODE << 12)
#define P07(MODE)   PINSEL0 &= (~(0x00000003 << 14));PINSEL0 |= (MODE << 14)
#define P08(MODE)   PINSEL0 &= (~(0x00000003 << 16));PINSEL0 |= (MODE << 16)
#define P09(MODE)   PINSEL0 &= (~(0x00000003 << 18));PINSEL0 |= (MODE << 18)
#define P010(MODE)  PINSEL0 &= (~(0x00000003 << 20));PINSEL0 |= (MODE << 20)
#define P011(MODE)  PINSEL0 &= (~(0x00000003 << 22));PINSEL0 |= (MODE << 22)
#define P012(MODE)  PINSEL0 &= (~(0x00000003 << 24));PINSEL0 |= (MODE << 24)
#define P013(MODE)  PINSEL0 &= (~(0x00000003 << 26));PINSEL0 |= (MODE << 26)
#define P014(MODE)  PINSEL0 &= (~(0x00000003 << 28));PINSEL0 |= (MODE << 28)
#define P015(MODE)  PINSEL0 &= (~(0x00000003 << 30));PINSEL0 |= (MODE << 30)



当使用P015(X)的时候,编译时就出现警告:
warning:  #61-D: integer operation result is out of range
而用函数进行移位操作,还是左移30位,就没有警告。。。
求大虾解释!!
原野之狼 发表于 2012-6-26 20:53 | 显示全部楼层
用个 do {} while(0) 包装一下
李富贵 发表于 2012-6-26 21:42 | 显示全部楼层
编译器告警完全正确,你自己想想你自己的问题吧。
 楼主| sfesdm 发表于 2012-6-26 21:57 | 显示全部楼层
奇了怪了,竟然忘了先百度。。。
因为编译器默认使用的是有符号的变量,所以就出现了溢出的情况,只要
#define P015(MODE)  PINSEL0 &= (~(0x00000003U << 30));PINSEL0 |= (MODE << 30)
就解决问题了:loveliness:
ayb_ice 发表于 2012-6-27 08:32 | 显示全部楼层
强制转换就可以了,另外你这个宏定义本身就还有别的问题
 楼主| sfesdm 发表于 2012-6-27 18:02 | 显示全部楼层
5# ayb_ice 请问还有什么问题呢?请指教。
amwrdfe 发表于 2012-6-27 20:16 | 显示全部楼层
if()
px(xx);
else
xxx;
就知道啥问题了。
 楼主| sfesdm 发表于 2012-6-27 22:07 | 显示全部楼层
7# amwrdfe 有这个函数的
chenlubin1988 发表于 2012-6-28 00:29 | 显示全部楼层
ayb_ice 发表于 2012-6-28 08:27 | 显示全部楼层
5# ayb_ice  请问还有什么问题呢?请指教。
sfesdm 发表于 2012-6-27 18:02
请看7楼
 楼主| sfesdm 发表于 2012-6-28 18:07 | 显示全部楼层
10# ayb_ice
有这个函数的
void PortMode(uchar PIN,uchar MODE)
{
    if(MODE > 3) return;
if(PIN > 31) return;
if(PIN<16)
{
     PINSEL0 &= (~(0x00000003 << (PIN*2)));
  PINSEL0 |= (MODE << (PIN*2));
}
    else if(PIN < 32)
{
     PINSEL1 &= (~(0x00000003 << ((PIN-16)*2)));
  PINSEL1 |= (MODE << ((PIN-16)*2));
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

346

帖子

3

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