这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ICCAVR,C51,gt 大哥们帮我看一下,为什么ICCAVR产生的代码比C5

共2条 1/1 1 跳转至

ICCAVR,C51,gt 大哥们帮我看一下,为什么ICCAVR产生的代码比C51的代码大多了啊->

院士
2006-09-17 18:14:16     打赏
ICCAVR,C51,gt 大哥们帮我看一下,为什么ICCAVR产生的代码比C51的代码大多了啊->



关键词: ICCAVR     哥们     帮我     看一下     为什么     生的         

院士
2006-12-22 22:43:00     打赏
2楼

同样功能且程序结构一样,ICC AVR 产生的代码为 500多个字节, 而KC51 产生的代码只有 200多个字节,为什么会出现这么大的差别?
不是说AVR产生的代码量比51要小的多码?    大哥们帮我看一下我的ICCAVR的程序那里需要改进! 谢谢
------------------ICC AVR----------------------
#include"io8515v.h"
#include"macros.h"
#include"xd.h"

uchar DSPwei;    
uchar DSP_buf[7];   //显存

const uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};  //段码
                  
void setreg(void);                  
                  
void main(void)
{

    setreg();

    DSP_buf[0]=1;
    DSP_buf[1]=2;
    DSP_buf[2]=3;
    DSP_buf[3]=4;
    DSP_buf[4]=5;
    DSP_buf[5]=6;
    DSP_buf[6]=7;
     
    while(1);
    
}    


#pragma interrupt_handler DSPlayint:8

void DSPlayint(void)
{   uchar DSPtem,n;

    PORTB|=0x0f;       //关显示

    if(++DSPwei>6) DSPwei=0;    //¹²ÏÔʾ7λ 0--6

    switch(DSPwei)
    {   case 0:
            DSPtem=duan[DSP_buf[0]];
            break;
        case 1:
            DSPtem=duan[DSP_buf[1]];
            break;
        case 2:
            DSPtem=duan[DSP_buf[2]];
            break;
        case 3:
            DSPtem=duan[DSP_buf[3]];
            break;
        case 4:
            DSPtem=duan[DSP_buf[4]];
            break;
        case 5:
            DSPtem=duan[DSP_buf[5]];
            break;
        case 6:
            DSPtem=duan[DSP_buf[6]];
            break;
    }

    for(n=0;n<8;n++)                  //段码通过74LS164串入并出
    {   PORTB|=~BIT(PB4);
        if(DSPtem&0x80)
            PORTB|=BIT(PB5);
        else
            PORTB|=~BIT(PB5);
        DSPtem<<=1;
        PORTB|=BIT(PB4);
    }

    n=DSPwei+0xf0;    //选通显示位
    PORTB&=n;

    TCNT0=0xf1;            //&para;¨&Ecirc;±&frac14;&AElig;&Ecirc;&yacute;&AElig;÷0&cedil;&sup3;&sup3;&otilde;&Ouml;&micro;
}

void setreg()
{
    CLI(); //disable all interrupts
      
    DDRB=0xff;
        
    TCNT0=0xf1;            //&para;¨&Ecirc;±&frac14;&AElig;&Ecirc;&yacute;&AElig;÷0&cedil;&sup3;&sup3;&otilde;&Ouml;&micro;
    
    TCCR0&=0b11111000;    
    TCCR0|=0b00000101;    //&Eacute;è&Ouml;&Atilde;&Ecirc;±&Ouml;&Oacute;&Ocirc;&acute;&sup2;&cent;&AElig;&ocirc;&para;&macr;&para;¨&Ecirc;±&frac14;&AElig;&Ecirc;&yacute;&AElig;÷0
    
    TIMSK|=BIT(TOIE0);    //&Ocirc;&Ecirc;&ETH;í&para;¨&Ecirc;±&frac14;&AElig;&Ecirc;&yacute;&AElig;÷0&Ograve;&ccedil;&sup3;&ouml;&Ouml;&ETH;&para;&Iuml;,    

    SEI(); //re-enable interrupts
}

--------------------C51---------------------
#include<reg52.h&gt;
#include<xd.h&gt;
//#include<xdprj.h&gt;
sbit pDSPclk=P1^4;      //&Iuml;&Ocirc;&Ecirc;&frac34;&Ecirc;±&Ouml;&Oacute;&Iuml;&szlig;
sbit pDSPdat=P1^5;      //&Iuml;&Ocirc;&Ecirc;&frac34;&Ecirc;&yacute;&frac34;&Yacute;&Iuml;&szlig;
uchar DSPwei;    //&Iuml;&Ocirc;&Ecirc;&frac34;&micro;&frac12;&micro;&Uacute;&frac14;&cedil;&Icirc;&raquo;
iuchar DSP_buf[7];   //&Iuml;&Ocirc;&Ecirc;&frac34;&raquo;&ordm;&acute;&aelig;&Ccedil;&oslash;,7&Icirc;&raquo;&Iuml;&Ocirc;&Ecirc;&frac34;&Ecirc;&yacute;&frac34;&Yacute;
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
                                    
void setreg();                  
                  
void main()
{
    setreg();
    DSP_buf[0]=8;
    DSP_buf[1]=8;
    DSP_buf[2]=8;
    DSP_buf[3]=8;
    DSP_buf[4]=8;
    DSP_buf[5]=8;
    DSP_buf[6]=8;
    //db=0xff;//&ETH;&iexcl;&Ecirc;&yacute;&micro;&atilde;
    
    
    while(1);
    
    
    
}    



void DSPlayint() interrupt 1
{   uchar DSPtem,n;
    P1|=0x0f;       //&Atilde;&eth;&Iuml;&Ocirc;&Ecirc;&frac34;
    if(++DSPwei&gt;6) DSPwei=0;    //&sup1;&sup2;&Iuml;&Ocirc;&Ecirc;&frac34;7&Icirc;&raquo; 0--6
    switch(DSPwei)
    {   case 0:
            DSPtem=duan[DSP_buf[0]];
            break;
        case 1:
            DSPtem=duan[DSP_buf[1]];
            break;
        case 2:
            DSPtem=duan[DSP_buf[2]];
            break;
        case 3:
            DSPtem=duan[DSP_buf[3]];
            break;
        case 4:
            DSPtem=duan[DSP_buf[4]];
            break;
        case 5:
            DSPtem=duan[DSP_buf[5]];
            break;
        case 6:
            DSPtem=duan[DSP_buf[6]];
            break;
    }
    for(n=0;n<8;n++)
    {   pDSPclk=Low;
        pDSPdat=(bit)(DSPtem&0x80);
        DSPtem<<=1;
        pDSPclk=High;
    }
    n=DSPwei+0xf0;
    P1&=n;
    TH0=0xfa;     /*&para;¨&Ecirc;±&AElig;÷0&cedil;&sup3;&sup3;&otilde;&Ouml;&micro;*/
   TL0=0x00;
}

void setreg()
{
    //----&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;I/O&iquest;&Uacute;----
    P0=0xff;
    P1=0xff;
    P2=0xff;
    P3=0xff;

        TMOD&=0xf0;
       TMOD|=0x01;
    TH0=0x00;    //&para;¨&Ecirc;±&AElig;÷0&cedil;&sup3;&sup3;&otilde;&Ouml;&micro;
    TL0=0x00;
    ET0=High;   //High&Icirc;&ordf;&Ocirc;&Ecirc;&ETH;í&para;¨&Ecirc;±&AElig;÷0&Ouml;&ETH;&para;&Iuml;,Low&Icirc;&ordf;&frac12;&ucirc;&Ouml;&sup1;&para;¨&Ecirc;±&AElig;÷0&Ouml;&ETH;&para;&Iuml;
    PT0=Low;   //High&Icirc;&ordf;&Ouml;&Atilde;&para;¨&Ecirc;±&AElig;÷0&cedil;&szlig;&frac14;&para;&Ouml;&ETH;&para;&Iuml;,Low&Icirc;&ordf;&Ouml;&Atilde;&para;¨&Ecirc;±&AElig;÷0&micro;&Iacute;&frac14;&para;&Ouml;&ETH;&para;&Iuml;
        TR0=High;   //High&Icirc;&ordf;&iquest;&ordf;&para;¨&Ecirc;±&AElig;÷0,Low&Icirc;&ordf;&sup1;&Oslash;&para;¨&Ecirc;±&AElig;÷0
        EA=High;    //High&Icirc;&ordf;&Ouml;&ETH;&para;&Iuml;×&Uuml;&Ocirc;&Ecirc;&ETH;í,Low&Icirc;&ordf;&Ouml;&ETH;&para;&Iuml;×&Uuml;&frac12;&ucirc;&Ouml;&sup1;
} 1: 长是正常的AVR是RISC、51是CISC,同样功能的程序,AVR的速度比51快的多,但是代码也长:原因是它是精简指令系统,同样一个操作要用能多的机器码完成。

另外,你的编程风格不够好也是造成代码长的一个原因。应当使用指针处理的部分你全部使用了下标访问,代码又长、效率又低。您这是使用C语言写了PASCAL风格的程序:) 2: 我也认为AVR产生的代码比C51的代码大可能是AVR的指令长度是16bit,很多时候都会比51多一个byte的code吧. 3: 我也认为AVR产生的代码比C51的代码大而且差不多就是原代码的二倍

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]