|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
AVR IO操作 |
| 作者:fujianhui 欄目:單片機(jī) |
if((PINA&0X01)==0)a++; +00000131: 91800039 LDS R24,0x0039 Load direct from data space +00000133: 2F28 MOV R18,R24 Copy register +00000134: 2733 CLR R19 Clear Register +00000135: E081 LDI R24,0x01 Load immediate +00000136: E090 LDI R25,0x00 Load immediate +00000137: 2782 EOR R24,R18 Exclusive OR +00000138: 2793 EOR R25,R19 Exclusive OR +00000139: 7081 ANDI R24,0x01 Logical AND with immediate +0000013A: 7090 ANDI R25,0x00 Logical AND with immediate +0000013B: 9700 SBIW R24,0x00 Subtract immediate from word +0000013C: F019 BREQ PC+0x04 Branch if equal +0000013D: 8189 LDD R24,Y+1 Load indirect with displacement +0000013E: 5F8F SUBI R24,0xFF Subtract immediate +0000013F: 8389 STD Y+1,R24 Store indirect with displacement 判斷一個IO口的電平要這么多語句嗎? 真暈?zāi)?.好象AVR的ROM很不經(jīng)用似的.. |
| 2樓: | >>參與討論 |
| 作者: yulye 于 2005/12/3 23:00:00 發(fā)布:
真的要這么多語句? 這樣感覺很恐怖啊,真的需要這么多語句嗎? 如果是這樣,我就不考慮AVR的芯片了 這也太沒有效率了 |
|
| 3樓: | >>參與討論 |
| 作者: zsmbj 于 2005/12/3 23:15:00 發(fā)布:
什么編譯器啊,優(yōu)化了沒有? 看看gcc編譯的吧,MEGA8515 if((PINA&0X01)==0)a++; 71c: c8 9b sbis 0x19, 0 ; 25 71e: 1f 5f subi r17, 0xFF ; 255 |
|
| 4樓: | >>參與討論 |
| 作者: javie 于 2005/12/4 10:07:00 發(fā)布:
應(yīng)該是優(yōu)化的不好 |
|
| 5樓: | >>參與討論 |
| 作者: fujianhui 于 2005/12/4 21:58:00 發(fā)布:
能告訴我怎么優(yōu)化的嗎? 我也是用GCC的..我可能沒優(yōu)化過..我不知道怎么優(yōu)化的..我是用AVR Studio開發(fā)環(huán)境的..里面怎么設(shè)置嗎? |
|
| 6樓: | >>參與討論 |
| 作者: fujianhui 于 2005/12/6 10:24:00 發(fā)布:
是優(yōu)化沒設(shè)置好。 我已經(jīng)找到在哪里設(shè)置優(yōu)化了。優(yōu)化一下是少了很多了。。哈哈 project-->configuration option 里面可以設(shè)置的 |
|
| 7樓: | >>參與討論 |
| 作者: javie 于 2005/12/6 11:06:00 發(fā)布:
樓上說的對 |
|
| 8樓: | >>參與討論 |
| 作者: fujianhui 于 2005/12/7 12:24:00 發(fā)布:
好象AVR優(yōu)化問題 好象AVR的優(yōu)化很有問題拉。 01級優(yōu)化還可以。到02級以上的時候把我的很多程序有省掉了。。很多延時程序都沒了。我沒有庫里的延時程序。 還有就是AVR編譯后的容量這么看的。 我是用AVR Studio開發(fā)環(huán)境的。GCC編譯器。 我已經(jīng)找了很長時間了沒看到。我知道在進(jìn)入調(diào)試仿真環(huán)境下在VIEW菜單下可以看到用掉多少ROM了。但這么好想很煩哦。。呵呵 |
|
| 9樓: | >>參與討論 |
| 作者: zsmbj 于 2005/12/7 12:40:00 發(fā)布:
不會無緣無故的以優(yōu)化的。 比如你寫了一個延遲程序,結(jié)果沒有調(diào)用,則gcc認(rèn)為沒有用處,會優(yōu)化掉。 其實延遲程序用delay.h的就很好啊。沒有必要自己再寫了。 |
|
| 10樓: | >>參與討論 |
| 作者: mingchong 于 2005/12/7 15:51:00 發(fā)布:
沒找到project-->configuration option 暈,我怎么沒找到這個菜單 |
|
| 11樓: | >>參與討論 |
| 作者: hotpower 于 2005/12/7 16:11:00 發(fā)布:
暈到,打開工程才能暈搞呀
|
|
| 12樓: | >>參與討論 |
| 作者: qjy_dali 于 2005/12/7 17:47:00 發(fā)布:
看來優(yōu)化級別真不能小視 |
|
| 13樓: | >>參與討論 |
| 作者: fujianhui 于 2005/12/8 8:22:00 發(fā)布:
還是優(yōu)化問題 AVR-GCC的優(yōu)化好象很有問題。我的程序用什么優(yōu)化都不行的.01優(yōu)化后也不行呢!這是沒有優(yōu)化過的語句: DDRA=0Xfe; +00000086: EF8E LDI R24,0xFE Load immediate +00000087: 9380003A STS 0x003A,R24 Store direct to data space 37: sbi(PORTA,1); +00000089: 9180003B LDS R24,0x003B Load direct from data space +0000008B: 6082 ORI R24,0x02 Logical OR with immediate +0000008C: 9380003B STS 0x003B,R24 Store direct to data space 38: while(bit_is_set(PINA,0)) +0000008E: 91800039 LDS R24,0x0039 Load direct from data space +00000090: 2799 CLR R25 Clear Register +00000091: 7081 ANDI R24,0x01 Logical AND with immediate +00000092: 7090 ANDI R25,0x00 Logical AND with immediate +00000093: 9700 SBIW R24,0x00 Subtract immediate from word +00000094: F061 BREQ PC+0x0D Branch if equal 40: DDRC=0x3D; //PC口設(shè)為輸出高電平,燈滅 +00000095: E38D LDI R24,0x3D Load immediate +00000096: 93800034 STS 0x0034,R24 Store direct to data space 41: DDRD=0X80; +00000098: E880 LDI R24,0x80 Load immediate +00000099: 93800031 STS 0x0031,R24 Store direct to data space 42: PORTD=0XFF; +0000009B: EF8F SER R24 Set Register +0000009C: 93800032 STS 0x0032,R24 Store direct to data space 44: PORTA=0X00;} 這是優(yōu)化過的語句: 36: DDRA=0Xfe; +0000007C: EF8E LDI R24,0xFE Load immediate +0000007D: BB8A OUT 0x1A,R24 Out to I/O location 37: sbi(PORTA,1); +0000007E: 9AD9 SBI 0x1B,1 Set bit in I/O register 44: PORTA=0X00;} +0000007F: 9BC8 SBIS 0x19,0 Skip if bit in I/O register set +00000080: C009 RJMP PC+0x000A Relative jump +00000081: E38D LDI R24,0x3D Load immediate +00000082: E890 LDI R25,0x80 Load immediate +00000083: EF2F SER R18 Set Register 40: DDRC=0x3D; //PC口設(shè)為輸出高電平,燈滅 +00000084: BB84 OUT 0x14,R24 Out to I/O location 41: DDRD=0X80; +00000085: BB91 OUT 0x11,R25 Out to I/O location 42: PORTD=0XFF; +00000086: BB22 OUT 0x12,R18 Out to I/O location +00000087: BA1B OUT 0x1B,R1 Out to I/O location +00000088: 99C8 SBIC 0x19,0 Skip if bit in I/O register cleared +00000089: CFFA RJMP PC-0x0005 Relative jump 全亂了 :while語句也沒了。 我才有1級優(yōu)化呢。 用2以上的話。什么delay()都沒了。 AVR-GCC的優(yōu)化真是怪呀。 |
|
| 14樓: | >>參與討論 |
| 作者: zsmbj 于 2005/12/8 9:06:00 發(fā)布:
沒亂。 gcc是非常聰明的,你的: while(bit_is_set(PINA,0)) 這句話什么用處也沒有,就是檔PINA的0如果為1時,結(jié)果什么也沒做。那么gcc還不給你優(yōu)化了! 所以說你就寫一個什么用處都沒有的函數(shù)或語句,gcc都會優(yōu)化掉以節(jié)省代碼。 |
|
| 15樓: | >>參與討論 |
| 作者: hudaidai 于 2005/12/8 9:25:00 發(fā)布:
To fujianhui: 在另一貼回了,再粘過來 你的程序avr-gcc優(yōu)化沒有問題,甚至可以說相當(dāng)精妙,就說這個while循環(huán): while(bit_is_set(PINA,0)) { DDRC=0x3D; //PC口設(shè)為輸出高電平,燈滅 DDRD=0X80; PORTD=0XFF; PORTA=0X00; } +0000007F: 9BC8 SBIS 0x19,0 Skip if bit in I/O register set /* 如果循環(huán)條件開始就不滿足,就不必做準(zhǔn)備工作的無用功了 */ +00000080: C009 RJMP PC+0x000A Relative jump /* 準(zhǔn)備工作:為了不在循環(huán)中反復(fù)地裝立即數(shù) */ +00000081: E38D LDI R24,0x3D Load immediate +00000082: E890 LDI R25,0x80 Load immediate +00000083: EF2F SER R18 Set Register /* 循環(huán)體內(nèi)容從這地方開始 */ 40: DDRC=0x3D; //PC口設(shè)為輸出高電平,燈滅 +00000084: BB84 OUT 0x14,R24 Out to I/O location 41: DDRD=0X80; +00000085: BB91 OUT 0x11,R25 Out to I/O location 42: PORTD=0XFF; +00000086: BB22 OUT 0x12,R18 Out to I/O location /* R1是avr-gcc的常0寄存器:PORTA=0X00 */ +00000087: BA1B OUT 0x1B,R1 Out to I/O location /* 判斷跳出循環(huán)的條件 */ +00000088: 99C8 SBIC 0x19,0 Skip if bit in I/O register cleared /* 繼續(xù)循環(huán) */ +00000089: CFFA RJMP PC-0x0005 Relative jump 請注意:循環(huán)一次只需要執(zhí)行6條指令,7個機(jī)器周期,這難道不正說明avr-gcc的優(yōu)化效率驚人嗎? |
|
| 16樓: | >>參與討論 |
| 作者: fujianhui 于 2005/12/9 20:28:00 發(fā)布:
GCC是不錯呢! 是比較不錯的. 不過有點想說一下.在模擬仿真下.IO口判斷會看不出來的呢! 最好在ICE.仿真呀..這樣看它的匯編就很清楚了 |
|
| 17樓: | >>參與討論 |
| 作者: joylight 于 2005/12/10 13:32:00 發(fā)布:
沒建工程就不能優(yōu)化了嗎? |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |