[活动] 【APM32F107VCT6 MINI开发板测评】+coremark移植

[复制链接]
1241|14
 楼主| skylove1233 发表于 2023-3-21 00:28 | 显示全部楼层 |阅读模式
本帖最后由 skylove1233 于 2023-3-21 00:38 编辑

#申请原创#  @21小跑堂
本帖介绍了APM32F107 coremark的移植过程.
CoreMark是衡量嵌入式系统中微控制器性能的基准。通过包含列表处理(查找和排序)、矩阵处理(常见的矩阵操作)、状态机(确定输入流是否包含有效数字)和CRC(循环冗余校验)等算法的测试给出性能评价。很多MCU的数据手册中都会给出官方的coremark数值。

1.coremark下载
下载地址:https://github.com/eembc/coremark
下载解压后目录结构如下所示:
1.png
我们移植coremark只需要1和2部分的文件,其他文件不需要。
2.移植过程
coremark移植需要满足两个条件:
(1)定时器打开-->用于计时
(2)串口重定向打开-->用于查看结果
因此,在移植前我们先建立好工程,由于demo中已有串口相关的工程,我们直接打开工程:APM32F10x_SDK_V1.8\Examples\USART\USART_Interrupt\Project\MDK\
直接在此demo的基础上做修改:
demo目录结构如下:

2.png
(1)串口初始化并重定向
我们需要做的第1件事:串口初始化并重定向,直接在main.c中修改:
串口初始化:
  1. void UsartInit()
  2. {
  3. USART_Config_T USART_ConfigStruct;
  4. /*USART2*/
  5. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
  6. RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2);

  7. USART_ConfigStruct.baudRate = 115200;
  8. USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  9. USART_ConfigStruct.mode = USART_MODE_TX_RX;
  10. USART_ConfigStruct.parity = USART_PARITY_NONE;
  11. USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
  12. USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
  13. APM_MINI_COMInit(COM2, &USART_ConfigStruct);

  14. }
LED初始化:
  1. void LEDInit()
  2. {
  3. APM_MINI_LEDInit(LED2);
  4. APM_MINI_LEDInit(LED3);
  5. }
串口重定向:
  1. int fputc(int ch, FILE *f)
  2. {
  3. /* send a byte of data to the serial port */
  4. USART_TxData(DEBUG_USART, (uint8_t)ch);

  5. /* wait for the data to be send */
  6. while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);

  7. return (ch);
  8. }

新建函数后,要将声明在main.h中添加,并包含stdio.h:
  1. void UsartInit();
  2. void LEDInit();
(2)添加coremark代码
此处,主函数的部分操作完毕,接下来将coremark添加到项目中,将如下文件复制到project中的source目录:

3.png
并按如下操作,新建一个项目目录,coremark用于存除了simple目录下文件外其他的源文件,simple目录下的文件需要修改,放于application目录:
4.png

最终操作后结果如下图:
5.png
除此之外,还要做一些配置操作,如下图所示:
6.png
将新增的目录头文件包含进来,如下所示:
7.png
由于coreportme.c中有main函数,因此需要将main.c中的main注释掉,然后将usartinit,ledinit写到coreportme.c的main函数的portable_init函数中,如下所示:
  1. void
  2. portable_init(core_portable *p, int *argc, char *argv[])
  3. {

  4. (void)argc; // prevent unused warning
  5. (void)argv; // prevent unused warning

  6. /*init */
  7. UsartInit();
  8. LEDInit();

  9. printf("coremark begin\n");
(3)解决编译报错
给此文件加上main.h,然后编译,会报两个错误:
错误1:
../../Source/cmk/simple\core_portme.h(80): note: expanded from macro 'COMPILER_FLAGS'
../../Source/cmk/core_main.c(413): error: use of undeclared identifier 'FLAGS_STR'
点击错误1,可看到此处代码:
8.png
由代码可知,此处要修改FLAGS_STR为编译选项,此处我们使用-ofast,修改为:
  1. #ifndef COMPILER_FLAGS
  2. #define COMPILER_FLAGS "-Ofast" \
  3. //FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */
  4. #endif
同时,编译选项中也做以下修改:

9.png
错误2:
../../Source/cmk/simple/core_portme.c(39): error: use of undeclared identifier 'ITERATIONS'
此处的ITERATIONS为算法迭代次数,由用户修改,此处我们做出定义:#define ITERATIONS  1000

再次编译,就不报错了。

(4)代码修改
除了上述修改外,还有注释掉一些不用的宏定义,如下所示:

10.png
(5)修改时钟的起始、停止、时间获取的三个函数
11.png
接着在main.h中引用tick全局变量:extern  volatile unsigned int tick;
在apm32f10x_int.c的SysTick_Handler函数中,增加tick++
  1. <div>void SysTick_Handler(void)</div><div>{</div><div>tick++;</div><div>}</div>
最后,再修改下堆栈大小:

12.png
(6)实际效果
代码down到板子上,连接到串口调试助手,结果如图所示:
13.png
从报错中可以看出,要求程序最少跑10s,我们迭代次数为1000时明显不满足条件,因此,调大迭代次数为3000,再跑一次,最终结果如下:
14.png
coremark分数为167.326677。

完整代码见附件:

coremark.rar

395.04 KB, 下载次数: 3

coremark源码

pixhw 发表于 2023-4-12 21:26 | 显示全部楼层
这个代码应该是兼容stm32的吧
fengm 发表于 2023-4-12 21:33 | 显示全部楼层
coremark移植怎么会跑飞程序呢
cashrwood 发表于 2023-4-13 21:59 | 显示全部楼层
coremark在哪里能看到排名呢?
phoenixwhite 发表于 2023-5-5 21:08 | 显示全部楼层
CoreMark性能测试的结果靠谱嘛
qiufengsd 发表于 2023-5-5 22:25 | 显示全部楼层
CoreMark需要使用一个定时器进行计时,它的主要操作流程为:开启定时器,运行性能测试代码片段,停止定时器,计算时间差值,
cashrwood 发表于 2023-5-5 22:30 | 显示全部楼层
如何将CoreMark程序移植到APM32F107VCT6
i1mcu 发表于 2023-5-5 22:58 | 显示全部楼层
CoreMark-Pro是一个先进的市场处理器测试基准,跑分可信度高。
 楼主| skylove1233 发表于 2023-5-9 18:56 | 显示全部楼层
pixhw 发表于 2023-4-12 21:26
这个代码应该是兼容stm32的吧

基本兼容,可能得有些小的修改
 楼主| skylove1233 发表于 2023-5-9 18:57 | 显示全部楼层
fengm 发表于 2023-4-12 21:33
coremark移植怎么会跑飞程序呢

不会跑飞的吧,移植步骤要对
 楼主| skylove1233 发表于 2023-5-9 18:59 | 显示全部楼层
cashrwood 发表于 2023-4-13 21:59
coremark在哪里能看到排名呢?

这我就不太清楚了
 楼主| skylove1233 发表于 2023-5-9 19:01 | 显示全部楼层
phoenixwhite 发表于 2023-5-5 21:08
CoreMark性能测试的结果靠谱嘛

靠谱的
 楼主| skylove1233 发表于 2023-5-9 19:01 | 显示全部楼层
qiufengsd 发表于 2023-5-5 22:25
CoreMark需要使用一个定时器进行计时,它的主要操作流程为:开启定时器,运行性能测试代码片段,停止定时器,计 ...

我的代码中使用了systic定时器,也是一样的
 楼主| skylove1233 发表于 2023-5-9 19:02 | 显示全部楼层
cashrwood 发表于 2023-5-5 22:30
如何将CoreMark程序移植到APM32F107VCT6

帖子有详细解释
 楼主| skylove1233 发表于 2023-5-9 19:03 | 显示全部楼层
i1mcu 发表于 2023-5-5 22:58
CoreMark-Pro是一个先进的市场处理器测试基准,跑分可信度高。

是的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

62

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部