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

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
HT-PICC與CCSC效率初步比較
我一直以來(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
ddd
 頂 祖國(guó)需要你這樣鑽研的人

3樓: >>參與討論
lanyong
haha
建議全部貼出來(lái).我編譯看看.

基本現(xiàn)在是差不多的了。

不過(guò)picc會(huì)好點(diǎn).

4樓: >>參與討論
jimmyqh.j
對(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
對(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
實(shí)驗(yàn)下指針,picc好象要強(qiáng)很多哦,哈哈.
 
7樓: >>參與討論
jimmyqh.j
數(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
乘除法的比較
乘除法的比較:
一、單字節(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
對(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
好了
好了,暫時(shí)不作比較了,我已經(jīng)有了我要的答案。

11樓: >>參與討論
lanyong
haha,乘法的時(shí)候,
ccs,你用_mul();實(shí)驗(yàn)下.


  unsigned CHAR i;
  unsigned CHAR j;

    i=5;
    j=15;
    
   i*j;得到的是一個(gè)8bit的數(shù).



12樓: >>參與討論
lanyong
兄弟,再比較下中斷
 
13樓: >>參與討論
pubstar
我一直用CCS,關(guān)鍵是好用,幾乎不用看資料,看一下頭文件即可
 
14樓: >>參與討論
jimmyqh.j
關(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
使用不同的語(yǔ)句編譯也會(huì)有不同的代碼!
 
16樓: >>參與討論
ocon
我用CCS,因?yàn)閴蛏倒,頂不住的時(shí)候插匯編搞定。
 
參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
GPIO不能更改的問(wèn)題,幫忙解釋一下
dspic 穩(wěn)定性如何
區(qū)別
求助。。。。。。。。!
希望張明峰老師能幫我解答一下,PIC比較器和A/D同時(shí)使用的問(wèn)題?
免費(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)