在芯片推广这件事情上面,ST绝对是众厂商中最成功的一个。M7面世不久,F7已经深入人心,也有不少的产品已经用上F7。或许是我孤陋寡闻,未听说别家的M7如此红火。
从F1开始,8位机和16位机的市场被F1疯狂压榨。那是十年前的事情了。
F4现世,显然,还是来搅局的。携带的DSP和FPU,肯定的,它从低端DSP口中掠夺了一部分食物。MCU的高集成度和系统化,或许是未来的一个发展趋势,可能,哪天我们的电脑和手机也用MCU。
F7,没有带来太多改变,主要是进一步膨胀自身的性能、处理速度以及功耗比。
言归正传,F767,对于F746的改变,似乎不大。很多人可能就看重了2MB的rom,jpeg转码器。确实他们很有价值,但是别忘了,767实现了对双精度浮点的支持,DSP应该感到害怕。当然,不同的人关心的事物不同,我就对双精度浮点有更大的兴趣。
我总是关心代码效率,所以数据类型必然是十分重要的一方面。
说这么多,来实测一下767的双精度浮点的处理速度吧。
测试代码比较简单,可能测试结果不能100%的反应处理器性能,有兴趣的自己可以用更专业更全面的测试代码。
static volatile float a,b,c,d;
static volatile double la,lb,lc,ld;
void Float_Test(void)
{
u32 k=1000000;
while(k--)
{
a += 0.1f;//常数声明为float
b = a * 1.3f;
c = b / a;
d = a * (b - c);
}
}
void Double_Test(void)
{
u32 k=1000000;
while(k--)
{
la += 0.1;//常数默认为double
lb = la * 1.3;
lc = lb / la;
ld = la * (lb - lc);
}
}
int main(void)
{
RCC->AHB1ENR|=0x3;
LED_init();
while(1)
{
LED_con(LED_GREEN,LED_ON);
Float_Test();
LED_con(LED_GREEN,LED_OFF);
Double_Test();
}
}
每个测试循环都执行一百万次,然后用逻辑分析仪捕捉执行时间。
①、编译器使用双精度
float 的执行时间是:0.1667秒
double 的执行时间是:0.3102秒
双精度的耗时大约是单精度的两倍,毕竟是32位的内核,速度肯定有差别,具体和不使用双精度作个比较便知
②、编译器使用单精度
float 的执行时间是:0.1667秒
double 的执行时间是:1.179秒
float的执行时间没有变化,但是double的时间大约是开启双精度的4倍,可双精度浮点的支持对双精度浮点数的处理速度还是有很大的提升的。
③、不使用FPU
float 的执行时间是:0.6945秒
double 的执行时间是:1.116秒
double类型数据的处理速度没有明显变化,float速度约为之前的四分之一。
我手头正好有个746 discovery,可以对比一下。
对比结果是:不使用FPU和使用单精度浮点的处理速度基本是没有差别的,但是746是没有double的指令的,所以,,,
F767的target选项中有double这个选项,而746没有
F767-target
F746-target
介于F767的强大的浮点处理能力,能在那些应用上施展开伸手呢?
|