|
|||||||||||
| 技術(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ī) |
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 于 2004/12/2 23:43:00 發(fā)布:
優(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 于 2004/12/2 23:49:00 發(fā)布:
明白了,可能是因?yàn)榍懊嬗羞@一句 TEMP = PIND & 0x07; |
|
| 4樓: | >>參與討論 |
| 作者: athlon64fx 于 2004/12/3 0:20:00 發(fā)布:
懷疑是不是大多數(shù)變量定義時(shí)都要加 volatile ! 否則沒(méi)有安全感 |
|
| 5樓: | >>參與討論 |
| 作者: hotpower 于 2004/12/3 7:47:00 發(fā)布:
估計(jì)set_a_0_delay等變量以后沒(méi)作用 |
|
| 6樓: | >>參與討論 |
| 作者: athlon64fx 于 2004/12/3 9:12:00 發(fā)布:
在中斷里用到了,但也被優(yōu)化了 后來(lái)都加了關(guān)鍵字volatile |
|
|
|
| 免費(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) |