【XR806开发板试用】简单移植coremark并测试实际跑分

2024-03-13 15:04

本文主要是介绍【XR806开发板试用】简单移植coremark并测试实际跑分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

首先,拿到板子的时候,由于xr806它是个IOT的片子,所以自然而然必然,在预想里就会有很多大佬会把文章出发点考虑在wifi/bt,各种物联网/WEB应用上。那么怎么另辟蹊径回避这个热点又体现出XR806的特色呢,于是就有了写这篇文章的初衷——让我们从最简单的角度,实际看看ARM最新的v8架构的STAR核的跑分情况究竟如何:)

coremark这里就不做过多介绍了,这里指的是coremark的开源跑分软件,不同于其他基于linux的跑分软件,coremark的源码相对来说比较简单,非常易于MCU使用。需要了解详情的小伙伴请移步官网仔细查看,官网链接如下:

"download"页可以看github的下载链接。

"scores"页可以看到各种片子的跑分情况,小伙伴们在这里可以看到你们平时最熟悉的那些大厂的片子的实际官测分数(XR806的对手就是各种大厂牌子的MCU了)。

本次我们的对手就暂定为同为ARMv8架构的M33核芯片,没错,说的就是你——ST的stm32L552(这是ST最新的M33核的MCU,当然,这里提到它的主要原因是我手头也只有这一块demo板~~~~做对比:))。

准备

下载和编译环境配置这里不再累述,小伙伴们可以参照官方文档,做好鸿蒙源码下载同步,这里只是稍微单独说明两点:

1)为了省事务必使用ubuntu来搭建编译环境,目前在windows下用vscode搭建的过程尚未给全,此坑务趟,除非之前有鸿蒙开发的经验

2)官网有个别地方有路径字符编辑错误(此时不确定是否已更新),如果遇到问题可以参考其他小伙伴们关于环境搭建的试用文章

修改源码

先进入"device\xradio\xr806\ohosdemo\BUILD.gn",新增coremark的测试demo:

group("ohosdemo") {deps = ["core_mark_test:app_core_mark",#"hello_demo:app_hello",#"iot_peripheral:app_peripheral",#"wlan_demo:app_WlanTest",]
}

然后我们在"ohosdemo"目录下,添加两个目录"include"、“src”,把下载的coremark源码.c/.h分别放进去。

在"ohosdemo\core_mark_test"目录下建立一个BUILD.gn(从其他demo的文件夹下复制一个过来,修改其内容),内容如下:

import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_core_mark") {configs = []sources = ["src/main.c","src/core_list_join.c","src/core_main.c","src/core_matrix.c","src/core_portme.c","src/core_state.c","src/core_util.c",]cflags = board_cflagsinclude_dirs = board_include_dirsinclude_dirs += ["//kernel/liteos_m/kernel/arch/include","include",]
}

整个demo的源码目录结构如下:

.
├── BUILD.gn
├── core_mark_test
│   ├── BUILD.gn
│   └── src
│   |   ├── main.c
|   |   ├── core_list_join.c
|   |   ├── core_main.c
|   |   ├── core_matrix.c
|   |   ├── core_portme.c
|   |   ├── core_state.c
|   |   └── core_util.c
|   └── include
│       ├── core_main.h
│       ├── core_portme.h
│       ├── coremark.h
├── hello_demo
├── iot_peripheral
└── wlan_demo

然后来正式修改程序:

1)core_portme.h,修改如下:

/* Topic : DescriptionThis file contains configuration constants required to execute on different platforms
*/
#ifndef CORE_PORTME_H
#define CORE_PORTME_H#define ITERATIONS 5000//COREMARK_ITERATIONS

修改ITERATIONS为固定5000次计算迭代,大约执行约十几秒的时间(coremark有要求至少运行超过10秒,这个值可以根据CPU的频率填入适当的值)。

2)core_portme.c,修改如下:

/* Define : TIMER_RES_DIVIDERDivider to trade off timer resolution and total time that can be measured.Use lower values to increase resolution, but make sure that overflow does not occur.If there are issues with the return value overflowing, increase this value.*/
#define NSECS_PER_SEC 1000								//时间戳直接改成1000次/秒
#define CORETIMETYPE unsigned long  
#define GETMYTIME(_t) (*_t=LOS_TickCountGet())			//获取时间戳的函数改为鸿蒙的系统api LOS_TickCountGet()
#define MYTIMEDIFF(fin,ini) ((fin)-(ini))
#define TIMER_RES_DIVIDER 1
#define SAMPLE_TIME_IMPLEMENTATION 1
#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER)

由于用到了LOS_TickCountGet(),所以core_portme.c的文件头需要加上两个头文件:

#include <stdio.h>
#include <stdlib.h>
#include "ohos_init.h"		//新增
#include "kernel/os/os.h"	//新增
#include "coremark.h"

3)main.c修改如下:

#include <stdio.h>
#include "ohos_init.h"
#include "kernel/os/os.h"
#include "core_main.h"static OS_Thread_t g_main_thread;static void MainThread(void *arg)
{printf("coremark test start..\n");LOS_Msleep(2000);printf("3..\n");LOS_Msleep(1000);printf("2..\n");LOS_Msleep(1000);printf("1..\n");LOS_Msleep(1000);core_mark();while (1) {LOS_Msleep(500);}
}void CoremarkMain(void)
{printf("Coremark Test Start\n");if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {printf("[ERR] Create MainThread Failed\n");}
}SYS_RUN(CoremarkMain);

运行与调试

编译,运行,第一次得到的结果如下:

在这里插入图片描述

312分,非常不理想,这个分数甚至不如stm32L552。原因初步分析了下,要么是cache没开,要么是编译优化等级不够。查了一下,也许需要强制指定-O3的编译优化来发挥效果。

修改方式如下:

打开项目目录下的device/xradio/xr806/liteos_m/config.gni文件(此文件用于设备商的编译配置):

# Board related common compile flags.
board_cflags = []
board_cflags += SDK_cflags
board_cflags += ["-includelog/log.h","-DVIRTUAL_HCI","-DCONFIG_ARM",#"-DNULL=((void*)0)","-std=gnu99","-O3",
]

增加最后一个编译选项 “-O3”。

然后重新编译,跑分结果如下:
在这里插入图片描述

好了,454分,比STM32L552的实际跑分还要高一点点(它的实测跑分384)。优化之后跑分提高了50%!其实对于某些其他芯片来说,优化等级提高甚至可以达到跑分翻倍的效果。

不过此分数和coremark官方跑分(其他同级芯片对比)从频率比上比还是不太理想,目前没有其他原因的想法,待后续再查验吧。

不过不管怎么样,确实压了STM32L552的M33一头(虽然它只有110M):)

各位小伙伴也可以尝试一下对coremark做小小的移植,在自己喜爱的各种MCU上做做跑分对比。

这篇关于【XR806开发板试用】简单移植coremark并测试实际跑分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805247

相关文章

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

CPython与PyPy解释器架构的性能测试结果对比

《CPython与PyPy解释器架构的性能测试结果对比》Python解释器的选择对应用程序性能有着决定性影响,CPython以其稳定性和丰富的生态系统著称;而PyPy作为基于JIT(即时编译)技术的替... 目录引言python解释器架构概述CPython架构解析PyPy架构解析架构对比可视化性能基准测试测

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi