【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实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经