日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32跑分?看看你的能跑多少分!

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32跑分?看看你的能跑多少分! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,我是張巧龍,提起MCU性能測試,最著名的就是CoreMark和Dhrystone。

CoreMark以每秒迭代次數作為性能評價,而Dhrystone的DMIPS與Dhrystone標準相關。

本文討論CoreMark,先來看看MCU廠家如何宣傳自家產品性能。

NXP i.MX RT1170,CoreMark:6468 ;ST STM32H747/757 CoreMark:3224

▍揭開神秘面紗:CoreMark是什么?為什么它可以作為MCU的性能指標?這個數是怎么計算出來的?

CoreMark是衡量嵌入式系統中微控制器性能的基準。通過包含列表處理(查找和排序)、矩陣處理(常見的矩陣操作)、狀態機(確定輸入流是否包含有效數字)和CRC(循環冗余校驗)等算法的測試給出性能評價。


需要下載的軟件包是免費開源的, 可以在官方網站找到:EEMBC’s CoreMark?,網頁截圖如下。

作業不難:怎么將CoreMark移植到自己的MCU上?運行CoreMark需要哪些外設支持?

51單片機也可以跑CoreMark的,所以硬件上不用擔心。運行CoreMark,需要定時器提供計時功能,還需要一種向外部打印消息的手段。

一個比較簡單的方法是,調用stdio.h中定義的printf()函數,將其重定向到串口。現以使用STM32CubeIDE將CoreMark移植到STM32G071為例進行說明。

● Step1:復制必要文件到目標工程。現已準備好目標MCU的軟件工程,其文件結構如下圖右側所示。從CoreMark官網獲得軟件包,軟件包解壓后文件結構如下圖左側所示。

在右側軟件工程中新建文件夾CoreMark,將左側綠色框中,core_list_join.c、core_main.c、core_matrix.c、core_state.c、core_util.c、coremark.h等文件放到CoreMark文件夾里。


打開左側simple文件夾,將core_portme.c復制到Src文件夾中,將core_portme.h復制到Inc文件夾中。

(彩色高亮標記與圖中顏色標記對應,共5個步驟)

●?Step2:由于core_main.c文件已定義了main()函數,該main()函數執行時調用core_portme.c中的portable_init()函數作為MCU初始化接口,因此需要將MCU工程中原main.c文件MCU初始化代碼移動到到portable_init()函數里并刪除原有main.c文件。

以STM32CubeIDE工程為例,需要移動SystemClock_Config和一堆MX_開頭的初始化函數(注意相關結構體、函數原型與函數實現要一起移動)。

●?Step3:CoreMark的分數最終表示為Iterations/Sec,也就是每秒迭代數,而Sec和系統Ticks相關。用過RTOS的朋友應該對這個概念很熟悉,考慮文字不太好解釋,直接看core_portme.c里這個宏定義。

#define EE_TICKS_PER_SEC 1000

●?這里我定義每秒1000個Tick,每個Tick時長1ms,對應定時器每1ms觸發一次中斷。使用一個計數變量,定時器進入中斷一次,該變量值+1;對該變量值/1000即可求得定時器運行時長,也就是上文的Sec。

所以EE_TICKS_PER_SEC并非一定要設置為1000,和定時器中斷頻率對應即可。與定時相關的函數有以下三個。

void start_time(void);//啟動計時器; void stop_time(void);//停止計時器; CORE_TICKS get_time(void);//獲取計時器的計數值。

●?在start_time()里實現定時器啟動功能,在stop_time()里實現定時器停止功能,在get_time()中獲取中斷計數值。數據類型“CORE_TICKS ”實際上就是“unsigned long”。

為方便操作,推薦將計數變量設置為全局變量,這樣可以通過extern關鍵字直接訪問。此處以TIM1為例,代碼如下:

//計數變量unsigned long time_ms_ticks=0; //定時器啟動void start_time(void){ (&htim1)->State = HAL_TIM_STATE_BUSY; __HAL_TIM_ENABLE(&htim1); __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);} //定時器停止void stop_time(void){ __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); __HAL_TIM_DISABLE(&htim1); (&htim1)->State = HAL_TIM_STATE_READY;} //獲取中斷計數值CORE_TICKS get_time(void){ return time_ms_ticks;} //中斷處理函數extern unsigned long time_ms_ticks;void TIM1_BRK_UP_TRG_COM_IRQHandler(void){ HAL_TIM_IRQHandler(&htim1); time_ms_ticks=time_ms_ticks+1;}

●?注釋部分不使用的代碼。以下代碼位于core_portme.c中,需要注釋掉:

//#define NSECS_PER_SEC CLOCKS_PER_SEC //#define CORETIMETYPE clock_t //#define GETMYTIME(_t) (*_t = clock()) //#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) //#define TIMER_RES_DIVIDER 1 //#define SAMPLE_TIME_IMPLEMENTATION 1//static CORETIMETYPE start_time_val, stop_time_val;

● CoreMark要求的最短測試時間為10s,若測試時間低于10s則會報錯,見下圖:

●?為獲得有效的測試結果,需修改core_portme.c中關于ITERATIONS的設置,官方代碼中ITERATIONS沒有定義:

volatile ee_s32 seed4_volatile = ITERATIONS;

●?此處使用STM32G071,主頻64MHz。經測試ITERATIONS修改為1200左右即可。

volatile ee_s32 seed4_volatile = 1200;

●?Step4:打印測試結果時,編譯器優化等級和調試等級也可以打印出來。這類信息可在core_portme.h中通過宏COMPILER_FLAGS修改。這里我使用-Ofast優化,調試等級-g3,修改如下:

#ifndef COMPILER_FLAGS #define COMPILER_FLAGS "-Ofast -g3" #endif

● 重定向printf到串口,可參考以下代碼(以STM32 LPUART1為例),根據IDE不同可能需要添加float類型支持:

__io_putchar (int ch) {HAL_UART_Transmit (&hlpuart1, (uint8_t*) &ch, 1, 0x0F);return ch; }

●?Step5:移植完成!編譯程序下載運行,得到跑分結果:

STM32G071RB,64MHz,108.9分!

通常使用最高主頻和-Ofast優化可以獲取最大分數,歡迎大家把自己的跑分放到評論區。

-END-

我是張巧龍,一名教電子的大學老師,歡迎關注!

總結

以上是生活随笔為你收集整理的STM32跑分?看看你的能跑多少分!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。