|
原来看过关于TKSUDIO的介绍,有些网友还是支持国人自己开发编译环境的,我抱着尝试的心态,试用了TK,第一的感觉就是界面很漂亮,那时候还在用五一,编译链用的是KEIL,仿真器也是学校买的周立功的。TK给我最深的映像就是用它来写代码很方便,智能感知和记录功能在编写大程序的时候很有用......
后来用AVR啦,由于AVR仿真器不能zhijie直接在TK里面使用,而且当时买开发板的时候卖家推荐使用ICC,我刚开始就是用ICC来的,一直用着很顺。一般做工程的时候就是用TK来编写代码,然后用ICC链接编译,再用AVR STUDIO仿真什么的。。。同时用到三个软件。
有一段时间,曾经用过TK带的编译链开发工程,全部在TK下面完成编写代码,链接编译工作,用AVT STUDIO仿真,后来发现TK的编译不是那么好用,经常会有编译没错,但是运行就有错,也有怀疑过自己程序有问题,后来编写了一些简单程序,同时用ICC和TK里面的GCC编译,运行起来确实有差别(工程配置CPU选择绝对没有问题)。
今天有时间,上周立功网站,看了TK又出了新版本,下载下来,装上,顺带也有时间,每次用ICC+TK+AVR STUDIO确实有点麻烦,想既然TK更新了,是不是再试试。抱着试一试的心态,我分别用ICC,TK建了连个工程,添加了一个一摸一样的源文件,没有用到什么都特殊的编译器自带函数,除了头文件引用不同,其他东西都相同的。工程目的是完成一个16*80点整LED的驱动,建好之后,分别编译,链接,产生代码。这次两个编译器都没有报错。
接下来是试验啦,我将TK编译的代码烧入系统,正常运行,然后将ICC的也烧入,一样正常,但是显示速度快了很多!我感觉是TK工程配置里面时钟设置问题,修改了之后,实验结果一样。原来就听说GCC的效率不高,是不是这个原因呢,继续试验。用AVR STUDIO分别打开GCC的.elf仿真文件和ICC得.cof文件,在程序同一个地方设置断点,运行,观察结果,结果令我很吃惊!同一段程序,ICC编译出来代码运行一遍用6827个周期,而TK里面的GCC编译出来的居然达到接近20000个周期,差了接近三倍!而且该程序不长,主要是循环多(附上代码,大家可以参考!)
![](http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_502799.jpg)
ICC编译出来的cof文件软仿结果 (原文件名:ICC.jpg)
![](http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_502800.jpg)
GCC编译出来的elf文件软仿结果 (原文件名:GCC.jpg)
大家可以清晰看到二者的巨大差距!我不明白的地方是,这么大的差距,是ICC编译链和GCC编译链本身的差别导致的还是TK STUDIO不完善导致的呢?我没有用过WIN AVR,用的同志可以用我的代码试验一下,我们一起探讨这个问题。说句实在话,TK STUDIO在界面风格上还是很吸引人的,脱离的编译器界面单一无味这一长期以来的现象,加入了很多人性化优点,大大提高了代码编写效率,要是我们能共同发现问题,反馈给周立功,最终收益的也将是我们。
以上是我个人的浅薄的见解,希望大家共同探讨,高手指点!
下面是程序代码(程序是有问题的,只供参考试验使用):
//数码管显示程序
#define uchar unsigned char
#define uint unsigned int
#include <avr/io.h>
//ch595的数据输入
#define clk 5
#define rclk 4
#define dat 6
//延时函数
void s_ms(unsigned int t)
{
for (;t>1;t--)
{
}
}
//写74hc4094函数
void sendbyte(uchar byte)
{
uchar i,tem;
for (i=0;i<8;i++)
{
PORTD&=~(1<<rclk);
PORTD&=~(1<<clk);
tem=(byte&0x80);
if (tem==0)
{
PORTD|=(1<<dat);
}
else
{
PORTD&=~(1<<dat);
}
byte=byte<<1;
PORTD|=(1<<clk);
}
}
const unsigned char d[]=
{
//同[16*16]横排
0x00,0x04,0x7F,0xFE,0x40,0x04,0x40,0x24,
0x5F,0xF4,0x40,0x04,0x40,0x24,0x4F,0xF4,
0x48,0x24,0x48,0x24,0x48,0x24,0x48,0x24,
0x4F,0xE4,0x48,0x24,0x40,0x14,0x40,0x08,
//舟[16*16]横排
0x02,0x00,0x04,0x10,0x1F,0xF8,0x10,0x10,
0x12,0x10,0x11,0x10,0x11,0x14,0xFF,0xFE,
0x10,0x10,0x12,0x10,0x11,0x10,0x11,0x10,
0x10,0x10,0x20,0x10,0x40,0x50,0x00,0x20,
//电[16*16]横排
0x02,0x00,0x02,0x00,0x02,0x10,0x7F,0xF8,
0x42,0x10,0x42,0x10,0x7F,0xF0,0x42,0x10,
0x42,0x10,0x7F,0xF0,0x42,0x10,0x02,0x00,
0x02,0x04,0x02,0x04,0x01,0xFC,0x00,0x00,
//子[16*16]横排
0x00,0x00,0x3F,0xF0,0x00,0x10,0x00,0x20,
0x00,0x40,0x01,0x80,0x01,0x04,0xFF,0xFE,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
//学[16*16]横排
0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,
0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
0x00,0x40,0x01,0x84,0xFF,0xFE,0x01,0x00,
0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
};
//主函数
main()
{
uint c=0;
uchar a=0,b=0,j=0,k=0,c0=0,c1=0, m=0,n=0,i=0,f=0;
DDRD=0xff; //初始化端口A
PORTD=0xff;
n=0;i=0;b=0;
for (n=0;n<=74;n++)
{
if (n>4)b=n-5;
else b=0;
for (m=200;m>0;m--)
{
for (i=0;i<=15;i++)
{
PORTD&=~(1<<rclk);
for (j=b;j<=n;j++)
{
for (k=0;k<=1;k++)
sendbyte(d[2*i+32*j+k]);
}
PORTD&=0Xf0;
PORTD|=(1<<rclk);
PORTD|=i;
}
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|