单片性能干的事儿很多啊,我常日用来:
掌握个灯啊、空调啊、电视啊、小车啊神马的。
用传感器采集个温度啊、湿度啊、电压、电流、水流、人脸啊神马的。

显示输出:液晶、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架构的)
chipKit Uno32(PIC32MX320F128 MIPS架构)
ST Nucleo F0(STM32F030R8),Nucleo F1(STM32F103RB),都是ARM架构的
测试用开拓环境:
51谈不上什么优化参数,我用的uVision 2。晶振用22.1184M,听说这个电影可以跑到40M,我就呵呵一下好了。
Arduino IDE 1.6.9,图中2/3都是用Arduino环境,个中编译器参数须要修正platform.txt文件,默认是-Os(优化大小),改成-O0(完备不优化),这个要重启Arduino才能有效。。。
STM用的是MDK 5.16,HAL库。没办法,对STM32真不熟,能捣鼓出结果很不错了!
mbed计时函数有问题,F0、F1芯片无法得出微秒级韶光,只好用HAL,话说用CubeMX天生代码还真挺方便的。
计时方法:
51用TIMER0计时,这个太大略了,每计数 12/22.1184 微秒啊!
Arduino用系统micros(),根据两次记录的韶光差,精度4微秒。
STM用HAL库函数供应的HAL_GetTick(),通过HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/10000); 把计数器设为100微秒,再快会对打算有影响。
硬件解释:
部分芯片带硬件乘、除法器,啊,那个性能好的没话说。
32位MCU处理8/16/32位效果都是32位,但哀求不高的地方,8位也够。
结果通过串口返回,Arduino串口超大略、STM32用HAL库串口通信也还行,这51串口啊,我就不说了。
测试结果:
AT89C52(22.118M)STC 1T MCU(22.118M)Arduino UNO(-O0)Arduino Due(-O0)chipKIT Uno32(-O0)STM32F030(48M -O0)STM32F103(72M -O0)Base: 70619Base: 11773Base: 13836Base: 3815Base: 1378Base: 6000Base: 5600TEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_t +: 1.63us +: 0.36us +: 0.44us +: 0.34us +: 0.07us +: 0.33us +: 0.35us -: 2.17us -: 0.41us -: 0.56us -: 0.29us -: 0.07us -: 0.29us -: 0.37us : 4.34us : 0.59us : 0.62us : 0.36us : 0.10us : 0.33us : 0.35us /: 4.34us /: 0.63us /: 5.47us /: 0.31us /: 0.22us /: 12.56us /: 0.35us %: 4.89us %: 0.68us %: 5.53us %: 0.48us %: 0.21us %: 12.60us %: 0.40usTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_t +: 3.26us +: 0.72us +: 0.88us +: 0.34us +: 0.07us +: 0.33us +: 0.35us -: 3.80us -: 0.77us -: 1.00us -: 0.29us -: 0.07us -: 0.30us -: 0.37us : 22.81us : 3.17us : 1.38us : 0.36us : 0.10us : 0.33us : 0.35us /: 16.29us /: 2.49us /: 13.26us /: 0.31us /: 0.22us /: 12.56us /: 0.35us %: 16.29us %: 2.49us %: 13.20us %: 0.39us %: 0.21us %: 12.60us %: 0.47usTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_t +: 6.52us +: 1.45us +: 1.76us +: 0.40us +: 0.06us +: 0.29us +: 0.32us -: 7.06us -: 1.49us -: 2.01us -: 0.40us -: 0.06us -: 0.33us -: 0.32us : 71.68us : 9.73us : 6.35us : 0.33us : 0.08us : 0.29us : 0.33us /: 314.97us /: 42.53us /: 37.79us /: 0.40us /: 0.21us /: 11.84us /: 0.35us %: 319.31us %: 43.26us %: 37.79us %: 0.45us %: 0.20us %: 11.84us %: 0.46usTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_t +: 5.59us +: 0.38us +: 0.18us +: 0.48us +: 0.31us -: 5.59us -: 0.38us -: 0.18us -: 0.42us -: 0.40us : 24.71us : 0.46us : 0.22us : 23.47us : 0.36us /: 21.56us /: 2.39us /: 1.60us /: 66.51us /: 38.00us %: 21.94us %: 2.40us %: 1.50us %: 66.51us %: 37.95usTEST: floatTEST: floatTEST: floatTEST: floatTEST: floatTEST: floatTEST: float +: 118.69us +: 16.50us +: 9.56us +: 1.52us +: 0.97us +: 2.07us +: 1.24us -: 126.30us -: 17.54us -: 9.62us -: 1.52us -: 1.10us -: 2.22us -: 1.32us : 21.18us : 3.12us : 5.84us : 0.98us : 1.05us : 0.97us : 0.70us /: 40.19us /: 6.15us /: 5.78us /: 1.25us /: 0.93us /: 1.05us /: 0.78usTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: double +: 118.69us +: 16.50us +: 9.56us +: 1.82us +: 1.40us +: 4.26us +: 2.51us -: 126.30us -: 17.54us -: 9.62us -: 1.87us -: 1.51us -: 4.66us -: 2.57us : 21.18us : 3.12us : 5.84us : 0.92us : 1.37us : 1.69us : 1.11us /: 40.19us /: 6.15us /: 5.78us /: 1.39us /: 1.20us /: 1.33us /: 0.89us剖析:
Base是空循环10000次的微秒数,不同单片机差别还是挺大的,MIPS完胜,Arduino Due也不错。
传统51,打算8位加、减法大概3个时钟周期;16位乘除法打算略慢;32位打算有点捉襟见肘了;浮点很奇怪,乘除比加减快,以是,可以用32位整数加减和浮点乘除来提高打算性能。
STC 1T单片机确实不错,性能可跟8位的AVR叫板,考虑它的价格比AVR便宜,还是有利用代价滴。
Arduino Uno作为Arduino的入门直选,打算能力还不错,32位加、减法都挺好,尤其浮点打算,还比51快一些;只是乘除法速率略慢。
Arduino Due采取32位ARM芯片,基本上是处理能力最强的Arduino板!
32位整数打算不像Uno会往下掉,综合性能比Uno高5~10倍,尤其乘、除法,硬件打算便是快啊!
chipKIT把我震荡了,原来MIPS这么快,甩其它芯片几条街啊!
(这是不开优化,开优化也甩几条街) MIPS整数能力超强,浮点打算略差,那也比Due快了近一倍!
如果用Arduino开拓须要高性能打算,chipKIT可以选。我用的是他们过期的产品,新产品系列性能更高,存储更大!
STM32F0是Cortex-M0架构的,不得不说其综合能力不低啊。这么说是由于它的价格,比Due、chipKit的ARM、PIC芯片便宜多得多,但性能并不是没得比。
STM32F1是
Cortex-M3架构,跟M0比多了硬件除法器,主频更高。基本上,STM32F1可以垄断单片机的市场了,我对它唯一的希望便是:“把手册做的大略些,好难懂的说!
”
综上所述,对付单片机选用哪一款都是可以的,STM32F1系列虽然综合最好,但学习门槛高,不易入门;51芯片虽历史悠久,性能可圈可点,但在Arduino的冲击下真没什么代价了。业余爱好者追求的是大略操作、快速搭建,Arduino完美的社区资源是任何其它芯片比不了滴!
以是,建议非专业爱好者还是用Arduino来搭建原型,须要速率上MIPS芯片的chipKit,总有知足你的!
以上剖析的是无优化性能,有点不公正。由于,实际上没人会无优化的编译,那么打开优化是什么样子呢?请看下图 (Arduino支持-O3,但考虑AVR片上Flash空间紧张,还是用-Os来说,附件有完全-O3的结果)
Arduino UNO(-O0)Arduino UNO(-Os)Arduino Due(-O0)Arduino Due(-Os)chipKIT Uno32(-O0)chipKIT Uno32(-Os)STM32F030(48M -O0)STM32F030(48M -O3)STM32F103(72M -O0)STM32F103(72M -O3)Base: 13836Base: 4404Base: 3815Base: 716Base: 1378Base: 751Base: 6000Base: 2200Base: 5600Base: 1400TEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_tTEST: uint8_t +: 0.44us +: 0.18us +: 0.34us +: 0.03us +: 0.07us +: 0.02us +: 0.33us +: 0.12us +: 0.35us +: 0.06us -: 0.56us -: 0.18us -: 0.29us -: 0.15us -: 0.07us -: 0.02us -: 0.29us -: 0.12us -: 0.37us -: 0.05us : 0.62us : 0.25us : 0.36us : 0.06us : 0.10us : 0.03us : 0.33us : 0.10us : 0.35us : 0.06us /: 5.47us /: 5.09us /: 0.31us /: 0.05us /: 0.22us /: 0.15us /: 12.56us /: 11.64us /: 0.35us /: 0.07us %: 5.53us %: 5.15us %: 0.48us %: 0.15us %: 0.21us %: 0.13us %: 12.60us %: 11.64us %: 0.40us %: 0.10usTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_tTEST: uint16_t +: 0.88us +: 0.25us +: 0.34us +: 0.15us +: 0.07us +: 0.02us +: 0.33us +: 0.12us +: 0.35us +: 0.05us -: 1.00us -: 0.25us -: 0.29us -: 0.13us -: 0.07us -: 0.02us -: 0.30us -: 0.10us -: 0.37us -: 0.06us : 1.38us : 0.69us : 0.36us : 0.15us : 0.10us : 0.03us : 0.33us : 0.12us : 0.35us : 0.06us /: 13.26us /: 12.51us /: 0.31us /: 0.04us /: 0.22us /: 0.15us /: 12.56us /: 11.59us /: 0.35us /: 0.07us %: 13.20us %: 12.45us %: 0.39us %: 0.15us %: 0.21us %: 0.13us %: 12.60us %: 11.60us %: 0.47us %: 0.09usTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_tTEST: uint32_t +: 1.76us +: 0.50us +: 0.40us +: 0.11us +: 0.06us +: 0.01us +: 0.29us +: 0.03us +: 0.32us +: 0.03us -: 2.01us -: 0.50us -: 0.40us -: 0.05us -: 0.06us -: 0.01us -: 0.33us -: 0.02us -: 0.32us -: 0.03us : 6.35us : 4.84us : 0.33us : 0.01us : 0.08us : 0.02us : 0.29us : 0.03us : 0.33us : 0.03us /: 37.79us /: 36.28us /: 0.40us /: 0.08us /: 0.21us /: 0.13us /: 11.84us /: 11.54us /: 0.35us /: 0.04us %: 37.79us %: 36.15us %: 0.45us %: 0.04us %: 0.20us %: 0.13us %: 11.84us %: 11.55us %: 0.46us %: 0.06usTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_tTEST: uint64_t +: 5.59us +: 2.89us +: 0.38us +: 0.32us +: 0.18us +: 0.07us +: 0.48us +: 0.04us +: 0.31us +: 0.05us -: 5.59us -: 2.89us -: 0.38us -: 0.19us -: 0.18us -: 0.07us -: 0.42us -: 0.05us -: 0.40us -: 0.03us : 24.71us : 20.43us : 0.46us : 0.19us : 0.22us : 0.08us : 23.47us : 23.14us : 0.36us : 0.11us /: 21.56us /: 17.29us /: 2.39us /: 2.22us /: 1.60us /: 1.31us /: 66.51us /: 66.22us /: 38.00us /: 37.56us %: 21.94us %: 17.66us %: 2.40us %: 2.22us %: 1.50us %: 1.28us %: 66.51us %: 66.26us %: 37.95us %: 37.58usTEST: floatTEST: floatTEST: floatTEST: floatTEST: floatTEST: floatTEST: floatTEST: floatTEST: floatTEST: float +: 9.56us +: 8.43us +: 1.52us +: 1.29us +: 0.97us +: 0.88us +: 2.07us +: 1.77us +: 1.24us +: 0.91us -: 9.62us -: 8.49us -: 1.52us -: 1.29us -: 1.10us -: 1.07us -: 2.22us -: 1.92us -: 1.32us -: 1.01us : 5.84us : 4.71us : 0.98us : 0.82us : 1.05us : 1.00us : 0.97us : 0.65us : 0.70us : 0.40us /: 5.78us /: 4.65us /: 1.25us /: 1.02us /: 0.93us /: 1.02us /: 1.05us /: 0.76us /: 0.78us /: 0.40usTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: doubleTEST: double +: 9.56us +: 8.43us +: 1.82us +: 1.77us +: 1.40us +: 1.25us +: 4.26us +: 4.16us +: 2.51us +: 2.36us -: 9.62us -: 8.49us -: 1.87us -: 1.82us -: 1.51us -: 1.36us -: 4.66us -: 4.57us -: 2.57us -: 2.44us : 5.84us : 4.71us : 0.92us : 0.87us : 1.37us : 1.27us : 1.69us : 1.60us : 1.11us : 0.91us /: 5.78us /: 4.65us /: 1.39us /: 1.33us /: 1.20us /: 1.16us /: 1.33us /: 1.24us /: 0.89us /: 0.74us哇,性能全部飙升啊!
均匀都有3~5倍的提升,这也解释MCU的速率很依赖编译器!
Arduino Due的性能比Uno快了近10倍,且Due的乘除性能不比STM32差,得益于ARM核心和硬件打算单元啊。
MIPS架构总体最快,32位性能灰常精良,仅浮点比STM32F103略慢。
STM32F103不愧是芯片之王,综合性能最好,尤其浮点处理能力!
用于PID、四轴翱翔器的打算很得当。
末了,真正的乐趣不是看谁跑得快,而是设计一段程序,让它能在完备不同的系统跑起来的那种造诣感!
这篇文章也是随手而写,测试内容并不是非常严谨,仅作参考。
扩展阅读:
在成文之前搜了下关于MCU的benchmark,才明白我可真是真井底之蛙!
早有专业的测试算法工具,比如Dhrystone 。我也把他们在Arduino和MDK平台上都编译了一下,结果挺故意思的,详细结果就不贴了,大家可以自己试一下。如果真的想理解MCU的benchmark还得用这种成熟的方法,土方法只能娱乐而已。。。
Dhrystone
Arduino下可运行:https://github.com/ghalfacree/Arduino-Sketches/tree/master/Dhrystone
STM32下可运行:http://www.stm32duino.com/viewtopic.php?t=76
How to Effectively Measure MCU Efficiency
参考资料:
本文用到的代码和报告:http://pan.baidu.com/s/1i4KNxOx
本文属于原创,如要转载请联系"大众号ickeybbs
最新电子行业资讯、教程以及开拓板样片申请,请关注“云汉电子社区”官方微信公众年夜众号ickeybbs