共2条
1/1 1 跳转至页
ICCAVR,C51,gt 大哥们帮我看一下,为什么ICCAVR产生的代码比C51的代码大多了啊->
问
同样功能且程序结构一样,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; //¶¨Ê±¼ÆÊýÆ÷0¸³³õÖµ
}
void setreg()
{
CLI(); //disable all interrupts
DDRB=0xff;
TCNT0=0xf1; //¶¨Ê±¼ÆÊýÆ÷0¸³³õÖµ
TCCR0&=0b11111000;
TCCR0|=0b00000101; //ÉèÖÃʱÖÓÔ´²¢Æô¶¯¶¨Ê±¼ÆÊýÆ÷0
TIMSK|=BIT(TOIE0); //ÔÊÐí¶¨Ê±¼ÆÊýÆ÷0Òç³öÖжÏ,
SEI(); //re-enable interrupts
}
--------------------C51---------------------
#include<reg52.h>
#include<xd.h>
//#include<xdprj.h>
sbit pDSPclk=P1^4; //ÏÔʾʱÖÓÏß
sbit pDSPdat=P1^5; //ÏÔʾÊý¾ÝÏß
uchar DSPwei; //ÏÔʾµ½µÚ¼¸Î»
iuchar DSP_buf[7]; //ÏÔʾ»º´æÇø,7λÏÔʾÊý¾Ý
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;//СÊýµã
while(1);
}
void DSPlayint() interrupt 1
{ uchar DSPtem,n;
P1|=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++)
{ pDSPclk=Low;
pDSPdat=(bit)(DSPtem&0x80);
DSPtem<<=1;
pDSPclk=High;
}
n=DSPwei+0xf0;
P1&=n;
TH0=0xfa; /*¶¨Ê±Æ÷0¸³³õÖµ*/
TL0=0x00;
}
void setreg()
{
//----³õʼ»¯I/O¿Ú----
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
TMOD&=0xf0;
TMOD|=0x01;
TH0=0x00; //¶¨Ê±Æ÷0¸³³õÖµ
TL0=0x00;
ET0=High; //HighΪÔÊÐí¶¨Ê±Æ÷0ÖжÏ,LowΪ½ûÖ¹¶¨Ê±Æ÷0ÖжÏ
PT0=Low; //HighΪÖö¨Ê±Æ÷0¸ß¼¶ÖжÏ,LowΪÖö¨Ê±Æ÷0µÍ¼¶ÖжÏ
TR0=High; //HighΪ¿ª¶¨Ê±Æ÷0,LowΪ¹Ø¶¨Ê±Æ÷0
EA=High; //HighΪÖжÏ×ÜÔÊÐí,LowΪÖжÏ×ܽûÖ¹
} 答 1: 长是正常的AVR是RISC、51是CISC,同样功能的程序,AVR的速度比51快的多,但是代码也长:原因是它是精简指令系统,同样一个操作要用能多的机器码完成。
另外,你的编程风格不够好也是造成代码长的一个原因。应当使用指针处理的部分你全部使用了下标访问,代码又长、效率又低。您这是使用C语言写了PASCAL风格的程序:) 答 2: 我也认为AVR产生的代码比C51的代码大可能是AVR的指令长度是16bit,很多时候都会比51多一个byte的code吧. 答 3: 我也认为AVR产生的代码比C51的代码大而且差不多就是原代码的二倍
同样功能且程序结构一样,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; //¶¨Ê±¼ÆÊýÆ÷0¸³³õÖµ
}
void setreg()
{
CLI(); //disable all interrupts
DDRB=0xff;
TCNT0=0xf1; //¶¨Ê±¼ÆÊýÆ÷0¸³³õÖµ
TCCR0&=0b11111000;
TCCR0|=0b00000101; //ÉèÖÃʱÖÓÔ´²¢Æô¶¯¶¨Ê±¼ÆÊýÆ÷0
TIMSK|=BIT(TOIE0); //ÔÊÐí¶¨Ê±¼ÆÊýÆ÷0Òç³öÖжÏ,
SEI(); //re-enable interrupts
}
--------------------C51---------------------
#include<reg52.h>
#include<xd.h>
//#include<xdprj.h>
sbit pDSPclk=P1^4; //ÏÔʾʱÖÓÏß
sbit pDSPdat=P1^5; //ÏÔʾÊý¾ÝÏß
uchar DSPwei; //ÏÔʾµ½µÚ¼¸Î»
iuchar DSP_buf[7]; //ÏÔʾ»º´æÇø,7λÏÔʾÊý¾Ý
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;//СÊýµã
while(1);
}
void DSPlayint() interrupt 1
{ uchar DSPtem,n;
P1|=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++)
{ pDSPclk=Low;
pDSPdat=(bit)(DSPtem&0x80);
DSPtem<<=1;
pDSPclk=High;
}
n=DSPwei+0xf0;
P1&=n;
TH0=0xfa; /*¶¨Ê±Æ÷0¸³³õÖµ*/
TL0=0x00;
}
void setreg()
{
//----³õʼ»¯I/O¿Ú----
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
TMOD&=0xf0;
TMOD|=0x01;
TH0=0x00; //¶¨Ê±Æ÷0¸³³õÖµ
TL0=0x00;
ET0=High; //HighΪÔÊÐí¶¨Ê±Æ÷0ÖжÏ,LowΪ½ûÖ¹¶¨Ê±Æ÷0ÖжÏ
PT0=Low; //HighΪÖö¨Ê±Æ÷0¸ß¼¶ÖжÏ,LowΪÖö¨Ê±Æ÷0µÍ¼¶ÖжÏ
TR0=High; //HighΪ¿ª¶¨Ê±Æ÷0,LowΪ¹Ø¶¨Ê±Æ÷0
EA=High; //HighΪÖжÏ×ÜÔÊÐí,LowΪÖжÏ×ܽûÖ¹
} 答 1: 长是正常的AVR是RISC、51是CISC,同样功能的程序,AVR的速度比51快的多,但是代码也长:原因是它是精简指令系统,同样一个操作要用能多的机器码完成。
另外,你的编程风格不够好也是造成代码长的一个原因。应当使用指针处理的部分你全部使用了下标访问,代码又长、效率又低。您这是使用C语言写了PASCAL风格的程序:) 答 2: 我也认为AVR产生的代码比C51的代码大可能是AVR的指令长度是16bit,很多时候都会比51多一个byte的code吧. 答 3: 我也认为AVR产生的代码比C51的代码大而且差不多就是原代码的二倍
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |