打印

IAR430让偶很是郁闷!

[复制链接]
2229|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
音乐乐乐|  楼主 | 2008-6-12 09:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define UART_RX_IFG URXIFG0
#define UART_IFG    IFG1

偶将UART_TX_IFG直接换成0x80一个德行!
楞把      while (!(UART_IFG&UART_TX_IFG) ); 
编译成了        while (!UART_IFG );

相关帖子

沙发
yewuyi| | 2008-6-12 09:18 | 只看该作者

N多人用IAR FOR MSP都没意见……

呵呵,思考自己的代码为什么会被优化掉才是真理……

使用特权

评论回复
板凳
音乐乐乐|  楼主 | 2008-6-12 09:24 | 只看该作者

ls,偶已经考虑过优化问题

  把编译器的优化选项改为了None,然后Rebuild All,一个德行!

再说了,这么简单的几句话能优化成什么样?

void SendBytes(unsigned char*buff,unsigned char length)
{
  unsigned char i;

  delay_cycles(CRYSTAL/100);//10ms
  for(i=0;i<5;i++)
  {
     while (!(UART_IFG&UART_TX_IFG) );
      U_TXBUF = 0xff;
  }
  for(i=0;i<length;i++)
  {
    while ( !(UART_IFG & UART_TX_IFG) );
    U_TXBUF = *buff++;  
  }                 
}

使用特权

评论回复
地板
音乐乐乐|  楼主 | 2008-6-12 09:27 | 只看该作者

唉,嵌入汇编不会搞

asm("WT :   bit.b   #UART_TX_IFG, &UART_IFG ");
asm("       jz      WT");

提示:未定义
UART_TX_IFG
UART_IFG 
WT



使用特权

评论回复
5
computer00| | 2008-6-12 09:43 | 只看该作者

哈哈~~~估计编译器没那么弱智吧...

使用特权

评论回复
6
yewuyi| | 2008-6-12 10:48 | 只看该作者

提示一下:在IAR里面即使

把优化等级设置为NONE不代表就没有任何优化处理

使用特权

评论回复
7
音乐乐乐|  楼主 | 2008-6-12 11:03 | 只看该作者

00,这不还有图片在那儿嘛

yewuyi , 那该咋弄呢?子程序就这几行啊,再说这个编译结果与我想嵌入的汇编比较也没优化啊,字节一样多,速度也一样快,真是晕~

使用特权

评论回复
8
yewuyi| | 2008-6-12 11:19 | 只看该作者

UART_IFG和UART_TX_IFG是有相关性的把?

从这两个标志本身的相关性分析一下为何会被优化掉!?

使用特权

评论回复
9
音乐乐乐|  楼主 | 2008-6-12 11:23 | 只看该作者

第一个值是0x80

编译器自带头文件定义的:
#define DEFC(name, address) __no_init volatile unsigned char name @ address;

#define IFG1_               (0x0002)  /* Interrupt Flag 1 */
DEFC(   IFG1              , IFG1_)


偶定义的:
#define UART_RX_IFG URXIFG0
#define UART_IFG    IFG1


while (!(UART_IFG&UART_TX_IFG) ); 
直接写成:
while (!(UART_IFG&0x80) );  结果也一样

使用特权

评论回复
10
andrew.xu| | 2008-6-12 12:38 | 只看该作者

没错,iar还是很聪明的

lz看一下jge这条指令就明白了

使用特权

评论回复
11
hotpower| | 2008-6-12 12:58 | 只看该作者

UART_IFG&UART_TX_IFG的结果估计UART_IFG,用&&估计结果不同~~~

未实战过430~~~

UART_IFG&UART_TX_IFG   (这个肯定运算后为某值,例如UART_IFG)

不会是:

UART_IFG && UART_TX_IFG

吧???


使用特权

评论回复
12
音乐乐乐|  楼主 | 2008-6-12 18:19 | 只看该作者

11楼,还真没仔细研究这个指令

 原来这个指令没错啊,他把判断 A&0x80 是否为0当作判断A是否为负数来处理了,转了一个大弯,晕~
  12楼,是简单的与操作,不是“并且”的意思。偶没仔细看,这条指令翻译是对的,只不过转了个弯,呵呵。

使用特权

评论回复
13
computer00| | 2008-6-12 18:59 | 只看该作者

我就说编译器不会那么弱智的吧~~~~~

使用特权

评论回复
14
hotpower| | 2008-6-12 22:40 | 只看该作者

这么说UART_IFG&UART_TX_IFG等效为UART_IFG???

使用特权

评论回复
15
音乐乐乐|  楼主 | 2008-6-12 22:48 | 只看该作者

哈,菜农大侠,不是这么直接等效的哦

 可以这样理解吧:
unsigned char a;
 if(a&0x80!=0)

等效为: if((signed char)a<0),IAR的编译结果就是这么判断的。

使用特权

评论回复
16
hotpower| | 2008-6-12 23:32 | 只看该作者

哈哈~~~真没正式琢磨过430~~~不过会的~~~

所以现在连菜鸟都不是~~~更不是大侠~~~

unsigned char a;
if(a&0x80!=0)

等效为: if((signed char)a<0),IAR的编译结果就是这么判断的。


不过很有创意~~~

使用特权

评论回复
17
音乐乐乐|  楼主 | 2008-6-13 06:43 | 只看该作者

呵呵,是啊,原来没仔细对照代码长度

 换成小于0比较后确实节约了2个字节的空间,IAR连这个都想得到,佩服佩服!

使用特权

评论回复
18
ayb_ice| | 2008-6-13 09:21 | 只看该作者

PSW中有符号的MCU

编译器一般都能做到

使用特权

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

本版积分规则

350

主题

2293

帖子

3

粉丝