微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机 运算能力 测试

51单片机 运算能力 测试

时间:11-19 来源:互联网 点击:
几天前在做51循迹小车程序的时候,为了能用得上PID算法,在程序中用了很多浮点数运算。大家都知道51单片机是8位单片机,而浮点数是32位的,当时我就在想,浮点运算用多了会不会影响到小车程序的反应速度和性能呢,当时为了完工,没有多想,只是想着——反正我在程序里也用不到多少,应该不会有太大的影响。

今天一想,为何不来做个测试呢,说做就做,程序很快调通了,测试结果也出来了。

首先说一下我所用的51单片机配置:

STC12C5A60S2增强型51单片机, 11.0592M晶振, 1T模式(1个时钟周期执行1条指令,大部分51单片机是12T的,单片机这点和PC不同)。

测试原理:

1.用片上定时器/计数器0实现了一个计时器;

2.记录一定量浮点数计算(加法)运算的总时间,并记录浮点运算测试过程中其他运算操作的时间;

3.利用以上记录的两个时间之差和运行前指定的运算次数即可算出每秒浮点运算次数(暂时用fps表示);

先来看看测试结果:

测试总时间:407s

平均速度:25047.8 fps

最快速度:33559.5 fps

最慢速度:22932.8 fps

再来看看我们的测试主体部分吧:

// 先指定浮点运算次数:n = 10000; send_str("t0\tt1\tt2\tfps\ips\r\n");while(1) {t0 = t_cur;	// float t_cur 为当前时间,由中断服务程序自动更新。for( i=0; i

在我笔记本电脑上的测试结果:

平均值:836263534
最大值:990099010
最小值:735294118

我笔记本的配置:

CPU:intel core i5 2.30GHz

RAM:2.00GB DDR3

操作系统:Win7旗舰版64bit

用此我们看到了二者的对比,笔记本的速度大约是单片机的 33387.7 倍( =836263534 /25047.8 )。然而,这并不是CPU的最快速度(毕竟是在操作系统上运行的 ,CPU同时需要处理其他任务),51MCU却是“开足马力了”。

由此我们也有了一个大致的概念:

增强型 51 单片机每秒也只能做几万次浮点运算(普通的只有它的 1/12 ,大概只有 两千多次/秒);

现在主流PC每秒能作将近一亿次浮点运算。

当然,在电脑上测试的程序要做些改动,运算次数的设定不能太小,否则在后面做除法的时候可能会溢出,而且次数设定得太少的时候误差也不叫大,下面贴出源码,仅供参考:

#include #include using namespace std;int main(){int i;float ft=0.001, ft0=0.0;clock_t t0, t1, t2;long n = 100000000;double time_cnt = 500.0;while(1) {t0 = clock();for( i=0; i time_cnt ) break;}return 0;}

我电脑上使用的是:g++ (GCC) 4.6.1(MinGW版)默认编译设置.

编译前面一段代码的是Keil uVersion 3.0,下面贴出程序全部源码,欢迎各位大虾拍砖。

main.c:

#include "def.h"#define LEDU 0x01#define LEDL 0x02#define LEDD 0x04#define LEDR 0x08sbit start=P0^5;int i, n;xdata float ft  = 0.001,ft0 = 0.0;xdata float t0 = 0.0,t1 = 0.0,t2 = 0.0,t3 = 0.0,t4 = 0.0;char ch=1, ch0=0;void init(){tm0_init(); UART_init(6);P0 &= 0x00;start=1;while( start );}void main(){init();restart(); // timer restart.// 先指定浮点运算次数:n = 100000; send_str("t0\tt1\tt2\tfps\ips\r\n");while(1) {t0 = t_cur;	// t_cur 为当前时间,由中断服务程序自动更新。for( i=0; i

def.h:

#ifndef _DEF_H_#define _DEF_H_#include "stc51.h"///////////////////////////////////////////////////////////////////////////////#define UART#define TIMER	/*  计时器,定时/计数器0实现  *////////////////////////////////////////////////////////////////////////////////typedef unsigned char uchar;typedef unsigned int  uint;typedef uchar uint8;#ifdef UART // 串口通信 				// UART.cvoid UART_init(uint8 mode);void send_data(char ch); // 向串口发送一个8位整数(非中断方式)void send_str(char* str); // 串口发送字符串	#define SENDOUT() send_str(buffer)#define sendout() SENDOUT()#include extern xdata char buffer[]; // 外部数组,串口字符串缓存.#endif#ifdef TIMER  // 计时器,定时器0实现.void tm0_init(void);void restart(void);// 计时变量:		   extern uint t_msec; // millisecond counter.extern uchar t_sec; // second counter.extern float t_cur; // second & millisecond.#endif//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void init(void);//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#endif // _DEF_H_

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top