全志XR806 vs STM32L552 —— Coremark跑分
作者:endless
前言
首先,拿到板子的时候,由于xr806它是个IOT的片子,所以自然而然必然,在预想里就会有很多大佬会把文章出发点考虑在wifi/bt,各种物联网/WEB应用上。那么怎么另辟蹊径回避这个热点又体现出XR806的特色呢,于是就有了写这篇文章的初衷——让我们从最简单的角度,实际看看ARM最新的v8架构的STAR核的跑分情况究竟如何:)
coremark这里就不做过多介绍了,这里指的是coremark的开源跑分软件,不同于其他基于linux的跑分软件,coremark的源码相对来说比较简单,非常易于MCU使用。需要了解详情的小伙伴请移步官网仔细查看,官网链接如下:
https://www.eembc.org/coremark/
"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_cflags
include_dirs = board_include_dirs
include_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 : Description
This 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_DIVIDER
Divider 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上做做跑分对比。
相关推荐
CISP-CSE注册云安全工程师备考资源包基础教程
随着云计算技术的普及,云安全已成为网络安全领域的核心议题。CISP-CSE(注册云安全工程师)认证由中国信息安全测评中心颁发,旨在培养具备云安全专业知识和实践能力的实战型人才。本教程将结合"CISP-CSE注册云安全工程师备考资源包",系统性地为您梳理云安全的核心知识体系,并提供实战案例分析,助您高效备考。
绘图模拟:在冲动环境中固定时间的示例 附matlab代码.rar
绘图模拟:在冲动环境中固定时间的示例 附matlab代码.rar
基于规则的电动汽车混合能源管理系统,采用MATLAB、Simulink、Simscape Electrical和Stateflow。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
完全复现虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)
内容概要:本文围绕虚拟同步发电机(VSG)的自适应惯量阻尼控制展开深入研究,通过Simulink搭建详细的系统仿真模型,并结合Matlab代码实现控制算法,系统分析了根轨迹特性及不同调节系数对系统动态响应的影响。研究重点在于设计并验证一种能够根据电网频率变化自动调整惯量和阻尼参数的自适应控制策略,有效提升了VSG在面对负载突变或新能源波动时的频率稳定性与抗干扰能力,为高比例可再生能源接入下的电力系统稳定运行提供了关键技术支撑。; 适合人群:具备电力系统分析、自动控制理论及新能源并网技术基础的研究生、科研人员以及从事微电网、分布式能源系统设计与运维的工程技术人员。; 使用场景及目标:①深入理解虚拟同步发电机的工作原理及其在提升电网惯性方面的关键作用;②掌握基于Simulink的电力电子与控制系统建模与仿真方法;③学习并实践惯量和阻尼自适应控制策略的设计流程,通过根轨迹分析手段优化控制器参数,提升系统动态性能。; 阅读建议:建议读者结合所提供的Simulink仿真模型与Matlab代码进行同步操作,重点关注控制器设计逻辑与参数整定过程,通过改变调节系数观察系统响应变化,深化对稳定性判据与控制性能之间关系的理解。
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)内容概要:本文主要介绍了数字下变频(DDC)技术在雷达信号处理中的应用,并提供了基于Matlab的代码实现。DDC作为现代雷达系统中的关键环节,主要用于将高频接收信号转换为便于后续处理的低频或基带信号,从而提高信号处理效率与精度。文中详细阐述了DDC的基本原理,包括混频、低通滤波和抽取等步骤,并通过Matlab代码展示了其实现过程,帮助读者理解如何在实际工程中构建和调试DDC模块。此外,文档还提及该资源属于一个涵盖多个科研方向的技术资料集合,如路径规划、电力系统优化、机器学习、通信系统仿真等,强调借助成熟工具与方法可提升科研效率。 适合人群:具备一定信号处理基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适用于从事雷达系统设计、通信工程或相关领域研究的人员。 使用场景及目标:① 学习和掌握数字下变频(DDC)在雷达信号处理中的基本原理与实现方法;② 利用Matlab进行算法仿真与验证,辅助完成课程设计、毕业课题或科研项目中的信号处理部分;③ 借助提供的代码框架拓展至其他通信或雷达系统仿真任务中。 阅读建议:此资源以Matlab代码为核心载体,注重理论与实践结合,建议读者在学习过程中同步运行代码并调整参数,观察不同设置对下变频结果的影响,加深对混频泄漏、滤波器设计和采样率变化等问题的理解,从而真正掌握DDC的关键技术细节。


