AIR32F103(四) 27倍頻216MHz,CoreMark跑分測試

来源:https://www.cnblogs.com/milton/archive/2022/10/27/16830703.html
-Advertisement-
Play Games

合宙開發團隊10月11日的提交中開源了AIR32F103的PLL倍頻調節的代碼, 使得在 Linux 下通過 GCC Arm 工具鏈也能編譯運行216MHz. 示例中的 CoreMark_256MHz 項目, 可以將AIR32F103運行在最高256MHz主頻下, 運行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()這個函數的優化.

這個函數的源代碼如下, 可以看到其中會對特定地址(例如 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␊

總結

可以看到, GCC11.2和GCC11.3是一樣的, GCC12.2生成的二進位執行性能提升了接近8%, 但是性能最好的還是AC6, 比GCC12.2性能高了接近15%.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 回答: 我們為什麼要學習源碼? 1、知其然知其所以然 2、站在巨人的肩膀上,提高自己的編碼水平 3、應付面試 1.1 Spring源碼閱讀小技巧 1、類層次藏得太深,不要一個類一個類的去看,遇到方法該進就大膽的進 2、更不要一行一行的去看,看核心點,有些方法並不重要,不要跟它糾纏 3、看不懂的先不看 ...
  • 我國目前並未出台專門針對網路爬蟲技術的法律規範,但在司法實踐中,相關判決已屢見不鮮,K 哥特設了“K哥爬蟲普法”專欄,本欄目通過對真實案例的分析,旨在提高廣大爬蟲工程師的法律意識,知曉如何合法合規利用爬蟲技術,警鐘長鳴,做一個守法、護法、有原則的技術人員。 案情介紹 2018年10月,北京市公安局海 ...
  • Spring Boot 的定時任務: 第一種:把參數配置到.properties文件中: 代碼: package com.accord.task; import java.text.SimpleDateFormat; import java.util.Date; import org.springf ...
  • 在筆者上一篇文章`《驅動開發:內核監視LoadImage映像回調》`中`LyShark`簡單介紹瞭如何通過`PsSetLoadImageNotifyRoutine`函數註冊回調來`監視驅動`模塊的載入,註意我這裡用的是`監視`而不是`監控`之所以是監視而不是監控那是因為`PsSetLoadImage... ...
  • 最近新來的小老弟問我,按照公司規定,電腦只有十分鐘就鎖屏,但是他不想讓電腦在空閑十分鐘後鎖屏。 於是我問他,是不是想挑戰一下公司信息安全? 不過小老弟很機智,來了句公司信息安全大於天,他就是想讓自己多學點知識 ~ 既然他都這麼說了,我就勉為其難的教一下他吧! 電腦永不息屏的兩種方法 1、電腦手動方式 ...
  • asp.net新建一個服務端程式,用來處理鏈接服務端: 1,新建一個處理程式 .ashx using System; using System.Collections.Generic; using System.Linq; using System.Net.WebSockets; using Sys ...
  • 一:背景 1.講故事 前段時間有位朋友在微信上找到我,說他的程式偶發性崩潰,讓我幫忙看下怎麼回事,上面給的壓力比較大,對於這種偶發性崩潰,比較好的辦法就是利用 AEDebug 在程式崩潰的時候自動抽一管血出來,看看崩潰點是什麼,其實我的系列文章中,關於崩潰類的dump比較少,剛好補一篇上來,話不多說 ...
  • 各位好啊,我是會編程的蝸牛,作為java開發者,我們都是需要接觸Linux伺服器的,一般部署應用都是部署在Linux伺服器上的~ 但一般的伺服器要麼需要購買,要麼只是公司里的,那麼有沒有免費的Linux可以讓我們自己使用呢?答案是,有的。 我們可以在自己的電腦上安裝一個虛擬機,然後就可以在虛擬機裡面... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...