修改代码coremark.h中
#include "rtthread.h"
#include "core_portme.h"改为
#include "barebones/core_portme.h"
增加宏定义
#if HAS_PRINTF
#define ee_printf printf
#endif
改为
//#if HAS_PRINTF
#define ee_printf rt_kprintf
//#endif
core_portme.h中
#define HAS_FLOAT 1
改为
#define HAS_FLOAT 0
前面添加#include
#define COMPILER_FLAGS
FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */
#endif
按照实际修改比如
#define COMPILER_FLAGS
“-O3”
#endif
core_portme.c中
#include "coremark.h"改为
#include "../coremark.h"
实现接口
barebones_clock()
使用rt_tick_get()
所以前面要包含 #include "rtthread.h"
CORETIMETYPE
barebones_clock()
{
//#error
// "You must implement a method to measure time in barebones_clock()! This function should return current time.n"
return rt_tick_get();
}
#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER)改为
#define EE_TICKS_PER_SEC RT_TICK_PER_SECOND
因为已经初始化了环境所以注释掉portable_init的
//#error
// "Call board initialization routines in portable init (if needed), in particular initialize UART!n"
core_main.c中
main改为core_main
ee_printf("Total time (secs): %dn", time_in_secs(total_time));改为
ee_printf("Total time (millisecond): %dn", time_in_secs(total_time*1000));
if (time_in_secs(total_time) > 0)
ee_printf("Iterations/Sec : %dn",
(int)((default_num_contexts * results[0].iterations*1000.0
/ time_in_secs(total_time*1000))));
main.c中
调用
int core_main(int argc, char *argv[]);
core_main(0, 0);
由于定义了大数组
#if (MEM_METHOD == MEM_STACK)
ee_u8 stack_memblock[TOTAL_DATA_SIZE * MULTITHREAD];
#endif
所以main的任务栈要修改大一些
Rtconfig.h中#define RT_MAIN_THREAD_STACK_SIZE (2048*4)
main任务优先级也提高一点大于shell的优先级
#define RT_MAIN_THREAD_PRIORITY 21
测试如果提示ERROR! Must execute for at least 10 secs for a valid result!
则将#define ITERATIONS 10000改大一点,测试时间要大于10秒。
配置为0则自动计算迭代次数。
问题:优化等级改为-O3后#define ITERATIONS 10000出错,改为8000测试。
主频是816M
| RT_TICK_PER_SECOND=1000 | RT_TICK_PER_SECOND=100 |
| 优化等级0 | 优化等级3 | 优化等级0 | 优化等级3 |
RAM中运行 | 717 | 2290 | | 2292 |
CoreMark/MHz | 0.878 | 2.8 | | 2.8 |
ROM中运行 | | | | |
和手册描述的5.6CoreMark/MHz刚好差一倍,不知道是不是手册描述的是双核累加。