1 CoreMark簡(jiǎn)介
CoreMark是由EEMBC(Embedded Microprocessor Benchmark Consortium)的Shay Gla-On于2009年提出的一項(xiàng)基準(zhǔn)測(cè)試程序,CoreMark的主要目標(biāo)是簡(jiǎn)化操作,并提供一套測(cè)試單核處理器核心的方法。測(cè)試標(biāo)準(zhǔn)是在配置參數(shù)的組合下單位時(shí)間內(nèi)運(yùn)行的CoreMark程序次數(shù)(單位:CoreMark/MHz),該數(shù)字值越大則說明測(cè)試的性能越好。
目前在嵌入式CPU行業(yè)中普遍公認(rèn)的性能測(cè)試指標(biāo)的標(biāo)準(zhǔn)主要使用以下三種,MIPS、Dhrystone、Coremark,而CoreMark與Dhrystone一樣,擁有體積小、方便移植、易于理解、免費(fèi)并且顯示單個(gè)數(shù)字基準(zhǔn)分?jǐn)?shù)。與Dhrystone不同的是,Dhrystone的主要部分實(shí)際上暴露了編譯器優(yōu)化工作負(fù)載的能力,而不是實(shí)際MCU或CPU的能力,的性能,而CoreMark具有特定的運(yùn)行和報(bào)告規(guī)則,從而可以避免由于所使用的編譯庫(kù)不同而導(dǎo)致的測(cè)試結(jié)果難以比較。
官網(wǎng)地址:
https://www.eembc.org/coremark/index.php
https://github.com/eembc/coremark
2 CoreMark移植
筆者這里使用STM32來演示。
2.1 CoreMark源碼下載
首先去CoreMark 官網(wǎng)下載CoreMark源碼。
CoreMark 移植所需的如下:
- core_list_join.c
- core_main.c
- core_matrix.c
- core_state.c
- core_util.c
- coremark.h
- simple/core_portme.c
- simple/core_portme.h
2.2 移植CoreMark
1)拷貝CoreMark文件到工程
準(zhǔn)備一個(gè)STM32工程,將CoreMark所需的文件添加放到工程目錄中。
2)添加文件到工程
接下來要做的就是添加 CoreMark 代碼。因?yàn)?core_main.c 文件里已經(jīng)包含了一個(gè) main 函數(shù),所以需要在工程中將默認(rèn)創(chuàng)建的 main.c 文件刪除。
完成后的工程文件結(jié)構(gòu)如下:
2.3 配置 Coremark 文件
我們需要在 core_portme.c 中添加初始化的代碼,并根據(jù)不同的計(jì)時(shí)方法修改 core_portme.c 中計(jì)時(shí)相關(guān)函數(shù)和代碼。
2.3.1 添加初始化代碼
core_portme.c 中的 portable_init 函數(shù)在 core_main.c 的 main 函數(shù)中首先被調(diào)用, 平臺(tái)的初始化的函數(shù)(時(shí)鐘,GPIO,串口,緩存) 可以放在這里。
修改前:
void portable_init(core_portable *p, int *argc, char *argv[])
{
(void)argc; // prevent unused warning
(void)argv; // prevent unused warning
if (sizeof(ee_ptr_int) != sizeof(ee_u8 *))
{
ee_printf(
"ERROR! Please define ee_ptr_int to a type that holds a "
"pointer!\\n");
}
if (sizeof(ee_u32) != 4)
{
ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\\n");
}
p->portable_id = 1;
}
修改后:
void portable_init(core_portable *p, int *argc, char *argv[])
{
ST_BSP_USART_Dev BSP_USART_Dev0 = USART_DEV0_CONFIG;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* USART1 配置模式為 115200 8-N-1,中斷接收 */
BSP_USART_Init(&BSP_USART_Dev0, 115200, 0, 1);
printf("The CoreMark is runing,Please Wait...\\r\\n");
if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\\n");
}
if (sizeof(ee_u32) != 4) {
ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\\n");
}
p->portable_id=1;
}
2.3.2 修改計(jì)時(shí)相關(guān)代碼
start_time/ stop_time/ get_time 這幾個(gè)函數(shù)是 coremark 程序運(yùn)行時(shí)計(jì)算程序運(yùn)行時(shí)間所用。 這里使用 system tick 進(jìn)行計(jì)時(shí), system tick 配置為 1ms 的中斷間隔。 system tick 中斷函數(shù)中更新 Tick 的值,每進(jìn)一次中斷加 1。所以還需要修改system tick 的中斷處理函數(shù)。
1)在 core_portme.c 中按下表找到需要修改的地方。
2) 在 core_portme.c 文件中添加新定義的變量和函數(shù)
#define SysTick_Counter_Disable ((uint32_t)0xFFFFFFFE)
#define SysTick_Counter_Enable ((uint32_t)0x00000001)
#define SysTick_Counter_Clear ((uint32_t)0x00000000)
__IO uint32_t Tick;
system tick 的中斷處理函數(shù)在 stm32f10x_it.c 中。stm32f10x_it.c 文件包含所有中斷處理入口函數(shù)。根據(jù)不同的平臺(tái), 這個(gè)文件的名字稍有不同。找到 SysTick_Handler 函數(shù)進(jìn)行修改。
修改前:
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
}
修改后:
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
extern __IO uint32_t Tick;
Tick++;
}
2.3.3 CoreMark 運(yùn)行配置
1)設(shè)置迭代次數(shù)
CoreMark 要求程序運(yùn)行的最短時(shí)間至少是 10s, 根據(jù)使用的系統(tǒng)時(shí)鐘等情況,可以在 core_portme.h 中修改迭代次數(shù)。
#define ITERATIONS 12000
2)設(shè)置打印信息
對(duì)編譯器版本和編譯器參數(shù)進(jìn)行定義。這2個(gè)宏不會(huì)影響跑分結(jié)果,只是coremark在打印評(píng)測(cè)結(jié)果的時(shí)候會(huì)輸出定義的值。
修改前:
#ifndef COMPILER_VERSION
#ifdef __GNUC__
#define COMPILER_VERSION "GCC"__VERSION__
#else
#define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)"
#endif
#endif
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS FLAGS_STR /*
"Please put compiler flags here (e.g. -o3)"
*/
#endif
修改后
#ifndef COMPILER_VERSION
#ifdef __GNUC__
#define COMPILER_VERSION "GCC"__VERSION__
#else
#define COMPILER_VERSION "ARMCC 5.06"
#endif
#endif
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS "-O3"
#endif
3) 修改優(yōu)化等級(jí)。
Options->C/C++ ->Optimization, 選擇O3以達(dá)到最優(yōu)的運(yùn)行速度。
3 運(yùn)行結(jié)果
接上串口,復(fù)位打印信息如下:
STM32F103
STM32F429
GD32F2
-
測(cè)試
+關(guān)注
關(guān)注
8文章
5269瀏覽量
126599 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304804 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211578 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32852 -
Cortex-M
+關(guān)注
關(guān)注
2文章
229瀏覽量
29752
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論