本帖最后由 plc_avr 于 2011-11-5 08:24 编辑
AVR的studio,软件仿真可以精确控制时间。因KEIL没有代码的执行时间预算,不知实际代码要多长时间,在时间要求高的场合非常重要。如果运算时间长了,其它的事就没法干了。做了个简单测试,在代码运行前置位一个IO,在运算的代码结束,清0这个IO,发现32位乘法运算要1us还要多。晕了,我主时钟开了50M的啊。不是单时钟周期乘法运算吗?后来看汇编文件,乘法运算只有一条指令,控制个IO要N条,我晕了。索性做IO输出0/1试验,结果出来了,50M时钟,用库只能达到1.0435M的翻转速度,还不如AVR,8M主时钟,IO翻转速度可以达到4M。这个效率真的太低了!后来用寄存器方式控制IO,结果一看令人相当震惊!达到了12M的速度。AVR不超频最快也只能达到8M,(16M时钟),看来得给AVR扔一边了。以后还是多用寄存器方式,呵呵。注意这个结果是在M0516芯片上测试的。
测试方法:用官方驱动库void main(void)
{
UNLOCKREG();
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
DrvSYS_SelectHCLKSource(0);
//DrvSYS_Open(48000000); // 48MHz
DrvSYS_Open(50000000);
SystemCoreClockUpdate();
delay_ms(100);
LOCKREG();
DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT );
while(1)
{
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_SetBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
DrvGPIO_ClrBit(E_PORT0,5);
}
}
相关图片:
测试方法:用寄存器
void main(void)
{
UNLOCKREG();
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
DrvSYS_SelectHCLKSource(0);
//DrvSYS_Open(48000000); // 48MHz
DrvSYS_Open(50000000);
SystemCoreClockUpdate();
delay_ms(100);
LOCKREG();
DrvGPIO_Open(E_PORT0, E_PIN5, E_IO_OUTPUT );
while(1)
{
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 1;
P05_DOUT = 0;
P05_DOUT = 0;
P05_DOUT = 0;
P05_DOUT = 0;
P05_DOUT = 0;
}
}
相关图片
|