设为首页 收藏本站 切换到窄版
查看: 5987|回复: 11

Arduino Due系列:单片机计算性能大比拼(51,AVR,MIPS,ARM)

[复制链接] qrcode

31

主题

34

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2016-6-7 08:10 PM | 显示全部楼层 |阅读模式
本帖最后由 QiaoJiannan 于 2016-6-8 10:41 编辑

    写这篇文章纯属偶然,MCU benchmark有很多方法,且不同类型MCU benchmark方法完全不同,很难说谁好快? 不过,对电子爱好者来说,还是挺想知道“我所用的MCU”计算到底多快?本文,就从打酱油、非专业、大无畏精神出发,探讨入门级单片机计算性能到底如何、如何。

    单片机能干的事儿很多啊,我通常用来:

  • 控制个灯啊、空调啊、电视啊、小车啊神马的。
  • 用传感器采集个温度啊、湿度啊、电压、电流、水流、人脸啊神马的。
  • 显示输出:液晶、OLED、数码管;声音;电风扇神马的。
  • 超低功耗:家里的中央控制系统基于树莓派,不到2W功耗。
  • 便携。貌似自己做成的东西极少具有便携性。。。

    在没有接触Arduino前都是用51倒腾,玩了有几年,觉得51是最适合电子爱好者用的芯片,简单、便宜、功能足够!但接触Arduino后才明白,原来还有这么个东东,比51先进得多,实在太好用了! 记得学51从二进制地址学起,不太好懂。后来用C开发经常问:“明明 c=a+b; print(c); 就行了,我干嘛要去学指令、寄存器、寻址?”高级语言屏蔽底层很多东西,让编程变得简单。并不是基础知识没用,这好比高等数学这道门槛(俺数学专业),你必须弄懂基础知识体系才能理解数学世界的美妙!但如果是经济学专业,不懂数学基础知识同样可以玩儿转经济学!你从中获得的乐趣跟你投入成正比。所以,我用单片机并不是科班那种需要弄懂MCU每个功能、每个模块,我用单片机就接接外设,完成我的想法而已。也许,只用到了单片机十分之一。说实话,极少使用单片机计算能力(话说这也不是单片机的强项呀),但如你要做个智能小车、四轴飞行器、PID控制,那就需要一定的计算能力了。

    开始,只是简单想看看单片机运算有多快,偶然机会跟坛友交换了一块chipKIT Uno32(MIPS芯片),就想横向比较一下不同MCU的差别,于是就有了本文。其实,计算能力通过指令时钟周期来计算,科学准确,但对于不太精通底层知识的我,汇编犹如天书,真心看不懂啊!所以,还是用我自己的土办法测一下吧。


先说测试方法和原理:

  • 只测试+、-、*、/、%五种操作符,uint8_t、uint16_t、uint32_t、uint64_t、float、double六种数据类型的性能。
  • 首先测10000次空循环的时间,然后在循环中加入操作数,记录总的时间,减去空循环时间就是计算消耗的时间。
  • 测试中由于有系统中断(Arduino、STM32都有Tick中断,51为计时也有中断),结果不会很准,话说也没指望它能有多准。。。
  • 编译器优化参数 -O0,一开始测出来的运行时间都为“零”,彻底凌乱。研究之后方得知,编译器优化干掉空循环,需通过参数关闭优化。
  • 不同芯片数据类型支持不一样,有些数据类型会缺失。例如Arduino Uno中的float和double是一样的,都是float;但32位架构MCU中的double是float宽度的两倍。


代码类似这样:



    说个小故事。如不关闭测试优化选型,把全局变量定义成局部变量,加法、减法的测试时间为“零”,没错,10000次计算不到4微秒,这显然不可能。后来研究一番方得知编译器默认优化参数是-Os,很多计算直接优化了。。。。


测试用的板子:

  • 传统的AT89C516,还有宏晶鼓吹的1T 51单片机(STC12C5A60S2)
  • Arduino UNO(ATmega 328),Arduino Due(Atmel SAM3X8E,ARM架