大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT1xxx系列MCU的性能-CoreMark
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1xxx系列MCU的性能。
在前面的文章 i.MXRT1xxx微控制器概覽 裡,痞子衡給大家簡介過恩智浦半導體在2017年推出的新一代跨界微控制器i.MX RT1xxx系列,該系列第一款晶片i.MXRT105x性能完爆同時期市面上所有的微控制器,官方公布的CoreMark跑分高達3020,有人可能不明白這個數字意味着什麼,作為對比,我們再來看看意法半導體最流行的晶片STM32F103RB,它的CoreMark是108(此處應該有類似My God的尖叫),真是沒有對比就沒有傷害,那麼i.MXRT105x性能到底有沒有這麼強?今天痞子衡為大家實測一下。
關于CoreMark标準的基本知識,痞子衡之前專門寫過一篇文章 微控制器CPU性能測試基準(EEMBC-CoreMark) ,本篇就是基于了解CoreMark基本知識之後的一次實踐。來,讓我們開始吧。
要開始實測i.MXRT105x的CoreMark,首先你得有一塊開發闆,恩智浦官網上有i.MXRT105x配套的評估闆,如下圖所示,痞子衡今天用的就是這塊闆子,闆載主晶片型号為iMXRT1052DVL6。

ARM Cortex-M微控制器的內建開發環境有很多,其中IAR EWARM憑借優良的特性備受廣大工程師青睐,且痞子衡在CoreMark标準基本知識介紹文章的最後貼出了一張iMXRT1050與STM32H743性能對比圖,其中CoreMark跑分就是在IAR下得到的,是以今天痞子衡也選用IAR作為軟體環境,具體版本為IAR EWARM v8.20.2。
在開始移植CoreMark程式到i.MXRT1052上之前,我們需要先有一個i.MXRT1052的基本hello world的例程,當然我們可以對着資料手冊自己從頭寫一個,但是這裡痞子衡推薦使用官方軟體開發包。
注冊并登入恩智浦官網,來到 MCUXpresso SDK Builder 頁面,在"Select Development Board"裡選擇EVKB-IMXRT1050後點選Build MCUXpresso SDK後跳轉到下一個頁面,在"Developer Environment Settings"裡選擇IAR并點選Download SDK後便可得到SDK_2.3.1_EVKB-IMXRT1050.zip,下面是痞子衡下載下傳的開發包具體版本資訊:
給i.MXRT1050 EVK闆子供電(J2口接5V輸出的電源),并且使用USB線連接配接電腦與闆子的J28 USB口,此時在裝置管理器應該可以看到USB虛拟的序列槽(EVK闆載OpenSDA調試器内含USB轉序列槽功能,如果看不到序列槽,請自行安裝PE Micro驅動)。
打開前一步下載下傳的開發包裡的\SDK_2.3.1_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\hello_world\iar\hello_world.eww工程,确認工程option裡linker檔案選擇的是MIMXRT1052xxxxx_ram.icf,然後J21 JTAG口連接配接上Jlink Plus直接将工程下載下傳進主晶片的RAM運作。
如果工程運作正常,你在序列槽調試助手(115200,8N1)裡應該能看到"hello world."列印輸出。
以hello_world工程為基礎,将從EEMBC官網下載下傳到的coremark_v1.0.tgz包解壓,将\coremark_v1.0\以及\coremark_v1.0\barebones\路徑下的如下所有源檔案(.c或.h)全部拷貝到hello world工程目錄下
将上面的所有coremark源檔案全部添加進hello_world工程,并從工程中移除原主函數入口檔案hello_world.c,此時基本coremark工程就完成了。但注意此時工程無法編譯,因為從\coremark_v1.0\barebones\下拷貝的源檔案還需要進一步修改。
程式移植的第一步是實作闆載初始化,編譯上一步建好的coremark工程會報這樣的錯誤error "Call board initialization routines in portable init (if needed), in particular initialize UART!\n"。其實這是coremark作者故意在core_portme.c裡的portable_init()函數裡留下的提示,我們需要用i.MXRT1052的闆級初始化函數替代這個#error,打開之前移除的hello_world.c檔案,将其中闆級初始化函數調用拷貝到portable_init函數中:
原hello_world裡的BOARD_InitHardware已經包含了系統時鐘以及UART初始化,是以這裡的移植工作就算結束了。
程式移植的第二步是實作計時功能,由于CoreMark得分其實是機關時間内跑了多少次CoreMark程式,是以CoreMark工程必須要有計時功能。編譯coremark工程會報這樣的錯誤error "You must implement a method to measure time in barebones_clock()! This function should return current time.\n",這也是coremark作者故意在core_portme.barebones_clock()函數裡留下的提示。
關于計時器,第一個想到的自然是Cortex-M核心裡的SysTick,不過考慮到coremark程式是要跑在600MHz的主頻下,而SysTick計時器隻有24bit,也就是說即使SysTick->LOAD設最大的reload值0xFFFFFF,也将每隔0.02796s(0x1000000/600MHz)産生一次SysTick中斷,而CoreMark程式至少要跑10s以上,在coremark運作的10s内會産生357次(10/0.02796)SysTick中斷,這無疑會降低coremark得分,是以SysTick直接被pass。(備注:SysTick->CTRL[2]用于選擇SysTick的時鐘源,預設1'b0為Core Clock,1'b1為外部clock,暫未研究這裡的外部clock在i.MXRT105x上是否能用)。
翻看i.MXRT1052的參考手冊,其支援的計時器種類很多,有GPT、PIT、TMR、WDOG,就選擇比較常用的32bit計時器PIT吧。
之前下載下傳的軟體包裡也有PIT的例程\SDK_2.3.1_EVKB-IMXRT1050\boards\evkbimxrt1050\driver_examples\pit,打開pit.c檔案将其中PIT初始化相關代碼放入新定義的timer_pit_init()函數中并在portable_init()中調用timer_pit_init()一次以完成PIT初始化。
barebones_clock()函數中的#error也需要被PIT_GetCurrentTimerCount()函數替換,此外還需要添加定義#define CLOCKS_PER_SEC (24000000),因為我們會在clock_config.c檔案裡的BOARD_BootClockRUN()函數最後添加如下語句以選擇OSC作為PIT計時時鐘,而EVK闆載外部XTALOSC晶振是24MHz。
有朋友可能會好奇,我們似乎沒有使能和實作PIT中斷,其實在目前coremark工程下沒有必要,因為PIT中斷每隔178s(0x100000000/24MHz)才會觸發一次,而我們隻需要執行幾十秒就夠了,是以即使使能和實作PIT中斷也用不到,當然如果能實作PIT中斷更好,萬一我們讓coremark程式執行超過178s,不實作PIT中斷就會導緻計時出錯。
程式移植的第三步是實作序列槽列印功能,由于hello_world工程已經包含序列槽列印功能,是以這裡的修改比較簡單。
2.2裡隻是将基本CoreMark功能移植完成,但此時coremark工程還是無法編譯,因為還有一些CoreMark配置沒有确定,都在coremark_portme.h裡,需要重定義下面三個宏,并且IAR的優化選項也要設定如下圖所示:
到這裡CoreMark的移植工作就完全結束了,此時coremark工程也應該能正常編譯了。為得到最高的CoreMark得分,最後需要再确定兩件事:一、Core Clock是否确定配置為600MHz;二、工程代碼段/資料段是否放在了ITCM/DTCM RAM。
打開clock_config.c檔案,檢視BOARD_BootClockRUN()函數,ARM Core/AHB時鐘确實都為600MHz。
再打開MIMXRT1052xxxxx_ram.icf檔案,檢視text段确實放在了ITCM裡(0x0 - 0x7FFFF),data段确實放在了DTCM裡(0x20000000 - 0x2007FFFF)。
還等什麼?将coremark工程趕緊下載下傳進晶片并打開序列槽調試助手看CoreMark得分啊。痞子衡實測的CoreMark得分為2952,這與官方标稱的3020有一點差距。
對于coremark得分沒上3000,痞子衡感到不服啊,那怎麼提高coremark得分?痞子衡試盡方法(改編譯器選項、調coremark配置)均無功而返,後來無意中看到EEMBC上跑出3036得分的IDE(編譯器)是IAR 7.80,于是死馬當活馬醫吧,痞子衡也在IAR 7.80.4上運作了一次,得到了3017分,原來這微小差異取決于編譯器版本,真相大白。
想偷懶的朋友直接移步痞子衡的github https://github.com/JayHeng/Cortex-M-Apps 去下載下傳移植好的工程,工程在\Cortex-M-Apps\apps\coremark_imxrt1052\bsp\下面,build8202和build7804分别對應不同的IAR版本。
至此,恩智浦i.MX RT1xxx系列MCU的CoreMark性能與實測痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。