AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
目录
- AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告
- AIR32F103(二) Linux环境和LibOpenCM3项目模板
- AIR32F103(三) Linux环境基于标准外设库的项目模板
- AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
27倍频运行216MHz主频
合宙开发团队10月11日的提交中开源了AIR32F103的PLL倍频调节的代码, 使得在 Linux 下通过 GCC Arm 工具链也能编译运行216MHz.
代码示例
示例代码位于 Examples/NonFreeRTOS/RCC 下: https://gitee.com/iosetting/air32f103-template/tree/master/Examples/NonFreeRTOS/RCC
编译时遇到的问题
编译器对AIR_RCC_PLLConfig()
这个函数的优化会造成PLL设置失败.
这个函数的源代码如下, 可以看到其中会对特定地址(例如 0x40016C00)进行连续的写操作, 编译时如果优化参数不是-O0, 就大概率会将这些写操作合并或调换位置.
uint32_t AIR_RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul, uint8_t Latency)
{
uint32_t sramsize = 0;
uint32_t pllmul = 0;
FunctionalState pwr_gating_state = 0;
/* Check the parameters */
assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource));
assert_param(IS_RCC_PLL_MUL(RCC_PLLMul));
*(uint32_t *)(0x400210F0) = BIT(0);//开启sys_cfg门控
*(uint32_t *)(0x40016C00) = 0xa7d93a86;//解一、二、三级锁
*(uint32_t *)(0x40016C00) = 0xab12dfcd;
*(uint32_t *)(0x40016C00) = 0xcded3526;
sramsize = *(uint32_t *)(0x40016C18);
*(uint32_t *)(0x40016C18) = 0x200183FF;//配置sram大小, 将BOOT使用对sram打开
*(uint32_t *)(0x4002228C) = 0xa5a5a5a5;//QSPI解锁
SysFreq_Set(RCC_PLLMul,Latency ,0,1);
RCC->CFGR = (RCC->CFGR & ~0x00030000) | RCC_PLLSource;
//恢复配置前状态
*(uint32_t *)(0x40016C18) = sramsize;
*(uint32_t *)(0x400210F0) = 0;//开启sys_cfg门控
*(uint32_t *)(0x40016C00) = ~0xa7d93a86;//加一、二、三级锁
*(uint32_t *)(0x40016C00) = ~0xab12dfcd;
*(uint32_t *)(0x40016C00) = ~0xcded3526;
*(uint32_t *)(0x4002228C) = ~0xa5a5a5a5;//QSPI解锁
return 1;
}
解决的方法
- 在Keil5下, 可以对 air32f10x_rcc_ex.c 这个文件右键单独设置 AC6 编译选项. AC5可以使用 注解, AC6不再支持文件内部单个函数的优化设置
- 在GCC Arm中, 可以通过 Makefile 对 air32f10x_rcc_ex.c 设置单独的-O0参数, 也可以在代码中增加屏障避免优化(例如在两行代码之间增加
__NOP();
), 还可以通过int foo(int i) __attribute__((optimize("-O3")));
这样的形式, 参考GNU GCC文档
这里采用最后一种, 将库函数修改为
__attribute__((optimize("-O0"))) uint32_t AIR_RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul, uint8_t Latency)
CoreMark跑分结果
示例中的 CoreMark_256MHz 项目, 可以将AIR32F103运行在最高256MHz主频下, 运行CoreMark性能测试. 以下是分别在 256MHz, 216MHz, 72MHz 不同编译器版本下的测试结果.
32倍频, 256MHz
编译器 GCC11.2.1
SYSCLK: 256000000, HCLK: 256000000, PCLK1: 128000000, PCLK2: 256000000, ADCCLK: 128000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 17054␊
Total time (secs): 17.054000␊
Iterations/Sec : 586.372698␊
Iterations : 10000␊
Compiler version : GCC11.2.1 20220111␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 586.372698 / GCC11.2.1 20220111 -O3 / STACK␊
IR32F103 CoreMark␊
编译器 GCC11.3.1, 256MHz
SYSCLK: 256000000, HCLK: 256000000, PCLK1: 128000000, PCLK2: 256000000, ADCCLK: 128000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 17054␊
Total time (secs): 17.054000␊
Iterations/Sec : 586.372698␊
Iterations : 10000␊
Compiler version : GCC11.3.1 20220712␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 586.372698 / GCC11.3.1 20220712 -O3 / STACK␊
编译器 GCC12.2.0 256MHz
SYSCLK: 256000000, HCLK: 256000000, PCLK1: 128000000, PCLK2: 256000000, ADCCLK: 128000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 15822␊
Total time (secs): 15.822000␊
Iterations/Sec : 632.031349␊
Iterations : 10000␊
Compiler version : GCC12.2.0␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 632.031349 / GCC12.2.0 -O3 / STACK␊
27倍频, 216MHz
GCC11.2.1 216MHz
SYSCLK: 216000000, HCLK: 216000000, PCLK1: 108000000, PCLK2: 216000000, ADCCLK: 108000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 20213␊
Total time (secs): 20.213000␊
Iterations/Sec : 494.731114␊
Iterations : 10000␊
Compiler version : GCC11.2.1 20220111␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 494.731114 / GCC11.2.1 20220111 -O3 / STACK␊
GCC11.3.1 216MHz
SYSCLK: 216000000, HCLK: 216000000, PCLK1: 108000000, PCLK2: 216000000, ADCCLK: 108000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 20213␊
Total time (secs): 20.213000␊
Iterations/Sec : 494.731114␊
Iterations : 10000␊
Compiler version : GCC11.3.1 20220712␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 494.731114 / GCC11.3.1 20220712 -O3 / STACK␊
GCC12.2.0 216MHz
SYSCLK: 216000000, HCLK: 216000000, PCLK1: 108000000, PCLK2: 216000000, ADCCLK: 108000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 18753␊
Total time (secs): 18.753000␊
Iterations/Sec : 533.248014␊
Iterations : 10000␊
Compiler version : GCC12.2.0␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 533.248014 / GCC12.2.0 -O3 / STACK␊
编译器 AC6 (GCCClang 15.0.0) 216MHz
SYSCLK: 216.0Mhz, HCLK: 216.0Mhz, PCLK1: 108.0Mhz, PCLK2: 216.0Mhz, ADCCLK: 108.0Mhz
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 16328
Total time (secs): 16.328000
Iterations/Sec : 612.444880
Iterations : 10000
Compiler version : GCCClang 15.0.0
Compiler flags : -O3
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x988c
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 612.444880 / GCCClang 15.0.0 -O3 / STACK
9倍频, 72MHz
编译器 GCC11.2.1 72MHz
SYSCLK: 72000000, HCLK: 72000000, PCLK1: 36000000, PCLK2: 72000000, ADCCLK: 36000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 60677␊
Total time (secs): 60.677000␊
Iterations/Sec : 164.807093␊
Iterations : 10000␊
Compiler version : GCC11.2.1 20220111␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 164.807093 / GCC11.2.1 20220111 -O3 / STACK␊
编译器 GCC11.3.1 72MHz
SYSCLK: 72000000, HCLK: 72000000, PCLK1: 36000000, PCLK2: 72000000, ADCCLK: 36000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 60677␊
Total time (secs): 60.677000␊
Iterations/Sec : 164.807093␊
Iterations : 10000␊
Compiler version : GCC11.3.1 20220712␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 164.807093 / GCC11.3.1 20220712 -O3 / STACK␊
编译器 GCC12.2.0 72MHz
SYSCLK: 72000000, HCLK: 72000000, PCLK1: 36000000, PCLK2: 72000000, ADCCLK: 36000000␊
2K performance run parameters for coremark.␊
CoreMark Size : 666␊
Total ticks : 56293␊
Total time (secs): 56.293000␊
Iterations/Sec : 177.641980␊
Iterations : 10000␊
Compiler version : GCC12.2.0␊
Compiler flags : -O3␊
Memory location : STACK␊
seedcrc : 0xe9f5␊
[0]crclist : 0xe714␊
[0]crcmatrix : 0x1fd7␊
[0]crcstate : 0x8e3a␊
[0]crcfinal : 0x988c␊
Correct operation validated. See readme.txt for run and reporting rules.␊
CoreMark 1.0 : 177.641980 / GCC12.2.0 -O3 / STACK␊
AIR32F103(四) 27倍频216MHz,CoreMark跑分测试的更多相关文章
- LINUX系统下跑分测试脚本:unixbench.sh
linux 系统跑分测试脚本: 一.下载脚本: wget http://teddysun.com/wp-content/uploads/unixbench.sh 二.更改权限: ...
- Mysql 如何实现全文检索,关键词跑分
一.前言 今天一个同事问我,如何使用 Mysql 实现类似于 ElasticSearch 的全文检索功能,并且对检索关键词跑分?我当时脑子里立马产生了疑问?为啥不直接用es呢?简单好用还贼快.但是听他 ...
- unixbench性能测试跑分工具
UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能 所谓跑分工具,不仅各项的测试有得分,最后跑完也会有一个综合 ...
- 【原创】CLEVO P157SM外接鼠标键盘失灵解决:更换硅脂(附带最新跑分数据)
作者批注:本文允许转载,并且希望给搜索未来人类.蓝天.CLEVO.更换硅脂或者任何有关关键字的朋友提供帮助. 原文地址:http://www.cnblogs.com/c4isr/p/3514140.h ...
- 魅蓝Note2跑分 MT6753性能究竟如何
MT6753实力究竟如何? 采用LP工艺的MT6753实际上在性能和功耗方面并不比MT6752高,相反,同频下功耗要高1/3左右.并且其内存带宽是5.3G/s,小于MT 6752的6.4G/s 而且没 ...
- VPS性能综合测试(6):UnixBench跑分工具测试
测试时间可能会比较长,请耐心等待.最后UnixBench会详细列出各个测试项目的得分情况,以及VPS性能的综合跑分结果 UinxBench 的使用 使用方法如下: Run [ -q | -v ] [- ...
- Azure 进阶攻略 | 电脑跑分你会,但虚拟机存储性能跑分的正确姿势你造吗?
想学生时代,小编最爱做的就是研究电脑硬件,然后给自己.朋友和童鞋装机.装好后呢?当然要第一时间跑分了!各种跑分软件运行一遍,不断优化,不断测试.终于得到一个满意成绩,截图分享到网上显摆一下.当年为啥就 ...
- [转帖]疑似兆芯开先KX-7000跑分曝光:IPC性能大幅提升
疑似兆芯开先KX-7000跑分曝光:IPC性能大幅提升 https://www.bilibili.com/read/cv4028300 数码 11-23 1589阅读28点赞22评论 尽管有ARM架构 ...
- AMD全新32核线程撕裂者GeekBench跑分曝光:超2950X近一倍
AMD全新32核线程撕裂者GeekBench跑分曝光:超2950X近一倍 2019年09月01日 09:36 1109 次阅读 稿源:快科技 1 条评论 https://www.cnbeta.com/ ...
随机推荐
- CF 559C - Gerald and Giant Chess (组合计数)
\(C_{x+y}^y\)的公式,DP容斥删多余贡献. #include <cstdio> #include <iostream> #include <cstring&g ...
- Git 06 分支
参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 概述 分支用 ...
- ss 显示unix 域 的socket 缓冲区不正确
一个unix 域socket,平时我们用ss -auxp 来查看是否有数据在内核没有到用户态, [root@localhost unix]# ss -auxp |grep -i server.o u_ ...
- 刷题记录:Codeforces Round #725 (Div. 3)
Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...
- 【漏洞分析】KaoyaSwap 安全事件分析
相关信息 KaoyaSwap 是 BSC 链上的一个自动做市商 AMM.然后,现在他们的官网 https://www.kaoyaswap.com/ 已经打不开了(如果我打开方式没错的话).所以就直接进 ...
- QtCreator像C# region一样折叠代码
C# #region "comment" [code] #endregion 就可以在VS中实现代码折叠了 QtCreator #pragma region "comme ...
- Android下的IPC通信方式
一.Bundle Android的Activity.Service.Receiver都支持在Intent传递Bundle数据,Bundle实现了Parcelable接口, 所以能很方便的在不同进程之间 ...
- Linux_tail总结
tail 命令用法 功能从尾部显示文件若干行 语法: tail [ +/- num ][参数] 文件名 使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把 ...
- Redis 的大 Key 对持久化有什么影响?
作者:小林coding 图解计算机基础(操作系统.计算机网络.计算机组成.数据库等)网站:https://xiaolincoding.com 大家好,我是小林. 上周有位读者字节一二面时,被问到:Re ...
- 2、String类
String类 String 对象用于保存字符串,也就是一组字符序列 字符串常量对象是用双引号括起来的字符序列,例如:"你好"."12.07"."bo ...