寫這篇文章純屬偶然,MCU benchmark有很多方法,且不同類型MCU benchmark方法完全不同,很難說誰好誰快? 不過,對電子愛好者來說,還是挺想知道“我所用的MCU”計算到底多快?本文,就從打醬油、非專業(yè)、大無畏精神出發(fā),探討入門級單片機計算性能到底如何、如何。 單片機能干的事兒很多啊,我通常用來: 1、控制個燈啊、空調(diào)啊、電視啊、小車啊神馬的。 2、用傳感器采集個溫度啊、濕度啊、電壓、電流、水流、人臉啊神馬的。 3、顯示輸出:液晶、OLED、數(shù)碼管;聲音;電風扇神馬的。 4、超低功耗:家里的中央控制系統(tǒng)基于樹莓派,不到2W功耗。 5、便攜。貌似自己做成的東西極少具有便攜性。。。 在沒有接觸Arduino前都是用51倒騰,玩了有幾年,覺得51是最適合電子愛好者用的芯片,簡單、便宜、功能足夠!但接觸Arduino后才明白,原來還有這么個東東,比51先進得多,實在太好用了! 記得學51從二進制地址學起,不太好懂。后來用C開發(fā)經(jīng)常問:“明明 c=a+b; print(c); 就行了,我干嘛要去學指令、寄存器、尋址?”高級語言屏蔽底層很多東西,讓編程變得簡單。并不是基礎(chǔ)知識沒用,這好比高等數(shù)學這道門檻(俺數(shù)學專業(yè)),你必須弄懂基礎(chǔ)知識體系才能理解數(shù)學世界的美妙!但如果是經(jīng)濟學專業(yè),不懂數(shù)學基礎(chǔ)知識同樣可以玩兒轉(zhuǎn)經(jīng)濟學!你從中獲得的樂趣跟你投入成正比。所以,我用單片機并不是科班那種需要弄懂MCU每個功能、每個模塊,我用單片機就接接外設(shè),完成我的想法而已。也許,只用到了單片機十分之一。說實話,極少使用單片機計算能力(話說這也不是單片機的強項呀),但如你要做個智能小車、四軸飛行器、PID控制,那就需要一定的計算能力了。 開始,只是簡單想看看單片機運算有多快,偶然機會跟壇友交換了一塊chipKIT Uno32(MIPS芯片),就想橫向比較一下不同MCU的差別,于是就有了本文。其實,計算能力通過指令時鐘周期來計算,科學準確,但對于不太精通底層知識的我,匯編猶如天書,真心看不懂?。∷?,還是用我自己的土辦法測一下吧。 先說測試方法和原理: 1、只測試+、-、*、/、%五種操作符,uint8_t、uint16_t、uint32_t、uint64_t、float、double六種數(shù)據(jù)類型的性能。 2、首先測10000次空循環(huán)的時間,然后在循環(huán)中加入操作數(shù),記錄總的時間,減去空循環(huán)時間就是計算消耗的時間。 3、測試中由于有系統(tǒng)中斷(Arduino、STM32都有Tick中斷,51為計時也有中斷),結(jié)果不會很準,話說也沒指望它能有多準。。。 4、編譯器優(yōu)化參數(shù) -O0,一開始測出來的運行時間都為“零”,徹底凌亂。研究之后方得知,編譯器優(yōu)化干掉空循環(huán),需通過參數(shù)關(guān)閉優(yōu)化。 5、不同芯片數(shù)據(jù)類型支持不一樣,有些數(shù)據(jù)類型會缺失。例如Arduino Uno中的float和double是一樣的,都是float;但32位架構(gòu)MCU中的double是float寬度的兩倍。 代碼類似這樣: 說個小故事。如不關(guān)閉測試優(yōu)化選型,把全局變量定義成局部變量,加法、減法的測試時間為“零”,沒錯,10000次計算不到4微秒,這顯然不可能。后來研究一番方得知編譯器默認優(yōu)化參數(shù)是-Os,很多計算直接優(yōu)化了。。。。 測試用的板子: 1、傳統(tǒng)的AT89C516,還有宏晶鼓吹的1T 51單片機(STC12C5A60S2) 2、Arduino UNO(ATmega 328),Arduino Due(Atmel SAM3X8E,ARM架構(gòu)的) 3、chipKit Uno32(PIC32MX320F128 MIPS架構(gòu)) 4、ST Nucleo F0(STM32F030R8),Nucleo F1(STM32F103RB),都是ARM架構(gòu)的 測試用開發(fā)環(huán)境: 1、51談不上什么優(yōu)化參數(shù),我用的uVision 2。晶振用22.1184M,據(jù)說這個片子可以跑到40M,我就呵呵一下好了。 2、Arduino IDE 1.6.9,圖中2/3都是用Arduino環(huán)境,其中編譯器參數(shù)需要修改platform.txt文件,默認是-Os(優(yōu)化大小),改成-O0(完全不優(yōu)化),這個要重啟Arduino才能有效。。。 3、STM用的是MDK 5.16,HAL庫。沒辦法,對STM32真不熟,能搗鼓出結(jié)果很不錯了!mbed計時函數(shù)有問題,F(xiàn)0、F1芯片無法得出微秒級時間,只好用HAL,話說用CubeMX生成代碼還真挺方便的。 計時方法: 1、51用TIMER0計時,這個太簡單了,每計數(shù) 12/22.1184 微秒??! 2、Arduino用系統(tǒng)micros(),根據(jù)兩次記錄的時間差,精度4微秒。 3、STM用HAL庫函數(shù)提供的HAL_GetTick(),通過HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/10000); 把計數(shù)器設(shè)為100微秒,再快會對計算有影響。 硬件說明: 1、部分芯片帶硬件乘、除法器,啊,那個性能好的沒話說。 2、32位MCU處理8/16/32位效果都是32位,但要求不高的地方,8位也夠。 3、結(jié)果通過串口返回,Arduino串口超簡單、STM32用HAL庫串口通信也還行,這51串口啊,我就不說了。 測試結(jié)果: 分析: 1、Base是空循環(huán)10000次的微秒數(shù),不同單片機差別還是挺大的,MIPS完勝,Arduino Due也不錯。 2、傳統(tǒng)51,計算8位加、減法大概3個時鐘周期;16位乘除法計算略慢;32位計算有點捉襟見肘了;浮點很奇怪,乘除比加減快,所以,可以用32位整數(shù)加減和浮點乘除來提高計算性能。 3、STC 1T單片機確實不錯,性能可跟8位的AVR叫板,考慮它的價格比AVR便宜,還是有使用價值滴。 4、Arduino Uno作為Arduino的入門直選,計算能力還不錯,32位加、減法都挺好,尤其浮點計算,還比51快一些;只是乘除法速度略慢。 5、Arduino Due采用32位ARM芯片,基本上是處理能力最強的Arduino板!32位整數(shù)計算不像Uno會往下掉,綜合性能比Uno高5~10倍,尤其乘、除法,硬件計算就是快??! 6、chipKIT把我震驚了,原來MIPS這么快,甩其它芯片幾條街?。。ㄟ@是不開優(yōu)化,開優(yōu)化也甩幾條街) MIPS整數(shù)能力超強,浮點計算略差,那也比Due快了近一倍!如果用Arduino開發(fā)需要高性能計算,chipKIT可以選。我用的是他們過時的產(chǎn)品,新產(chǎn)品系列性能更高,存儲更大! 7、STM32F0是Cortex-M0架構(gòu)的,不得不說其綜合能力不低啊。這么說是因為它的價格,比Due、chipKit的ARM、PIC芯片便宜多得多,但性能并不是沒得比。 8、STM32F1是 Cortex-M3架構(gòu),跟M0比多了硬件除法器,主頻更高?;旧希琒TM32F1可以壟斷單片機的市場了,我對它唯一的希望就是:“把手冊做的簡單些,好難懂的說!” 綜上所述,對于單片機選用哪一款都是可以的,STM32F1系列雖然綜合最好,但學習門檻高,不易入門;51芯片雖歷史悠久,性能可圈可點,但在Arduino的沖擊下真沒什么價值了。業(yè)余愛好者追求的是簡單操作、快速搭建,Arduino完美的社區(qū)資源是任何其它芯片比不了滴!所以,建議非專業(yè)愛好者還是用Arduino來搭建原型,需要速度上MIPS芯片的chipKit,總有滿足你的! 以上分析的是無優(yōu)化性能,有點不公平。因為,實際上沒人會無優(yōu)化的編譯,那么打開優(yōu)化是什么樣子呢?請看下圖 (Arduino支持-O3,但考慮AVR片上Flash空間緊張,還是用-Os來說,附件有完整-O3的結(jié)果)
哇,性能全部飆升??!平均都有3~5倍的提升,這也說明MCU的速度很依賴編譯器! Arduino Due的性能比Uno快了近10倍,且Due的乘除性能不比STM32差,得益于ARM核心和硬件計算單元啊。 MIPS架構(gòu)總體最快,32位性能灰常優(yōu)異,僅浮點比STM32F103略慢。 STM32F103不愧是芯片之王,綜合性能最好,尤其浮點處理能力!用于PID、四軸飛行器的計算很合適。 最后,真正的樂趣不是看誰跑得快,而是設(shè)計一段程序,讓它能在完全不同的系統(tǒng)跑起來的那種成就感!這篇文章也是隨手而寫,測試內(nèi)容并不是非常嚴謹,僅作參考。 |
|