coremark的官方仓库:https://github.com/eembc/coremark
官方收录了很多单片机的跑分情况:https://www.eembc.org/coremark/scores.php
这个是我建立的一个仓库,用来收集自己用到的一些单片机的跑分情况:https://gitee.com/wild_coder/coremark_test,欢迎共建(现在还没两个,后面遇到新的会慢慢添加。。。)
main()
函数注释掉,因为core_main.c
中已经有一个了。然后打开core_portme.h
,搜索COMPILER_FLAGS
,根据自己的编译器优化选项填上去,不同优化等级分数差距会非常大:core_portme.h
最上面定义这个常量 ITERATIONS
,这个常量是运算的次数,不是固定的,因为这个跑分需要算法运行10秒以上才有效,跑的快的就大点,慢的就小点,填错的话后面打印也会提示你运行时间不足,再调整就好了 #define ITERATIONS 1000
修改下main函数参数类型
在core_portme.c
中添加自己的系统初始化,时钟和打印初始化这些,我这里初始化了时钟和打印接口,然后再coremark.h
文件中搜索HAS_PRINTF
,按需映射下ee_printf
在core_portme.c
中适配自己的定时器,EE_TICKS_PER_SEC
=1000即使用1ms的定时器中断:
主要是四个函数,start_time()
,stop_time()
,get_time()
,和自己平台的一个定时器函数如Tim1_IRQHandler()
uint32_t gTick = 0;
void
start_time(void)
{
// GETMYTIME(&start_time_val);
gTick = 0;
Bt_M0_Run(TIM1);
}
void
stop_time(void)
{
// GETMYTIME(&stop_time_val);
Bt_M0_Stop(TIM1);
}
CORE_TICKS
get_time(void)
{
// CORE_TICKS elapsed
// = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
return (CORE_TICKS)gTick;
}
//在对应中断文件中修改
extern uint32_t gTick;
void Tim1_IRQHandler(void) //1ms
{
static uint8_t cnt_5ms_flag = 0;
static uint16_t cnt_1s_flag = 0;
if(TRUE == Bt_GetIntFlag(TIM1, BtUevIrq))
{
gTick++;
Bt_ClearIntFlag(TIM1,BtUevIrq); //Timer3模式0 中断标志清除
}
}
没了,,,跑个分试试,这个是华大的hc32l136:
case 'f':
case 'F':
{
float fv;
fv = (float)va_arg(*pParamList, double); //取出输入的浮点数值
v = (int)fv; //取整数部分
_PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); //显示整数,支持负数
_StoreChar(&BufferDesc, '.'); //显示小数点
v = abs((int)(fv * 100));
v = v % 100;
_PrintInt(&BufferDesc, v, 10u, 2, FieldWidth, FormatFlags); //显示小数点后两位
}
break;