打印

KEIL 宏定义 BUG?

[复制链接]
4520|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:

使用特权

评论回复
5
ayb_ice| | 2012-6-27 08:32 | 只看该作者
强制转换就可以了,另外你这个宏定义本身就还有别的问题

使用特权

评论回复
6
sfesdm|  楼主 | 2012-6-27 18:02 | 只看该作者
5# ayb_ice 请问还有什么问题呢?请指教。

使用特权

评论回复
7
amwrdfe| | 2012-6-27 20:16 | 只看该作者
if()
px(xx);
else
xxx;
就知道啥问题了。

使用特权

评论回复
8
sfesdm|  楼主 | 2012-6-27 22:07 | 只看该作者
7# amwrdfe 有这个函数的

使用特权

评论回复
9
chenlubin1988| | 2012-6-28 00:29 | 只看该作者
Mark

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zxzgz52 + 1 OK
10
ayb_ice| | 2012-6-28 08:27 | 只看该作者
5# ayb_ice  请问还有什么问题呢?请指教。
sfesdm 发表于 2012-6-27 18:02
请看7楼

使用特权

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

粉丝