2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

單片機(jī)計(jì)算性能大比拼(51, AVR, MIPS, ARM)

 媛糖兒 2016-06-10

寫這篇文章純屬偶然,MCU benchmark有很多方法,且不同類型MCU benchmark方法完全不同,很難說(shuō)誰(shuí)好誰(shuí)快? 不過,對(duì)電子愛好者來(lái)說(shuō),還是挺想知道“我所用的MCU”計(jì)算到底多快?本文,就從打醬油、非專業(yè)、大無(wú)畏精神出發(fā),探討入門級(jí)單片機(jī)計(jì)算性能到底如何、如何。


單片機(jī)能干的事兒很多啊,我通常用來(lái):


1、控制個(gè)燈啊、空調(diào)啊、電視啊、小車啊神馬的。

2、用傳感器采集個(gè)溫度啊、濕度啊、電壓、電流、水流、人臉啊神馬的。

3、顯示輸出:液晶、OLED、數(shù)碼管;聲音;電風(fēng)扇神馬的。

4、超低功耗:家里的中央控制系統(tǒng)基于樹莓派,不到2W功耗。

5、便攜。貌似自己做成的東西極少具有便攜性。。。


在沒有接觸Arduino前都是用51倒騰,玩了有幾年,覺得51是最適合電子愛好者用的芯片,簡(jiǎn)單、便宜、功能足夠!但接觸Arduino后才明白,原來(lái)還有這么個(gè)東東,比51先進(jìn)得多,實(shí)在太好用了! 記得學(xué)51從二進(jìn)制地址學(xué)起,不太好懂。后來(lái)用C開發(fā)經(jīng)常問:“明明 c=a+b; print(c); 就行了,我干嘛要去學(xué)指令、寄存器、尋址?”高級(jí)語(yǔ)言屏蔽底層很多東西,讓編程變得簡(jiǎn)單。并不是基礎(chǔ)知識(shí)沒用,這好比高等數(shù)學(xué)這道門檻(俺數(shù)學(xué)專業(yè)),你必須弄懂基礎(chǔ)知識(shí)體系才能理解數(shù)學(xué)世界的美妙!但如果是經(jīng)濟(jì)學(xué)專業(yè),不懂?dāng)?shù)學(xué)基礎(chǔ)知識(shí)同樣可以玩兒轉(zhuǎn)經(jīng)濟(jì)學(xué)!你從中獲得的樂趣跟你投入成正比。所以,我用單片機(jī)并不是科班那種需要弄懂MCU每個(gè)功能、每個(gè)模塊,我用單片機(jī)就接接外設(shè),完成我的想法而已。也許,只用到了單片機(jī)十分之一。說(shuō)實(shí)話,極少使用單片機(jī)計(jì)算能力(話說(shuō)這也不是單片機(jī)的強(qiáng)項(xiàng)呀),但如你要做個(gè)智能小車、四軸飛行器、PID控制,那就需要一定的計(jì)算能力了。


開始,只是簡(jiǎn)單想看看單片機(jī)運(yùn)算有多快,偶然機(jī)會(huì)跟壇友交換了一塊chipKIT Uno32(MIPS芯片),就想橫向比較一下不同MCU的差別,于是就有了本文。其實(shí),計(jì)算能力通過指令時(shí)鐘周期來(lái)計(jì)算,科學(xué)準(zhǔn)確,但對(duì)于不太精通底層知識(shí)的我,匯編猶如天書,真心看不懂?。∷?,還是用我自己的土辦法測(cè)一下吧。


先說(shuō)測(cè)試方法和原理:


1、只測(cè)試+、-、*、/、%五種操作符,uint8_t、uint16_t、uint32_t、uint64_t、float、double六種數(shù)據(jù)類型的性能。

2、首先測(cè)10000次空循環(huán)的時(shí)間,然后在循環(huán)中加入操作數(shù),記錄總的時(shí)間,減去空循環(huán)時(shí)間就是計(jì)算消耗的時(shí)間。

3、測(cè)試中由于有系統(tǒng)中斷(Arduino、STM32都有Tick中斷,51為計(jì)時(shí)也有中斷),結(jié)果不會(huì)很準(zhǔn),話說(shuō)也沒指望它能有多準(zhǔn)。。。

4、編譯器優(yōu)化參數(shù) -O0,一開始測(cè)出來(lái)的運(yùn)行時(shí)間都為“零”,徹底凌亂。研究之后方得知,編譯器優(yōu)化干掉空循環(huán),需通過參數(shù)關(guān)閉優(yōu)化。

5、不同芯片數(shù)據(jù)類型支持不一樣,有些數(shù)據(jù)類型會(huì)缺失。例如Arduino Uno中的float和double是一樣的,都是float;但32位架構(gòu)MCU中的double是float寬度的兩倍。


代碼類似這樣:


說(shuō)個(gè)小故事。如不關(guān)閉測(cè)試優(yōu)化選型,把全局變量定義成局部變量,加法、減法的測(cè)試時(shí)間為“零”,沒錯(cuò),10000次計(jì)算不到4微秒,這顯然不可能。后來(lái)研究一番方得知編譯器默認(rèn)優(yōu)化參數(shù)是-Os,很多計(jì)算直接優(yōu)化了。。。。


測(cè)試用的板子:


1、傳統(tǒng)的AT89C516,還有宏晶鼓吹的1T 51單片機(jī)(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)的


測(cè)試用開發(fā)環(huán)境:


1、51談不上什么優(yōu)化參數(shù),我用的uVision 2。晶振用22.1184M,據(jù)說(shuō)這個(gè)片子可以跑到40M,我就呵呵一下好了。

2、Arduino IDE 1.6.9,圖中2/3都是用Arduino環(huán)境,其中編譯器參數(shù)需要修改platform.txt文件,默認(rèn)是-Os(優(yōu)化大?。?,改成-O0(完全不優(yōu)化),這個(gè)要重啟Arduino才能有效。。。

3、STM用的是MDK 5.16,HAL庫(kù)。沒辦法,對(duì)STM32真不熟,能搗鼓出結(jié)果很不錯(cuò)了!mbed計(jì)時(shí)函數(shù)有問題,F(xiàn)0、F1芯片無(wú)法得出微秒級(jí)時(shí)間,只好用HAL,話說(shuō)用CubeMX生成代碼還真挺方便的。



計(jì)時(shí)方法:


1、51用TIMER0計(jì)時(shí),這個(gè)太簡(jiǎn)單了,每計(jì)數(shù) 12/22.1184 微秒?。?/p>

2、Arduino用系統(tǒng)micros(),根據(jù)兩次記錄的時(shí)間差,精度4微秒。

3、STM用HAL庫(kù)函數(shù)提供的HAL_GetTick(),通過HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/10000); 把計(jì)數(shù)器設(shè)為100微秒,再快會(huì)對(duì)計(jì)算有影響。


硬件說(shuō)明:


1、部分芯片帶硬件乘、除法器,啊,那個(gè)性能好的沒話說(shuō)。

2、32位MCU處理8/16/32位效果都是32位,但要求不高的地方,8位也夠。

3、結(jié)果通過串口返回,Arduino串口超簡(jiǎn)單、STM32用HAL庫(kù)串口通信也還行,這51串口啊,我就不說(shuō)了。


測(cè)試結(jié)果:


分析:


1、Base是空循環(huán)10000次的微秒數(shù),不同單片機(jī)差別還是挺大的,MIPS完勝,Arduino Due也不錯(cuò)。

2、傳統(tǒng)51,計(jì)算8位加、減法大概3個(gè)時(shí)鐘周期;16位乘除法計(jì)算略慢;32位計(jì)算有點(diǎn)捉襟見肘了;浮點(diǎn)很奇怪,乘除比加減快,所以,可以用32位整數(shù)加減和浮點(diǎn)乘除來(lái)提高計(jì)算性能。

3、STC 1T單片機(jī)確實(shí)不錯(cuò),性能可跟8位的AVR叫板,考慮它的價(jià)格比AVR便宜,還是有使用價(jià)值滴。

4、Arduino Uno作為Arduino的入門直選,計(jì)算能力還不錯(cuò),32位加、減法都挺好,尤其浮點(diǎn)計(jì)算,還比51快一些;只是乘除法速度略慢。

5、Arduino Due采用32位ARM芯片,基本上是處理能力最強(qiáng)的Arduino板!32位整數(shù)計(jì)算不像Uno會(huì)往下掉,綜合性能比Uno高5~10倍,尤其乘、除法,硬件計(jì)算就是快?。?/p>

6、chipKIT把我震驚了,原來(lái)MIPS這么快,甩其它芯片幾條街?。。ㄟ@是不開優(yōu)化,開優(yōu)化也甩幾條街) MIPS整數(shù)能力超強(qiáng),浮點(diǎn)計(jì)算略差,那也比Due快了近一倍!如果用Arduino開發(fā)需要高性能計(jì)算,chipKIT可以選。我用的是他們過時(shí)的產(chǎn)品,新產(chǎn)品系列性能更高,存儲(chǔ)更大!

7、STM32F0是Cortex-M0架構(gòu)的,不得不說(shuō)其綜合能力不低啊。這么說(shuō)是因?yàn)樗膬r(jià)格,比Due、chipKit的ARM、PIC芯片便宜多得多,但性能并不是沒得比。

8、STM32F1是

Cortex-M3架構(gòu),跟M0比多了硬件除法器,主頻更高。基本上,STM32F1可以壟斷單片機(jī)的市場(chǎng)了,我對(duì)它唯一的希望就是:“把手冊(cè)做的簡(jiǎn)單些,好難懂的說(shuō)!”


綜上所述,對(duì)于單片機(jī)選用哪一款都是可以的,STM32F1系列雖然綜合最好,但學(xué)習(xí)門檻高,不易入門;51芯片雖歷史悠久,性能可圈可點(diǎn),但在Arduino的沖擊下真沒什么價(jià)值了。業(yè)余愛好者追求的是簡(jiǎn)單操作、快速搭建,Arduino完美的社區(qū)資源是任何其它芯片比不了滴!所以,建議非專業(yè)愛好者還是用Arduino來(lái)搭建原型,需要速度上MIPS芯片的chipKit,總有滿足你的!


以上分析的是無(wú)優(yōu)化性能,有點(diǎn)不公平。因?yàn)?,?shí)際上沒人會(huì)無(wú)優(yōu)化的編譯,那么打開優(yōu)化是什么樣子呢?請(qǐng)看下圖 (Arduino支持-O3,但考慮AVR片上Flash空間緊張,還是用-Os來(lái)說(shuō),附件有完整-O3的結(jié)果)


 

哇,性能全部飆升啊!平均都有3~5倍的提升,這也說(shuō)明MCU的速度很依賴編譯器!


Arduino Due的性能比Uno快了近10倍,且Due的乘除性能不比STM32差,得益于ARM核心和硬件計(jì)算單元啊。

MIPS架構(gòu)總體最快,32位性能灰常優(yōu)異,僅浮點(diǎn)比STM32F103略慢。

STM32F103不愧是芯片之王,綜合性能最好,尤其浮點(diǎn)處理能力!用于PID、四軸飛行器的計(jì)算很合適。


最后,真正的樂趣不是看誰(shuí)跑得快,而是設(shè)計(jì)一段程序,讓它能在完全不同的系統(tǒng)跑起來(lái)的那種成就感!這篇文章也是隨手而寫,測(cè)試內(nèi)容并不是非常嚴(yán)謹(jǐn),僅作參考。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多