音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ī)
AVR IO操作
   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
真的要這么多語句?
這樣感覺很恐怖啊,真的需要這么多語句嗎?
如果是這樣,我就不考慮AVR的芯片了
這也太沒有效率了

3樓: >>參與討論
zsmbj
什么編譯器啊,優(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
應(yīng)該是優(yōu)化的不好
 
5樓: >>參與討論
fujianhui
能告訴我怎么優(yōu)化的嗎?
我也是用GCC的..我可能沒優(yōu)化過..我不知道怎么優(yōu)化的..我是用AVR Studio開發(fā)環(huán)境的..里面怎么設(shè)置嗎? 

6樓: >>參與討論
fujianhui
是優(yōu)化沒設(shè)置好。
我已經(jīng)找到在哪里設(shè)置優(yōu)化了。優(yōu)化一下是少了很多了。。哈哈
project-->configuration option 里面可以設(shè)置的

7樓: >>參與討論
javie
樓上說的對
 
8樓: >>參與討論
fujianhui
好象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
不會無緣無故的以優(yōu)化的。
比如你寫了一個延遲程序,結(jié)果沒有調(diào)用,則gcc認(rèn)為沒有用處,會優(yōu)化掉。

其實延遲程序用delay.h的就很好啊。沒有必要自己再寫了。

10樓: >>參與討論
mingchong
沒找到project-->configuration option
暈,我怎么沒找到這個菜單

11樓: >>參與討論
hotpower
暈到,打開工程才能暈搞呀
 

12樓: >>參與討論
qjy_dali
看來優(yōu)化級別真不能小視
 
13樓: >>參與討論
fujianhui
還是優(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
沒亂。
gcc是非常聰明的,你的:
while(bit_is_set(PINA,0))
這句話什么用處也沒有,就是檔PINA的0如果為1時,結(jié)果什么也沒做。那么gcc還不給你優(yōu)化了!

所以說你就寫一個什么用處都沒有的函數(shù)或語句,gcc都會優(yōu)化掉以節(jié)省代碼。



15樓: >>參與討論
hudaidai
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
GCC是不錯呢!
是比較不錯的.
不過有點想說一下.在模擬仿真下.IO口判斷會看不出來的呢!
最好在ICE.仿真呀..這樣看它的匯編就很清楚了

17樓: >>參與討論
joylight
沒建工程就不能優(yōu)化了嗎?
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
在ICC中如何訪問FLASH內(nèi)的特定地址?
請問CodeVisionAVR 中的delay_ms函數(shù)有關(guān)中斷嗎?
MEGA88的模擬比較為何不工作?
GCC高人再來看一下。
各位老大,來看看這段位操作的代碼怎么仿真不對呢
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號