瑞萨单片机william hill官网
直播中

ouxiaolong

11年用户 470经验值
擅长:嵌入式技术 光电显示
私信 关注
[经验]

【瑞萨RA4系列开发板体验】基于CoreMark的性能测试

开发环境:

IDE:MKD 5.30

开发板:RA-Eco-RA4M2

MCU:R7FA4M2AD3CFP

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具有特定的运行和报告规则,从而可以避免由于所使用的编译库不同而导致的测试结果难以比较。

官网地址

2 CoreMark移植

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文件到工程

准备一个基于串口通信的RA4M2_Project工程,将CoreMark所需的文件添加放到工程目录中。

1670659329417d3qg47tgh6

2)添加文件到工程

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

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

1670659330096p1icmqnvjg

3)修改主函数入口

由于CoreMark提供了主函数,因此最简单的就是注释掉Renesas RA Smart Configurator自动生成的主函数。

1670659330688uuu9hf5t2m

当时Renesas RA Smart Configurator重新配置后又会自动生成,因此还有一个半办法就是修改core_main.c的主函数了,只是这里就会修改得比较多,看个人喜好吧。

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;
}

修改后:

/* Function : portable_init
        Target specific initialization code
        Test for some common mistakes.
*/
void portable_init(core_portable *p, int *argc, char *argv[])
{
    //usart init 115200 8-N-1
    R_SCI_UART_Open (g_uart9.p_ctrl, g_uart9.p_cfg);

    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 中按下表找到需要修改的地方。

cede.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;

找到 SysTick_Handler 函数进行修改,如果没有就自行创建。

修改前:

/**
  * [url=home.php?mod=space&uid=2666770]@Brief[/url]  This function handles SysTick Handler.
  * [url=home.php?mod=space&uid=3142012]@param[/url]  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.4 CoreMark 运行配置

1)设置迭代次数

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

#define ITERATIONS 12000

2)设置打印信息

对编译器参数进行定义。

修改前:

#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS FLAGS_STR /*
"Please put compiler flags here (e.g. -o3)"
*/
#endif

修改后

#endif
#ifndef COMPILER_FLAGS
#define COMPILER_FLAGS "-O3"
#endif

3) 修改优化等级。

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

16706593309624yqnnd7t46

完成上面的操作步骤后,CoreMark项目就可以正常编译了。如果此时直接运行,将会发现系统复位,无法正常运行;通过断点调试,可以发现是因为栈空间不足导致的。

4) 修改栈大小

默认情况下,CoreMark使用的是栈内存进行的计算,而RASC默认的栈空间大小为1024字节(0x400)。需要增大栈内存大小,才可以正常运行CoreMark。

具体设置位于RASC菜单的BSP->Properties界面,将栈空间修改为0x2000。

167065933132018ccs7uice

3 运行结果

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

RA4M2

1670659331706wlc2jjseqo

当然也可以看看其他的Cortex-M的处理器,做个比较吧。

STM32F429

1670659331993txnqy3187j

GD32F207

1670659332323cqisvdraat

可以看到RA4M2和STM32F429的整体跑分差不多,RA4M2相比STM32F429更多的是安全提升。

值得注意的是,不同的编译器,不同的优化等级,同一款处理器的跑分也会不一样,因此,在比较时,优化等级、编译器等参数尽量一致。

更多回帖

发帖
×
20
完善资料,
赚取积分