目录

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跑分测试的更多相关文章

  1. LINUX系统下跑分测试脚本:unixbench.sh

    linux 系统跑分测试脚本:     一.下载脚本:        wget http://teddysun.com/wp-content/uploads/unixbench.sh 二.更改权限:  ...

  2. Mysql 如何实现全文检索,关键词跑分

    一.前言 今天一个同事问我,如何使用 Mysql 实现类似于 ElasticSearch 的全文检索功能,并且对检索关键词跑分?我当时脑子里立马产生了疑问?为啥不直接用es呢?简单好用还贼快.但是听他 ...

  3. unixbench性能测试跑分工具

    UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能 所谓跑分工具,不仅各项的测试有得分,最后跑完也会有一个综合 ...

  4. 【原创】CLEVO P157SM外接鼠标键盘失灵解决:更换硅脂(附带最新跑分数据)

    作者批注:本文允许转载,并且希望给搜索未来人类.蓝天.CLEVO.更换硅脂或者任何有关关键字的朋友提供帮助. 原文地址:http://www.cnblogs.com/c4isr/p/3514140.h ...

  5. 魅蓝Note2跑分 MT6753性能究竟如何

    MT6753实力究竟如何? 采用LP工艺的MT6753实际上在性能和功耗方面并不比MT6752高,相反,同频下功耗要高1/3左右.并且其内存带宽是5.3G/s,小于MT 6752的6.4G/s 而且没 ...

  6. VPS性能综合测试(6):UnixBench跑分工具测试

    测试时间可能会比较长,请耐心等待.最后UnixBench会详细列出各个测试项目的得分情况,以及VPS性能的综合跑分结果 UinxBench 的使用 使用方法如下: Run [ -q | -v ] [- ...

  7. Azure 进阶攻略 | 电脑跑分你会,但虚拟机存储性能跑分的正确姿势你造吗?

    想学生时代,小编最爱做的就是研究电脑硬件,然后给自己.朋友和童鞋装机.装好后呢?当然要第一时间跑分了!各种跑分软件运行一遍,不断优化,不断测试.终于得到一个满意成绩,截图分享到网上显摆一下.当年为啥就 ...

  8. [转帖]疑似兆芯开先KX-7000跑分曝光:IPC性能大幅提升

    疑似兆芯开先KX-7000跑分曝光:IPC性能大幅提升 https://www.bilibili.com/read/cv4028300 数码 11-23 1589阅读28点赞22评论 尽管有ARM架构 ...

  9. AMD全新32核线程撕裂者GeekBench跑分曝光:超2950X近一倍

    AMD全新32核线程撕裂者GeekBench跑分曝光:超2950X近一倍 2019年09月01日 09:36 1109 次阅读 稿源:快科技 1 条评论 https://www.cnbeta.com/ ...

随机推荐

  1. Oracle-查询之函数

    DQL语句:查询语句用于查询表中数据DQL必须包含的两个部分:select 子句 和from 子句select子句:指定要查询的内容,可以指定表中的具体字段,*号,函数,或者表达式from子句:指定数 ...

  2. Redis架构之哨兵机制与集群

    Redis架构之哨兵机制与集群 哨兵机制 1.介绍: Sentinel(哨兵)是redis高可用性解决方案:由一个或多个由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个 ...

  3. 超实用在线工具!能将文字加密为Emoji表情

    试想一下,如果你需要将一段比较敏感的内容发送给你的好友. 但如果这段内容不小心外泄,被别人看到了,可能会带来很多麻烦. 那么,有什么方法能够让传输的文本内容不那么容易被"看破"呢? ...

  4. vue2和vue3的区别?

    vue2和vue3的主要区别在于以下几点: 1.生命周期函数钩子不同 2.数据双向绑定原理不同 3.定义变量和方法不同 4.指令和插槽的使用不同 5.API类型不同 6.是否支持碎片 7.父子组件之间 ...

  5. 第九十一篇:Vue 具名插槽作用域

    好家伙, 1.作用域插槽 插槽在定义的时候,可以定义一些属性,便于在父组件中使用 来看看代码: Article.vue组件中: <template> <div class=" ...

  6. Helm安装ingress-nginx-4.0.19

    Application version 1.1.3 Chart version 4.0.19 获取chart包 helm fetch ingress-nginx/ingress-nginx --ver ...

  7. 【长文详解】TypeScript、Babel、webpack以及IDE对TS的类型检查

    只要接触过ts的前端同学都能回答出ts是js超集,它具备静态类型分析,能够根据类型在静态代码的解析过程中对ts代码进行类型检查,从而在保证类型的一致性.那,现在让你对你的webpack项目(其实任意类 ...

  8. linux下搭建ftp文件服务器

    linux下搭建ftp文件服务器 一.搭建步骤(以在centos7中搭建为例) 1.首先检查一下系统中是否已经安装了vsftpd软件 # 查看是否安装vsftpd rpm -q vsftpd rpm ...

  9. 6、Arrays类

    Arrays类 Arrays里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索) 常用方法 toString 返回数组的字符串形式 Arrays.toString(arr) Integer[ ...

  10. logstash知识点

    Logstash是位于Data和Elasticsearch之间的一个中间件.Logstash是一个功能强大的工具,可与各种部署集成. 它提供了大量插件. 它从数据源实时地把数据进行采集,可帮助您解析, ...