你的单片机能跑10000分吗?教你一招,轻松搞定性能测试
扫描二维码
随时随地手机看文章
一、EEMBC协会
在讲CoreMark之前,必须要先提EEMBC(Embedded Microprocessor Benchmark Consortium)即嵌入式微处理器基准评测协会,它是一个非盈利性组织,该组织目前共发布了46个性能测试基准,有了这些性能基准参考,嵌入式设计人员可以快速有效地选择处理器。EEMBC测试是基于每秒钟算法执行的次数和编译代码大小的综合统计结果。众所周知,编译器选项会对代码大小和执行效率会产生巨大的影响,所以每种测试必须包括足够多的编译器信息并设置不同的优化项。EEMBC发展势头很好,其很有可能发展成为嵌入式系统开发人员进行处理器和编译器性能比较的工业标准。关于EEMBC的更多介绍可移步它的官方网站 http://www.eembc.org/二、CoreMark标准
CoreMark是由EEMBC的Shay Gla-On于2009年提出的一项基准测试程序,其主要目标是测试处理器核心性能。CoreMark标准的测试方法很简单,就是在某配置参数组合下单位时间内跑了多少次CoreMark程序,其指标单位为CoreMark/MHz。CoreMark数字越高,意味着性能更高。2.1 获取程序
CoreMark程序的目前最新版本是1.01。核心程序下载 http://www.eembc.org/coremark/download.php核心程序包下载后,在\coremark_v1.0\readme.txt里可见基本介绍,在\coremark_v1.0\docs\Coremark-requirements.doc里可见设计需求。详细文件目录如下:
平台移植示例 http://www.eembc.org/coremark/ports.php
\coremark_v1.0
\barebones --移植到裸机下需要修改的文件
\core_portme.h -- 移植平台工程具体配置信息
\core_portme.c -- 计时以及板级初始化实现
\cvt.c
\ee_printf.c -- 打印函数串口发送实现
\cygwin --移植到cygwin下需要修改的文件
\linux --移植到linux下需要修改的文件
\linux64 --移植到linux64下需要修改的文件
\simple --基本移植需要修改的文件
core_main.c --主程序入口
core_state.c --状态机控制子程序
core_list_join.c --列表操作子程序
core_matrix.c --矩阵运算子程序
core_util.c --CRC计算子程序
coremark.h --工程配置与数据结构定义
\docs --设计文档
coremark.md5
LICENSE.txt
Makefile
readme.txt --基本介绍
release_notes.txt --版本说明
如果是移植到ARM Cortex-M平台下裸系统运行,一般只需要修改\barebones目录下的文件即可(仅需改动三个函数portable_init()、barebones_clock()、uart_send_char()以及core_portme.h中若干宏定义),其余代码文件不需要修改。关于\barebones下的文件修改,EEMBC上有如下4个示例平台可参考:2.2 配置参数
前面讲到做平台移植时除了必须要改动3个函数外,还需要设置core_portme.h中若干宏定义,这些宏定义即为配置参数,需要根据要移植到的具体平台的属性而定。一共如下14个宏:宏 | 解释 | 示例 |
---|---|---|
HAS_FLOAT | Define to 1 if the platform supports floating point | 1 |
HAS_TIME_H | Define to 1 if platform has the time.h header file and implementation of functions thereof | 0 |
USE_CLOCK | Define to 1 if platform has the time.h header file and implementation of functions thereof | 0 |
HAS_STDIO | Define to 1 if the platform has stdio.h. | 0 |
HAS_PRINTF | Define to 1 if the platform has stdio.h and implements the printf function. | 0 |
COMPILER_VERSION | Please put compiler version here (e.g. gcc 4.1) | "IAR EWARM v8.20.2" |
COMPILER_FLAGS | Please put compiler flags here (e.g. -o3) | "High - Speed - No size constraints" |
MEM_LOCATION | Please put the mem location of code execution here (e.g STACK) | "STACK" |
CORETIMETYPE | Define type of return from the timing functions. | ee_u32 |
SEED_METHOD | Defines method to get seed values that cannot be computed at compile time. | SEED_VOLATILE |
MEM_METHOD | Defines method to get a block of memry. | MEM_STATIC |
MULTITHREAD | Define for parallel execution | 1 |
MAIN_HAS_NOARGC | Needed if platform does not support getting arguments to main. | 1 |
MAIN_HAS_NORETURN | Needed if platform does not support returning a value from main. | 0 |
#if !defined(PROFILE_RUN)