【笔记------coremark】单片机上的跑分库coremark移植

coremark的官方仓库:https://github.com/eembc/coremark

官方收录了很多单片机的跑分情况:https://www.eembc.org/coremark/scores.php

这个是我建立的一个仓库,用来收集自己用到的一些单片机的跑分情况:https://gitee.com/wild_coder/coremark_test,欢迎共建(现在还没两个,后面遇到新的会慢慢添加。。。)

  1. 文件添加,代码下载好是这样的,把如下部分的头文件和源文件添加到自己的工程:
  2. 把自己的main()函数注释掉,因为core_main.c中已经有一个了。然后打开core_portme.h,搜索COMPILER_FLAGS,根据自己的编译器优化选项填上去,不同优化等级分数差距会非常大:
  1. core_portme.h最上面定义这个常量 ITERATIONS ,这个常量是运算的次数,不是固定的,因为这个跑分需要算法运行10秒以上才有效,跑的快的就大点,慢的就小点,填错的话后面打印也会提示你运行时间不足,再调整就好了
c 复制代码
	#define ITERATIONS 1000
  1. 修改下main函数参数类型

  2. core_portme.c中添加自己的系统初始化,时钟和打印初始化这些,我这里初始化了时钟和打印接口,然后再coremark.h文件中搜索HAS_PRINTF,按需映射下ee_printf

  3. core_portme.c中适配自己的定时器,EE_TICKS_PER_SEC=1000即使用1ms的定时器中断:

    主要是四个函数,start_time(),stop_time(),get_time(),和自己平台的一个定时器函数如Tim1_IRQHandler()

c 复制代码
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:

  • 其他注意

    • ITERATIONS 值太大而运行速度太慢的时候是要等很久的,此时是没有任何输出的,所以可以先设小点,如果报错再加大
    • 对堆栈有很少量的需求,简单测试的最小测试通过的配置:
    • 在main函数的最后可以加一句方便的打印CoreMarks/MHz,这里48是系统运行频率
    • 如果出现时间相关参数没打印出来,如下图,先测试下浮点数打印正常,比如打印个3.14试试,很多平台的printf默认是不支持浮点数的,需要想办法实现下,这里贴个RTTview的浮点实现备忘(原文链接:https://blog.csdn.net/jiayujiang/article/details/119216304)。。
    c 复制代码
        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;
相关推荐
星一工作室16 分钟前
【STM32模块教程】-TT马达(直流电机)
单片机·嵌入式硬件
凯尔萨厮19 分钟前
Java学习笔记十四(网络通信)
笔记·学习
jianqiang.xue34 分钟前
ESP-IDF保姆级入门19|低功耗模式全解与工程化设计:分级休眠/唤醒源配置/功耗调优/外设适配,实现工业级功耗性能平衡
stm32·单片机·物联网·架构·esp32
单片机仿真设计37 分钟前
【proteus仿真】基于 STM32 单片机汽车安全监控装置设计(仿真 + 源码)
stm32·单片机·嵌入式硬件·proteus·毕设
单片机仿真设计38 分钟前
【proteus仿真】基于 STM32 单片机的智能浴室系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
天空'之城1 小时前
单片机基础核心知识点汇总(二十六)
单片机·嵌入式硬件
AAA代码批发商1 小时前
DAYS 38 TCP并发服务器模型详解
linux·网络·笔记·学习
新晨单片机设计1 小时前
S005A-基于STM32单片机震动防盗报警器【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
启观川1 小时前
Python基础-第 16 章 综合案例:客户信息管理系统
开发语言·笔记·python·正则表达式
Jason_zhao_MR1 小时前
Linux与采集MCU通信为什么我们用了双SPI
linux·arm开发·单片机·嵌入式硬件·嵌入式