发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[coremark]

基于APM32E103的CoreMark测试方法

[复制链接]
998|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shanyuxiang|  楼主 | 2023-10-4 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shanyuxiang 于 2023-10-5 19:36 编辑

#申请原创# @21小跑堂
基于APM32E103的CoreMark测试方法

CoreMark是专门用于测试处理器内核性能的基准测试程序,测试的内容有:列表处理(查找和排序)、矩阵操作(常见的矩阵操作)、状态机(确定输入流是否包含有效数字)和CRC(循环冗余检查),通过Coremark跑分可以了解到MCU的算力。
下面以APM32E103芯片和Keil为例,介绍一下如何在APM32上面运行coramark测试。coremark需要定时器用于计时,还需要用串口来打印输出测试结果。

1、获取相关代码
在极海官网可以下载SDK:
https://www.geehy.com/uploads/tool/APM32E10x_SDK_V1.2.zip
打开 ”APM32E10x_SDK_V1.1\Examples\USART\USART_Printf\Project\MDK\USART_Printf.uvprojx“,
这个工程已经有串口和滴答定时器的初始化,便于修改。

在CoreMark的GitHub下载库:
https://github.com/eembc/coremark.git

网速太慢的话可以在国内Gitee下载:
https://gitee.com/ssri-mirrors/coremark.git

2、实现串口打印printf
先初始化串口,直接用SDK本来的代码就行。
然后重定义fputc(),以便能通过printf()输出信息到串口调试助手。
struct __FILE
{
        int handle;
};
FILE __stdout;      

int fputc(int ch, FILE *f)
{         
     while(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
     USART_TxData(USART1, ch);
        
     return ch;
}

3、实现计时函数GETMYTIME
使用滴答定时器或者普通定时器都可以,这里以滴答定时器为例,每隔10ms中断一次。
SysTick_Config(SystemCoreClock / 100);

在中断服务中需要一个全局变量进行10毫秒级计时。
void SysTick_Handler(void)
{
    tick++;
}

4、添加Coremark源代码
将下载的coremark库解压到工程目录下,在Keil工程中添加这几个文件,其中 core_portme.c 在文件夹simple里面。

还要在工程设置中添加相关头文件的路径

把 core_main.c 中的 main(int argc, char *argv[]) 改为 coremark_main(int argc, char *argv[]) 以免编译报错。
MAIN_RETURN_TYPE
coremark_main(int argc, char *argv[])

在真正的int main()函数中调用 coremark_main 函数。
coremark_main(0,NULL);  //正常开始运行测试算法

5、配置Coremark
完成以上步骤后编译会报两个错:
..\..\coremark-main\core_main.c(383): error:  #20: identifier "FLAGS_STR" is undefined
..\..\coremark-main\simple\core_portme.c(38): error:  #20: identifier "ITERATIONS" is undefined

第1个错误是说没定义 FLAGS_STR 这个字符串,这个是用来编译优化等级的,在 core_portme.h 添加这个字符串。
#define COMPILER_FLAGS "Level 0"

第2个错误是说没定义 ITERATIONS 这个值,这个值决定了coremark算法执行的次数,对于性能越高的MCU这个值应该越大,
在core_portme.c中添加这个宏定义 , 这里先设个1000,后面根据需要再调整。
#define ITERATIONS 1000

接下来要配置关于时间的代码,还是core_portme.c这个文件,将之前中断服务函数计数的变量赋给 *_t ,同时也要包含tick变量的声明。
#define NSECS_PER_SEC              CLOCKS_PER_SEC
#define CORETIMETYPE               clock_t
#define GETMYTIME(_t)              (*_t = tick )


注意 CLOCKS_PER_SEC 这个宏,它表示每秒的时钟数,也就是一秒内tick计数的增加量,
如果tick每隔10ms加一,那么CLOCKS_PER_SEC应该等于100;如果tick每隔1ms加一,那么CLOCKS_PER_SEC应该等于1000;

6、增加栈的大小
coremark运行时需要较大的栈空间,默认栈大小不够,需要改大。
打开CMSIS栏中的启动文件 startup_apm32e10x_hd.s ,把栈Stack_Size 增加到 2KB 。
Stack_Size      EQU     0x00000800

7、下载程序并执行
编译并下载程序,等待10多秒后串口输出测试结果。
有时优化等级提高了,或者换了更强的MCU测试,会出现算法执行时间小于10秒的提示:
这时只需要把 ITERATIONS 改大就行了。
#define ITERATIONS 2000

把优化等级提到最高,测得CoreMark 1.0跑分为 139.958

以上就是用Coremark库对APM32E103进行性能测试的方法及步骤,对其他芯片的测试方法也是大同小异。







APM32E10x_SDK_V1.1 CoreMark测试代码.rar

776.15 KB

本次Coremark测试的源代码

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2023-10-11
理由:恭喜通过原创审核!期待你更多的原创作品~

评论
21小跑堂 2023-10-11 16:40 回复TA
通用的CoreMark测试处理器内核方式,通过各种运算和操作,完成对处理器内核的性能测试,评估MCU性能。 
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

28

帖子

1

粉丝