均轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū)
CoreMark是專門(mén)用于測(cè)試處理器內(nèi)核性能的基準(zhǔn)測(cè)試程序,測(cè)試的內(nèi)容有:列表處理(查找和排序)、矩陣操作(常見(jiàn)的矩陣操作)、狀態(tài)機(jī)(確定輸入流是否包含有效數(shù)字)和CRC(循環(huán)冗余檢查),通過(guò)CoreMark跑分可以了解到MCU的算力。下面以APM32E103芯片和Keil為例,介紹一下如何在APM32上面運(yùn)行CoraMark測(cè)試。CoreMark需要定時(shí)器用于計(jì)時(shí),還需要用串口來(lái)打印輸出測(cè)試結(jié)果。
1、獲取相關(guān)代碼
在極海官網(wǎng)可以下載SDK:
https://www.geehy.com/uploads/tool/APM32E10x_SDK_V1.2.zip
打開(kāi) “APM32E10x_SDK_V1.1ExamplesUSARTUSART_PrintfProjectMDKUSART_Printf.uvprojx”,這個(gè)工程已經(jīng)有串口和滴答定時(shí)器的初始化,便于修改。
在CoreMark的GitHub下載庫(kù):
https://github.com/eembc/coremark.git
*網(wǎng)速太慢的話可以在國(guó)內(nèi)Gitee下載:
https://gitee.com/ssri-mirrors/coremark.git
2、實(shí)現(xiàn)串口打印printf
先初始化串口,直接用SDK本來(lái)的代碼就行。
然后重定義fputc(),以便能通過(guò)printf()輸出信息到串口調(diào)試助手。
struct __FILE
{
int handle;
};
FILE __stdout;
int fputc(int ch, FILE *f)
{
while(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
USART_TxData(USART1, ch);
return ch;
}
3、實(shí)現(xiàn)計(jì)時(shí)函數(shù)GETMYTIME
使用滴答定時(shí)器或者普通定時(shí)器都可以,這里以滴答定時(shí)器為例,每隔10ms中斷一次。
SysTick_Config(SystemCoreClock / 100);
在中斷服務(wù)中需要一個(gè)全局變量進(jìn)行10毫秒級(jí)計(jì)時(shí)。
void SysTick_Handler(void)
{
tick++;
}
4、添加CoreMark源代碼
將下載的CoreMark庫(kù)解壓到工程目錄下,在Keil工程中添加這幾個(gè)文件,其中 core_portme.c 在文件夾simple里面。
還要在工程設(shè)置中添加相關(guān)頭文件的路徑
把 core_main.c 中的 main(int argc, char *argv[]) 改為 coremark_main(int argc, char *argv[]) 以免編譯報(bào)錯(cuò)。
MAIN_RETURN_TYPE
coremark_main(int argc, char *argv[])
在真正的int main()函數(shù)中調(diào)用 coremark_main 函數(shù)。
coremark_main(0,NULL); //正常開(kāi)始運(yùn)行測(cè)試算法
5、配置CoreMark
完成以上步驟后編譯會(huì)報(bào)兩個(gè)錯(cuò):
....coremark-maincore_main.c(383): error: #20: identifier "FLAGS_STR" is undefined
....coremark-mainsimplecore_portme.c(38): error: #20: identifier "ITERATIONS" is undefined
第1個(gè)錯(cuò)誤是說(shuō)沒(méi)定義 FLAGS_STR 這個(gè)字符串,這個(gè)是用來(lái)編譯優(yōu)化等級(jí)的,在 core_portme.h 添加這個(gè)字符串。
#define COMPILER_FLAGS "Level 0"
第2個(gè)錯(cuò)誤是說(shuō)沒(méi)定義 ITERATIONS 這個(gè)值,這個(gè)值決定了CoreMark算法執(zhí)行的次數(shù),對(duì)于性能越高的MCU這個(gè)值應(yīng)該越大,在core_portme.c中添加這個(gè)宏定義, 這里先設(shè)個(gè)1000,后面根據(jù)需要再調(diào)整。
#define ITERATIONS 1000
接下來(lái)要配置關(guān)于時(shí)間的代碼,還是core_portme.c這個(gè)文件,將之前中斷服務(wù)函數(shù)計(jì)數(shù)的變量賦給 *_t ,同時(shí)也要包含tick變量的聲明。
#define NSECS_PER_SEC CLOCKS_PER_SEC
#define CORETIMETYPE clock_t
#define GETMYTIME(_t) (*_t = tick )
注意 CLOCKS_PER_SEC 這個(gè)宏,它表示每秒的時(shí)鐘數(shù),也就是一秒內(nèi)tick計(jì)數(shù)的增加量,如果tick每隔10ms加一,那么CLOCKS_PER_SEC應(yīng)該等于100;如果tick每隔1ms加一,那么CLOCKS_PER_SEC應(yīng)該等于1000;
6、增加棧的大小
CoreMark運(yùn)行時(shí)需要較大的棧空間,默認(rèn)棧大小不夠,需要改大。
打開(kāi)CMSIS欄中的啟動(dòng)文件 startup_apm32e10x_hd.s ,把棧Stack_Size 增加到 2KB 。
Stack_Size EQU 0x00000800
7、下載程序并執(zhí)行
編譯并下載程序,等待10多秒后串口輸出測(cè)試結(jié)果。
有時(shí)優(yōu)化等級(jí)提高了,或者換了更強(qiáng)的MCU測(cè)試,會(huì)出現(xiàn)算法執(zhí)行時(shí)間小于10秒的提示:
這時(shí)只需要把 ITERATIONS 改大就行了。
#define ITERATIONS 2000
把優(yōu)化等級(jí)提到最高,測(cè)得CoreMark 1.0跑分為139.958。
以上就是用CoreMark庫(kù)對(duì)APM32E103進(jìn)行性能測(cè)試的方法及步驟,對(duì)其他芯片的測(cè)試方法也是大同小異。
注:文章作者在原帖中提供了例程文件,有需要請(qǐng)至原文21ic論壇下載
原文地址:https://bbs.21ic.com/icview-3331250-1-1.html
-
處理器
+關(guān)注
關(guān)注
68文章
19833瀏覽量
233935 -
mcu
+關(guān)注
關(guān)注
146文章
17893瀏覽量
361862 -
測(cè)試
+關(guān)注
關(guān)注
8文章
5653瀏覽量
128472 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3297瀏覽量
117458 -
極海半導(dǎo)體
+關(guān)注
關(guān)注
0文章
153瀏覽量
4825
原文標(biāo)題:APM32芯得 EP.56 | 基于APM32E103的CoreMark測(cè)試方法
文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
新品發(fā)布丨極海半導(dǎo)體推出工業(yè)級(jí)標(biāo)準(zhǔn)型APM32S103系列MCU
極海推出APM32A全系列車(chē)規(guī)級(jí)MCU

極海推出APM32A系列車(chē)規(guī)級(jí)MCU芯片
極海APM32F103RCT7通過(guò)AEC-Q100車(chē)規(guī)認(rèn)證

Flasher在線燒錄器全面支持極海APM32系列MCU
極海半導(dǎo)體APM32E103/F072系列MCU順利通過(guò)IEC 60730功能安全認(rèn)證
喜報(bào)頻傳!極海APM32工業(yè)級(jí)/車(chē)規(guī)級(jí)MCU產(chǎn)品接連榮獲三項(xiàng)大獎(jiǎng)
極海推出首款電機(jī)控制專用芯片APM32F035系列MCU

評(píng)論