【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

相关文章

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也