|
|||||||||||
| 技術(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 |
HT-PICC與CCSC效率初步比較 |
| 作者:jimmyqh.j 欄目:單片機(jī) |
我一直以來(lái)都在使用CCSC編譯器,其庫(kù)函數(shù)比較豐富,特別適合剛?cè)腴T(mén)的PIC單片機(jī)的C語(yǔ)言初學(xué)者.最近弄到一份HT-PICCV8.05PL1,所以作了一個(gè)簡(jiǎn)單的比較: 編譯器1:CCSC V3.249,9級(jí)優(yōu)化 編譯器2:HTPICC V8.05PL1,9級(jí)優(yōu)化 比較一: 用兩個(gè)編譯器對(duì)以下程序進(jìn)行編譯,設(shè)置正確的頭文件,晶振頻率4MHZ void main(void) { unsigned CHAR buf[10]={1,2,3,4,5,6,7,8,9,10}; unsigned CHAR i; unsigned CHAR j; //循環(huán)測(cè)試1 j=0; for(i=0;i<10;i++) { j+=buf[i]; } //循環(huán)測(cè)試2 j=0; i=10; while(i--) { j+=buf[i]; } //循環(huán)測(cè)試3 j=0; for(i=10;i>0;i--) { j+=buf[i-1]; } #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 循環(huán)1時(shí)間 循環(huán)2時(shí)間 循環(huán)3時(shí)間 編譯器1: 75 18 127 129 127 編譯器2: 69 12 121 108 92 比較二:將數(shù)據(jù)類(lèi)型換成16位的整形 用兩個(gè)編譯器對(duì)以下程序進(jìn)行編譯,設(shè)置正確的頭文件,晶振頻率4MHZ,時(shí)間單位us void main(void) { unsigned int buf[10]={1,2,3,4,5,6,7,8,9,10}; unsigned int i; unsigned int j; //循環(huán)測(cè)試1 j=0; for(i=0;i<10;i++) { j+=buf[i]; } //循環(huán)測(cè)試2 j=0; i=10; while(i--) { j+=buf[i]; } //循環(huán)測(cè)試3 j=0; for(i=10;i>0;i--) { j+=buf[i-1]; } #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 循環(huán)1時(shí)間 循環(huán)2時(shí)間 循環(huán)3時(shí)間 編譯器1: 153 31 312 305 382 編譯器2: 133 26 273 285 264 無(wú)法想像他們的差有那么大,看來(lái)在考慮使用小單片機(jī)實(shí)現(xiàn)高效率時(shí),選擇編譯器也十分重要.當(dāng)然我始終不會(huì)忘記CCSC為我編譯的那些可愛(ài)的程序. 以上僅對(duì)循環(huán)語(yǔ)句做比較,以后再將SWITCH做個(gè)比較. |
| 2樓: | >>參與討論 |
| 作者: 2008wqz 于 2006/8/17 8:39:00 發(fā)布:
ddd 頂 祖國(guó)需要你這樣鑽研的人 |
|
| 3樓: | >>參與討論 |
| 作者: lanyong 于 2006/8/17 10:17:00 發(fā)布:
haha 建議全部貼出來(lái).我編譯看看. 基本現(xiàn)在是差不多的了。 不過(guò)picc會(huì)好點(diǎn). |
|
| 4樓: | >>參與討論 |
| 作者: jimmyqh.j 于 2006/8/17 16:36:00 發(fā)布:
對(duì)SWITCH的測(cè)試 其實(shí)我只是想比較一下兩種編譯器的效率,因?yàn)槲医?jīng)常要用小單片機(jī)來(lái)實(shí)現(xiàn)一些復(fù)雜的功能.并沒(méi)有象2008wqz兄說(shuō)的那么夸張. 以下是對(duì)SWITCH的測(cè)試程序片斷: #include <16f73.h> //ccsc #TYPE SHORT=16, INT=16, LONG=32 void main(void) { unsigned CHAR i; unsigned CHAR j; for(i=0;i<10;i++) { SWITCH(i) { case 0:j=0;break;//防止被優(yōu)化所以取不同值 case 1:j=1;break; case 2:j=2;break; case 3:j=3;break; case 4:j=4;break; case 5:j=5;break; case 6:j=6;break; case 7:j=7;break; case 8:j=8;break; case 9:j=9;break; } } #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 循環(huán)1時(shí)間 CCSC: 70 7 256 PICC: 67 3 292 從這個(gè)比較結(jié)果來(lái)看,CCSC表現(xiàn)不錯(cuò),查看匯編碼發(fā)現(xiàn)原來(lái)CCSC的跳轉(zhuǎn)表放在程序區(qū)的低段,而PICC的放置在程序高段,多了對(duì)PCLATH的操作. |
|
| 5樓: | >>參與討論 |
| 作者: jimmyqh.j 于 2006/8/17 16:44:00 發(fā)布:
對(duì)SWITCH的測(cè)試2 下面是無(wú)符號(hào)整形的SWITCH-CASE比較: void main(void) { unsigned int i; unsigned int j; for(i=0;i<10;i++) { SWITCH(i) { case 0:j=0;break; case 1:j=1;break; case 2:j=2;break; case 3:j=3;break; case 4:j=4;break; case 5:j=5;break; case 6:j=6;break; case 7:j=7;break; case 8:j=8;break; case 9:j=9;break; } } #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 循環(huán)1時(shí)間 CCSC: 140 9 605 PICC: 83 8 453 查看匯編碼發(fā)現(xiàn),CCSC已經(jīng)不是用跳轉(zhuǎn)表來(lái)實(shí)現(xiàn)了,而是用減是否為0的方式來(lái)判斷跳轉(zhuǎn)的.而PICC是通過(guò)跳轉(zhuǎn)表來(lái)實(shí)現(xiàn)的. |
|
| 6樓: | >>參與討論 |
| 作者: lanyong 于 2006/8/17 16:48:00 發(fā)布:
實(shí)驗(yàn)下指針,picc好象要強(qiáng)很多哦,哈哈. |
|
| 7樓: | >>參與討論 |
| 作者: jimmyqh.j 于 2006/8/17 17:11:00 發(fā)布:
數(shù)據(jù)查表的比較 我們經(jīng)常使用查表,現(xiàn)在再對(duì)查表進(jìn)行一下比較. const unsigned CHAR table[]= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 }; void main(void) { unsigned CHAR i; unsigned CHAR j; j=0; //計(jì)時(shí)開(kāi)始 i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; //計(jì)時(shí)結(jié)束 #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 循環(huán)1時(shí)間 CCSC: 79 8 130 PICC: 84 2 110 他們的時(shí)間差在表格上. 下面是整形表格: const unsigned int table[]= { 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109 }; void main(void) { unsigned int i; unsigned CHAR j; j=0; //計(jì)時(shí)開(kāi)始 i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; i=table[j++]; //計(jì)時(shí)結(jié)束 #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 循環(huán)1時(shí)間 CCSC: 189 10 310 PICC: 144 4 210 可以查看匯編碼查看他們的不同.今天要下班了,明天再將乘除實(shí)現(xiàn)的效率作個(gè)比較. |
|
| 8樓: | >>參與討論 |
| 作者: jimmyqh.j 于 2006/8/18 9:24:00 發(fā)布:
乘除法的比較 乘除法的比較: 一、單字節(jié)乘除法 void main(void) { unsigned CHAR i; unsigned CHAR j; i=5; j=15; i=i*j; i=i/j; #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 乘法時(shí)間 除法時(shí)間 CCSC: 92 7 47 99 PICC: 102 7 55 84 二、單字節(jié)與無(wú)符號(hào)整形乘除法,因?yàn)樵趩纹瑱C(jī)程序中此種計(jì)算方式經(jīng)常發(fā)生。 void main(void) { unsigned int i; unsigned CHAR j; i=5; j=15; i=i*j; i=i/j; #asm clrwdt #endasm } 比較結(jié)果: 代碼長(zhǎng)度(WORDS) 數(shù)據(jù)長(zhǎng)度(BYTES) 乘法時(shí)間 除法時(shí)間 CCSC: 104 8 221 344 PICC: 126 10 96 337 三、兩種編譯器均不支持遞歸調(diào)用 |
|
| 9樓: | >>參與討論 |
| 作者: jimmyqh.j 于 2006/8/18 9:52:00 發(fā)布:
對(duì)函數(shù)指針的支持 對(duì)函數(shù)指針的支持測(cè)試: typedef unsigned int (*PFUNC)(unsigned int); unsigned int func1(unsigned int param) { return ++param; } unsigned int func2(unsigned int param) { return --param; } void main(void) { unsigned int i; unsigned int j; PFUNC funcs[2]; funcs[0]=func1; funcs[1]=func2; i=0x0100; for(j=0;j<2;j++) { i=(*funcs[j])(i); } #asm clrwdt #endasm } 比較結(jié)果: CCSC: 編譯不通過(guò) PICC: 支持 |
|
| 10樓: | >>參與討論 |
| 作者: jimmyqh.j 于 2006/8/18 9:54:00 發(fā)布:
好了 好了,暫時(shí)不作比較了,我已經(jīng)有了我要的答案。 |
|
| 11樓: | >>參與討論 |
| 作者: lanyong 于 2006/8/18 10:11:00 發(fā)布:
haha,乘法的時(shí)候, ccs,你用_mul();實(shí)驗(yàn)下. unsigned CHAR i; unsigned CHAR j; i=5; j=15; i*j;得到的是一個(gè)8bit的數(shù). |
|
| 12樓: | >>參與討論 |
| 作者: lanyong 于 2006/8/18 10:18:00 發(fā)布:
兄弟,再比較下中斷 |
|
| 13樓: | >>參與討論 |
| 作者: pubstar 于 2006/8/19 10:34:00 發(fā)布:
我一直用CCS,關(guān)鍵是好用,幾乎不用看資料,看一下頭文件即可 |
|
| 14樓: | >>參與討論 |
| 作者: jimmyqh.j 于 2006/8/19 21:26:00 發(fā)布:
關(guān)于中斷的比較 lanyong兄,關(guān)于中斷其實(shí)我覺(jué)得無(wú)法比較,首先CCSC的中斷程序的實(shí)現(xiàn)要比PICC的方便很多,它幫你處理了大部分的工作,剩下的部分跟寫(xiě)普通函數(shù)區(qū)別不大. 這是優(yōu)點(diǎn)但同時(shí)限制了自由度,所以CCSC有一個(gè)處理所有中斷的方法.而PICC則將中斷處理完全交給了用戶(hù),中斷標(biāo)志也必須由用戶(hù)完成,所以特別自由不過(guò)工作量也大了不少. 就象pubstar說(shuō)的一樣CCSC太容易上手了,所以選CCSC還是PICC確實(shí)要看自己的需要. 我所做的比較也是為了自己的需要做準(zhǔn)備,因?yàn)橛械臅r(shí)候單片機(jī)的時(shí)間和空間要求都比較高.但如果那些都不重要的話(huà),我想我會(huì)選擇CCSC,因?yàn)橛盟_(kāi)發(fā)速度會(huì)快不少,畢竟也沒(méi)我還沒(méi)有發(fā)現(xiàn)CCSC的什么錯(cuò)誤 |
|
| 15樓: | >>參與討論 |
| 作者: linwei1234 于 2006/8/21 11:15:00 發(fā)布:
使用不同的語(yǔ)句編譯也會(huì)有不同的代碼! |
|
| 16樓: | >>參與討論 |
| 作者: ocon 于 2006/8/21 13:38:00 發(fā)布:
我用CCS,因?yàn)閴蛏倒,頂不住的時(shí)候插匯編搞定。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |