| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | 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  | 
  
大家來發(fā)表一下WINAVR(GCC)的使用經(jīng)驗(yàn) | 
  
| 作者:xzliu 欄目:單片機(jī) | 
一直感覺ICC比較好用,最近好多人都在鼓動(dòng)用GCC,說它多好多好,似乎用GCC的人都理直氣壯的,禁不住誘惑試著用了一星期,可是我還沒有覺的好用,好好的程序優(yōu)化后就沒顯示了,甚至鍵盤也亂套了。 在ICC6.31A中,不優(yōu)化:51%; 優(yōu)化:47% WINAVR 不優(yōu)化:70%; s優(yōu)化:41%,但是不能用! 以上僅對FLASH,所以個(gè)人認(rèn)為GCC不優(yōu)化時(shí)的編譯效率并不高 ? 相信與我一樣遭遇的肯定不少,但是有關(guān)解決優(yōu)化問題的資料非常少,所以請大家發(fā)表一些使用經(jīng)驗(yàn),也包括其他方面。斑竹最好能開個(gè)專題。還有那個(gè)到處傳播的hotpower也來發(fā)表一下。 以下是我搜集的一些優(yōu)化注意事項(xiàng): 1。全局變量如果在中斷或子程序調(diào)用,定義時(shí)加 volatile限定; 2。中斷中用if else,不要用SWITCH? 找不到原貼了,沒法驗(yàn)證。 。。。  | 
  
| 2樓: | >>參與討論 | 
| 作者: zsmbj 于 2005/12/6 16:47:00 發(fā)布:
         注意第一點(diǎn)即可!否則將被優(yōu)化掉。  | 
  |
| 3樓: | >>參與討論 | 
| 作者: hotpower 于 2005/12/6 18:13:00 發(fā)布:
         暈到~~~我倒成了罪人了... 說實(shí)話我實(shí)戰(zhàn)沒一個(gè)是用C寫的,全是用C++寫的.包括小容量的AVR. 由于數(shù)據(jù)和代碼都封裝在類中,一般很難遇到需要加volatile限定的時(shí)候. 最容易暈的變量一般發(fā)生在函數(shù)和中斷共用的時(shí)候. 例: 此變量在主函數(shù)中+-等運(yùn)算,即寫操作.在中斷處理時(shí)測試變量,即讀操作. 這時(shí)優(yōu)化最容易搞暈,即認(rèn)為單寫或單讀都無意義. 這種變量最好加volatile限定為妙. 加volatile限定"原則": 只要某變量你認(rèn)為可能發(fā)生單寫或單讀,最好加volatile限定. 反正C++很少發(fā)生這種暈事,我只好在這里先賠罪好了. 都是"大人"了,應(yīng)該有主見了,好壞自己體會就是了... 
  | 
  |
| 4樓: | >>參與討論 | 
| 作者: javie 于 2005/12/6 18:28:00 發(fā)布:
         好東西啊  | 
  |
| 5樓: | >>參與討論 | 
| 作者: hudaidai 于 2005/12/7 9:58:00 發(fā)布:
         優(yōu)化是不會影響程序正確性的 出問題只能說明程序本來就有問題。 關(guān)于volatile的用法請搜索下本版的精華貼。  | 
  |
| 6樓: | >>參與討論 | 
| 作者: xiaoIIhei 于 2005/12/7 14:33:00 發(fā)布:
         好象浮點(diǎn)數(shù)轉(zhuǎn)ASCII碼不行 sprintf函數(shù),不能轉(zhuǎn)float到ASCII碼,我最后只好自己寫這部分轉(zhuǎn)換程序,比較郁悶,其它還不錯(cuò)  | 
  |
| 7樓: | >>參與討論 | 
| 作者: lvgaopan 于 2005/12/7 16:30:00 發(fā)布:
         優(yōu)化后程序不能用,肯定是你的程序結(jié)構(gòu)不合理 優(yōu)化后程序不能用,肯定是你的程序結(jié)構(gòu)不合理  | 
  |
| 8樓: | >>參與討論 | 
| 作者: testcode 于 2005/12/8 0:31:00 發(fā)布:
         dtostrf #include <stdlib.h> CHAR* dtostrf (double __val, CHAR __width, CHAR __prec, CHAR * __s)  | 
  |
| 9樓: | >>參與討論 | 
| 作者: fujianhui 于 2005/12/8 8:32: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)化真是怪呀。  | 
  |
| 10樓: | >>參與討論 | 
| 作者: xzliu 于 2005/12/8 8:44:00 發(fā)布:
         俺以后暫時(shí)用ICC了 俺現(xiàn)在感覺ICC還比較好用,優(yōu)化也沒問題?墒怯肎CC優(yōu)化就不行了,也是01優(yōu)化也不行,有時(shí)多個(gè)調(diào)用就什么也顯示不出來了,鍵盤也亂套了,有時(shí)間再研究研究  | 
  |
| 11樓: | >>參與討論 | 
| 作者: hudaidai 于 2005/12/8 9:17:00 發(fā)布:
         To fujianhui: 你的程序avr-gcc優(yōu)化沒有問題,甚至可以說相當(dāng)精妙,就說這個(gè)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個(gè)機(jī)器周期,這難道不正說明avr-gcc的優(yōu)化效率驚人嗎?  | 
  |
| 12樓: | >>參與討論 | 
| 作者: qjy_dali 于 2005/12/8 16:01:00 發(fā)布:
         術(shù)業(yè)有專攻 需要時(shí)間哪  | 
  |
| 13樓: | >>參與討論 | 
| 作者: lvgaopan 于 2005/12/8 16:08:00 發(fā)布:
         偶的程序全用-os優(yōu)化 從來沒出過什么問題  | 
  |
| 14樓: | >>參與討論 | 
| 作者: zhiwei 于 2005/12/9 9:01:00 發(fā)布:
         gcc的工程管理 我在gcc下新建一個(gè)工程后,添加了多個(gè)文件,進(jìn)行調(diào)用的時(shí)候都說找不到函數(shù),我都包含了*.h了啊,是不是對多文件管理不好啊?  | 
  |
| 15樓: | >>參與討論 | 
| 作者: mxh0506 于 2005/12/9 13:00:00 發(fā)布:
         用的什么版本的GCC呀? 我覺得還不錯(cuò),除了生成代碼大一些,某些頭文件有錯(cuò)等一些小問題之外,沒發(fā)現(xiàn)什么影響使用的大錯(cuò)誤  | 
  |
| 16樓: | >>參與討論 | 
| 作者: Anitya 于 2005/12/10 8:36:00 發(fā)布:
         WinAVR 挺好的.我們一直用它 avr-libc Manual 需要經(jīng)?.看了N+N遍都還能學(xué)到東西  | 
  |
| 17樓: | >>參與討論 | 
| 作者: AIRWILL 于 2005/12/10 19:49:00 發(fā)布:
         本人上次做了個(gè)對比 是 KEIL 移植過來的程序, gcc 效率要高些  | 
  |
| 18樓: | >>參與討論 | 
| 作者: hotpower 于 2005/12/11 3:29:00 發(fā)布:
         哈哈...有點(diǎn)暈了---祝賀自己從今起徹底拋棄PN 昨看抽簽現(xiàn)在暈到了,...  | 
  |
  | 
    
 
  | 
  
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |