打印

stm32 keil uV4优化出错

[复制链接]
5108|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uV4 优化选择LEVEL 0的时候程序完全正常,选择LEVEL 1-3 编译没有报错,但都不能正常运行
void address_set(volatile uint16_t x1,volatile uint16_t y1,volatile uint16_t x2,volatile uint16_t y2)
{
  //address_start(x1,y1);
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0020;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = x1;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0021;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = y1;
  //address_point(x1,y1,x2,y2);
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0050;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = x1;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0051;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = x2;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0052;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = y1;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0053;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = y2;
  //Write_COM(0x0022);      //Write Data to GRAM
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0022;
}

优化后这部分只执行了第一句 就跳过了, 变量X1,X2都显示out of scope
有人知道原因吗 ? 或者怎么设置可以不对这部分代码优化?
沙发
topcat54007|  楼主 | 2012-5-31 13:12 | 只看该作者
void block( uint16_t sx, uint16_t sy,uint16_t lx,uint16_t ly, uint16_t color)
{ int i,j;
  {
    address_set(sx,sy,sx+lx-1,sy+ly-1);    
for (i=ly;i;i--)
    { for (j=lx;j;j--)
      { Write_DATA(color);}
    }
  }
}

使用特权

评论回复
板凳
ilovezeno| | 2012-5-31 13:14 | 只看该作者
把反汇编放上来,要么你类型加__IO试下

使用特权

评论回复
地板
topcat54007|  楼主 | 2012-5-31 14:12 | 只看该作者
0x08000312 F04F40C0  MOV      r0,#0x60000000
    93:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = x1;
    94:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0021;
    95:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = y1;
    96:   //address_point(x1,y1,x2,y2);
    97:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0050;
    98:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = x1;
    99:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0051;
   100:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = x2;
   101:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0052;
   102:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = y1;
   103:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0053;
0x08000316 49EE      LDR      r1,[pc,#952]  ; @0x080006D0
   104:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = y2;
   105:   //Write_COM(0x0022);      //Write Data to GRAM
0x08000318 800B      STRH     r3,[r1,#0x00]
   106:   *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0022;
0x0800031A 2122      MOVS     r1,#0x22
0x0800031C 8001      STRH     r1,[r0,#0x00]
   107: }
0x0800031E 4770      BX       lr

使用特权

评论回复
5
i55| | 2012-5-31 14:42 | 只看该作者
给你看看俺的类似的程序

使用特权

评论回复
6
topcat54007|  楼主 | 2012-5-31 15:14 | 只看该作者
问题解决了 能解释一下原因吗?

使用特权

评论回复
7
ilovezeno| | 2012-5-31 19:21 | 只看该作者
问题解决了 能解释一下原因吗?
topcat54007 发表于 2012-5-31 15:14


你F12看看__IO是啥就知道了。。。。。

使用特权

评论回复
8
acgean| | 2012-6-1 08:54 | 只看该作者
有啥问题, 就是 volatile 的问题。

  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0020;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = x1;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00000000) = 0x0021;
  *(u16 *) (Bank1_SRAM1_ADDR + 0x00020000) = y1;

大量的相同地址的写, 会被编译器优化掉。 用 *(volatile u16 *) 定义地址就不会被优化掉了

使用特权

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

本版积分规则

0

主题

4

帖子

0

粉丝