0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Cortex-M的CoreMark性能测试

嵌入式大杂烩 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2023-05-01 01:24 次阅读

1 CoreMark简介

CoreMark是由EEMBC(Embedded Microprocessor Benchmark Consortium)的Shay Gla-On于2009年提出的一项基准测试程序,CoreMark的主要目标是简化操作,并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。

目前在嵌入式CPU行业中普遍公认的性能测试指标的标准主要使用以下三种,MIPS、Dhrystone、Coremark,而CoreMark与Dhrystone一样,拥有体积小、方便移植、易于理解、免费并且显示单个数字基准分数。与Dhrystone不同的是,Dhrystone的主要部分实际上暴露了编译器优化工作负载的能力,而不是实际MCU或CPU的能力,的性能,而CoreMark具有特定的运行和报告规则,从而可以避免由于所使用的编译库不同而导致的测试结果难以比较。

官网地址:

https://www.eembc.org/coremark/index.php

https://github.com/eembc/coremark

2 CoreMark移植

笔者这里使用STM32来演示。

2.1 CoreMark源码下载

首先去CoreMark 官网下载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文件到工程

准备一个STM32工程,将CoreMark所需的文件添加放到工程目录中。

168286214279395k0isowo3

2)添加文件到工程

接下来要做的就是添加 CoreMark 代码。因为 core_main.c 文件里已经包含了一个 main 函数,所以需要在工程中将默认创建的 main.c 文件删除。

完成后的工程文件结构如下:

1682862143332bfh37ixro2

2.3 配置 Coremark 文件

我们需要在 core_portme.c 中添加初始化的代码,并根据不同的计时方法修改 core_portme.c 中计时相关函数和代码。

2.3.1 添加初始化代码

core_portme.c 中的 portable_init 函数在 core_main.c 的 main 函数中首先被调用, 平台的初始化的函数(时钟,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 修改计时相关代码

start_time/ stop_time/ get_time 这几个函数是 coremark 程序运行时计算程序运行时间所用。 这里使用 system tick 进行计时, system tick 配置为 1ms 的中断间隔。 system tick 中断函数中更新 Tick 的值,每进一次中断加 1。所以还需要修改system tick 的中断处理函数。

1)在 core_portme.c 中按下表找到需要修改的地方。

34232.png

2) 在 core_portme.c 文件中添加新定义的变量和函数

#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 的中断处理函数在 stm32f10x_it.c 中。stm32f10x_it.c 文件包含所有中断处理入口函数。根据不同的平台, 这个文件的名字稍有不同。找到 SysTick_Handler 函数进行修改。

修改前:

/**
  * @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 运行配置

1)设置迭代次数

CoreMark 要求程序运行的最短时间至少是 10s, 根据使用的系统时钟等情况,可以在 core_portme.h 中修改迭代次数。

#define ITERATIONS 12000

2)设置打印信息

对编译器版本和编译器参数进行定义。这2个宏不会影响跑分结果,只是coremark在打印评测结果的时候会输出定义的值。

修改前:

#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) 修改优化等级。

Options->C/C++ ->Optimization, 选择O3以达到最优的运行速度。

1682862143756u1c7fmovhe

3 运行结果

接上串口,复位打印信息如下:

STM32F103

1682862144110018sd0eafj

STM32F429

1682862144411t7x9k84u4b

GD32F2

1682862144702217o8rhq9u

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 测试
    +关注

    关注

    8

    文章

    4332

    浏览量

    125004
  • 嵌入式
    +关注

    关注

    4957

    文章

    18115

    浏览量

    285822
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10301

    浏览量

    206119
  • 编译
    +关注

    关注

    0

    文章

    607

    浏览量

    32307
  • Cortex-M
    +关注

    关注

    2

    文章

    220

    浏览量

    29557
收藏 人收藏

    评论

    相关推荐

    基于Cortex-M处理器做产品开发为什么受欢迎

    产品都大不相同(例如,有不同大小的内存,不同的外设,性能和封装等等),架构的一致性让开发者一旦对他们其中的一块有开发经验,就很容易开始使用新的Cortex-M处理器。为了实现更容易的软件开发,更好的软件
    发表于 08-27 16:11

    你总得知道你为什么要用Cortex-M

    丰富,种类众多,到底该怎样选择适合自己产品的芯片类型?Cortex系列组合大体上分为三种类别: Cortex-M—面向各类嵌入式应用的微控制器内核Cortex-R—面向实时应用的高性能
    发表于 06-09 16:50

    如何选择正确的Cortex-M处理器?

    系统级特性,调试和追踪功能和性能的比较,欢迎大家一起学习了解。1、简介今天, ARM Cortex-M 处理器家族有8款处理器成员。除此之外,ARM的产品系列还有很多其他的处理器成员。对很多初学者,甚至
    发表于 10-22 08:16

    Cortex-M 系列处理特点和区别详解

    CoreMark 测试大小的代码大小比较。指令宽度认为 8 位微控制器使用 8 位指令,基于 ARM Cortex-M 处理器的微控制器使用 32 位指令,这是一种常见的误解。事实上,PIC18
    发表于 01-14 10:13

    基于Cortex-M原型系统建立的Cortex-M3 DesignStart原型

    采用Cortex-M原型系统建立Cortex-M3 DesignStart原型为什么选择Cortex-M原型系统?
    发表于 02-01 06:56

    Cortex-M入门资料和书籍分享

    Cortex-M入门在网上看博客逛论坛也是能学到些东西的,但通常是知识点,不能构成知识面。书籍通常会系统性地讲述,通过书籍可以建立起知识面,只有建立起了知识面才算是掌握。推荐两本书:《ARM
    发表于 07-01 09:38

    国内Cortex-M内核MCU产品性能哪家强

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是国内Cortex-M内核MCU厂商高性能产品。在8/16位中低端MCU领域,国内厂商的本土化产品设计以及超低价特点,使得其与...
    发表于 07-01 08:18

    ARM Cortex-M处理器详解 精选资料分享

    Cortex-M 系列处理器的指令集和高级中断处理能力,以及 SoC系统级特性,调试和追踪功能和性能的比较。  1、简介  今天, ARM Cortex-M 处理器家族有8款处理器成员。除此之外,ARM
    发表于 07-16 07:57

    cortex-m系列正式发布的版本是

    cortex-m系列正式发布的版本是,一 Cortex-M0到Cortex-M0+TODO: ARM处理器家族Cortex-M0处理器于2009年发布,是一款具有开创性的产品,因其实第
    发表于 07-22 09:54

    cortex-m下各种微架构的区别是什么?

    cortex-m单片机在arm产品中的位置是哪里?cortex-m 单片机的类别有哪些?cortex-m下各种微架构的区别是什么?
    发表于 11-04 06:00

    Cortex-M处理器优化的代码

    生成针对Cortex-M处理器优化的代码。嵌入式编码®Support Package的ARM®的Cortex®-M处理器可以生成使用CMSIS库数学运算的优化代码。将此生成的代码用于ARM
    发表于 12-14 09:10

    ARM Cortex-M堆栈机制介绍

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是ARM Cortex-M堆栈机制。  今天给大家分享的这篇依旧是2016年之前痞子衡写的技术文档,花了点时间重新编排了一下
    发表于 12-16 06:26

    ARM Cortex-M内核的相关资料推荐

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是ARM Cortex-M功能模块,不过侧重点是三款安全特性处理器。  ARM Cortex-M处理器家族发展至今(2020),已有
    发表于 12-27 07:21

    Arm Cortex-M处理器—Cortex-M85介绍

    Arm发布了新一代的Cortex-M处理器,Cortex-M85。简单粗暴的打个比方:Cortex-M85 ≈ Cortex-M7TrustZoneHelium(
    发表于 07-15 14:59

    ARM Cortex-M处理器对比表

    Cortex-M处理器系列针对低成本、高能效的微控制器进行了优化。 这些处理器可以在各种应用中找到,包括物联网、工业和日常消费设备。 该处理器系列基于M-Profile架构,可为深度嵌入式系统提供低
    发表于 08-29 07:00