最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

WinAVR 把我的這些代碼優(yōu)化掉了, 為什么??

作者:athlon64fx 欄目:單片機(jī)
WinAVR 把我的這些代碼優(yōu)化掉了, 為什么??
    if(sta)
    {
        uint8_t TEMP2;
                      
        TEMP2 = old_sta << 3;
        old_sta = TEMP;
        sta |= TEMP2;
            
        if(sta == 0b001001)             //a_0
            set_a_0_delay = set_delay;
            
        else if(sta == 0b000001)    //a_1
            set_a_1_delay = set_delay;

        else if(sta == 0b010010)    //b_0
            set_b_0_delay = set_delay;

        else if(sta == 0b000010)    //b_1
            set_b_1_delay = set_delay;

        else if(sta == 0b100100)    //c_0
            set_c_0_delay = set_delay;

        else if(sta == 0b000100)    //c_1
            set_c_1_delay = set_delay;
    }

編譯的結(jié)果如下

71:               if(sta)
+0000003D:   1798        CP      R25,R24          Compare
+0000003E:   F3E1        BREQ    PC-0x03          Branch if equal
75:                   old_sta = TEMP;
+0000003F:   2F98        MOV     R25,R24          Copy register
---- No Source ------------------------------------------------------------------------------------
+00000040:   CFFA        RJMP    PC-0x0005        Relative jump


哪怕優(yōu)化級(jí)別設(shè)為1也不行, 非得關(guān)閉優(yōu)化.
SWITCH 也一樣!
為什么?

2樓: >>參與討論
athlon64fx
優(yōu)化級(jí)別為0時(shí)正常!
71:               if(sta)
+00000048:   8189        LDD     R24,Y+1          Load indirect with displacement
+00000049:   2388        TST     R24              TEST for Zero or Minus
+0000004A:   F3A9        BREQ    PC-0x0A          Branch if equal
74:                   TEMP2 = old_sta << 3;
+0000004B:   818A        LDD     R24,Y+2          Load indirect with displacement
+0000004C:   0F88        LSL     R24              Logical Shift Left
+0000004D:   0F88        LSL     R24              Logical Shift Left
+0000004E:   0F88        LSL     R24              Logical Shift Left
+0000004F:   838C        STD     Y+4,R24          Store indirect with displacement
75:                   old_sta = TEMP;
+00000050:   818B        LDD     R24,Y+3          Load indirect with displacement
+00000051:   838A        STD     Y+2,R24          Store indirect with displacement
76:                   sta |= TEMP2;
+00000052:   8199        LDD     R25,Y+1          Load indirect with displacement
+00000053:   818C        LDD     R24,Y+4          Load indirect with displacement
+00000054:   2B89        OR      R24,R25          Logical OR
+00000055:   8389        STD     Y+1,R24          Store indirect with displacement
78:                   if(sta == 0b001001)    //a_0
+00000056:   8189        LDD     R24,Y+1          Load indirect with displacement
+00000057:   3089        CPI     R24,0x09         Compare with immediate
+00000058:   F429        BRNE    PC+0x06          Branch if not equal
79:                       set_a_0_delay = set_delay;
+00000059:   91800060    LDS     R24,0x0060       Load direct from data space
+0000005B:   93800066    STS     0x0066,R24       Store direct to data space
+0000005D:   CFE2        RJMP    PC-0x001D        Relative jump
81:                   else if(sta == 0b000001)    //a_1
+0000005E:   8189        LDD     R24,Y+1          Load indirect with displacement
+0000005F:   3081        CPI     R24,0x01         Compare with immediate
+00000060:   F429        BRNE    PC+0x06          Branch if not equal
82:                       set_a_1_delay = set_delay;
+00000061:   91800060    LDS     R24,0x0060       Load direct from data space
+00000063:   93800068    STS     0x0068,R24       Store direct to data space
+00000065:   CFDA        RJMP    PC-0x0025        Relative jump
84:                   else if(sta == 0b010010)    //b_0
+00000066:   8189        LDD     R24,Y+1          Load indirect with displacement
+00000067:   3182        CPI     R24,0x12         Compare with immediate
+00000068:   F429        BRNE    PC+0x06          Branch if not equal
85:                       set_b_0_delay = set_delay;
+00000069:   91800060    LDS     R24,0x0060       Load direct from data space
+0000006B:   9380006A    STS     0x006A,R24       Store direct to data space
+0000006D:   CFD2        RJMP    PC-0x002D       
3樓: >>參與討論
athlon64fx
明白了,可能是因?yàn)榍懊嬗羞@一句 TEMP = PIND & 0x07;
 
4樓: >>參與討論
athlon64fx
懷疑是不是大多數(shù)變量定義時(shí)都要加 volatile !
否則沒(méi)有安全感

5樓: >>參與討論
hotpower
估計(jì)set_a_0_delay等變量以后沒(méi)作用
 
6樓: >>參與討論
athlon64fx
在中斷里用到了,但也被優(yōu)化了
后來(lái)都加了關(guān)鍵字volatile

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
WINAVR的cof文件在Studio中調(diào)用還是C格式嗎
串行接口SPI接口應(yīng)用設(shè)計(jì)
74ahcu04的字符代表什么意思?他的速率能達(dá)到多快
AVR有速度超過(guò)16MIPS的型號(hào)嗎?
大家?guī)兔?/a>
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào)