【GD32F427开发板试用】移植CoreMark验证0等待区Flash大小

news2024/11/15 4:25:12

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Doravmon

引言

非常荣幸能够参与到此次GD32F427开发板试用的活动中来,在拿到开发板之前就翻了翻手册,一直有个疑问困惑着我。

  • 在GD32F4xx用户手册中,描述了零等待区域最大支持1024KB

  • 在GD32F427xx数据手册中,描述了Flash的Code area只有512KB

根据经验来看,GD32的Code area应该就是零等待区,GD32F427的零等待区可能只有512KB,用户手册是针对整个F4系列的,1024KB零等待区是其他型号。
为了验证上面的想法,计划将CoreMark代码分别固定到0512KB和512KB1024KB的Flash区间内,根据在不同区间的CoreMark跑分来确定此款开发板上搭载的GD32F427VK芯片的零等待区大小。

开发环境

  • IDE:Keil v5.36.0.0
  • 编译器:ARMCC v5.06 update 7
  • 参考工程:官方GD32F4xx_Demo_Suites_V2.6.1中的LED工程
  • CoreMark源码:从RT-Thread的组件中下载

验证猜想

焊接IO

由于需要使用串口打印CoreMark跑分,首先需要将芯片串口接出。开发板上用GD32F103实现的CMSIS-DAP调试器貌似没有CDC功能,只能将芯片串口外接USB转TTL电平串口了。但此款开发板两侧引出的IO出厂时没有焊接的,需要自己找排针来焊接(#.#)

串口实现printf

将开发板PB6和PB7复用为串口1,代码如下

#define COMn                             1U
#define START_COM0                        USART0
#define START_COM0_CLK                    RCU_USART0

#define START_COM0_TX_PIN                 GPIO_PIN_6
#define START_COM0_RX_PIN                 GPIO_PIN_7

#define START_COM0_GPIO_PORT              GPIOB
#define START_COM0_GPIO_CLK               RCU_GPIOB
#define START_COM0_AF                     GPIO_AF_7

/* configure COM port */
void gd_start_com_init(uint32_t com);

static rcu_periph_enum COM_CLK[COMn] = {START_COM0_CLK};
static uint32_t COM_TX_PIN[COMn] = {START_COM0_TX_PIN};
static uint32_t COM_RX_PIN[COMn] = {START_COM0_RX_PIN};

/*!
    \brief    configure COM port
    \param[in]  COM: COM on the board
      \arg        START_COM0: COM on the board
    \param[out] none
    \retval     none
*/
void gd_eval_com_init(uint32_t com)
{
    /* enable GPIO clock */
    uint32_t COM_ID = 0;
    if(START_COM0 == com)
    {
        COM_ID = 0U;
    }

    rcu_periph_clock_enable( START_COM0_GPIO_CLK);

    /* enable USART clock */
    rcu_periph_clock_enable(COM_CLK[COM_ID]);

    /* connect port to USARTx_Tx */
    gpio_af_set(START_COM0_GPIO_PORT, START_COM0_AF, COM_TX_PIN[COM_ID]);

    /* connect port to USARTx_Rx */
    gpio_af_set(START_COM0_GPIO_PORT, START_COM0_AF, COM_RX_PIN[COM_ID]);

    /* configure USART Tx as alternate function push-pull */
    gpio_mode_set(START_COM0_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_TX_PIN[COM_ID]);
    gpio_output_options_set(START_COM0_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_TX_PIN[COM_ID]);

    /* configure USART Rx as alternate function push-pull */
    gpio_mode_set(START_COM0_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_RX_PIN[COM_ID]);
    gpio_output_options_set(START_COM0_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_RX_PIN[COM_ID]);

    /* USART configure */
    usart_deinit(com);
    usart_baudrate_set(com,115200U);
    usart_receive_config(com, USART_RECEIVE_ENABLE);
    usart_transmit_config(com, USART_TRANSMIT_ENABLE);
    usart_enable(com);
}

printf重定向代码

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(START_COM0, (uint8_t)ch);
    while(RESET == usart_flag_get(START_COM0, USART_FLAG_TBE));
    return ch;
}

移植CoreMark

CoreMark代码移植的部分已经有大佬写过了,而且我这里移植CoreMark的目的只是为了对比程序放到不同的Flash地址对性能的影响,因此不再赘述。
移植完后,整体程序也只有几十KB,没有超过512KB,必定是在零等待区的,跑分情况如下:

Benchmark started, please make sure it runs for at least 10s.

2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 11491
Total time (secs): 11.490
Iterations/Sec   : 522.147
Iterations       : 6000
Compiler version : ARMCC V5.06
Compiler flags   : -O3 -Otime
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xa14c
Correct operation validated. See README.md for run and reporting rules.
Iterations/Sec   : 522.147
CoreMark 1.0 : 2.610 DMIPS/MHz / ARMCC V5.06 -O3 -Otime / STACK

这里主要讲一下如何将CoreMark代码定位到Flash的不同地址。

可以看到,CoreMark代码文件都是以core_开头的,那其编译出的.o文件也是以此命名。在Keil中使用scatter分散加载文件来定位程序在Flash中的位置,修改scatter文件,将CoreMark代码定位到Flash的512KB位置

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }

  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_COREMARK 0x08080000 0x00010000  {    ; load region size_region
  ER_COREMARK 0x08080000 0x00010000  {
   core_*.o
  }
}

再次跑分,肉眼可见分数极低。也就验证了一开始的猜想,此款开发板上搭载的GD32F427VK芯片的零等待区就只有512KB大小。

Benchmark started, please make sure it runs for at least 10s.

2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 44315
Total time (secs): 44.314
Iterations/Sec   : 135.394
Iterations       : 6000
Compiler version : ARMCC V5.06
Compiler flags   : -O3 -Otime
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xa14c
Correct operation validated. See README.md for run and reporting rules.
Iterations/Sec   : 135.394
CoreMark 1.0 : 0.676 DMIPS/MHz / ARMCC V5.06 -O3 -Otime / STACK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APM/STM32F072RB基于HAL库配置USB CDC虚拟串口功能

APM/STM32F072RB基于HAL库配置USB CDC虚拟串口功能📢采用的自制开发板,开源PCB工程详情放在《极海APM32F072RB开发环境测试》✨本案例基于STM32CubeMX工具配置。📺使用STM32CubeMX工具配置工程改为APMF072RB型号过程如下: ⛳注意…

性能测试实战 | 电商业务的性能测试(一): 必备基础知识

本文为霍格沃兹测试学院优秀学员课程学习系列笔记,想一起系统进阶的同学文末加群交流。 1.1 测试步骤总览 需求分析与测试设计(性能需求目标业务模型拆解) 测试数据准备和构造(基于模型的数据准备) 性能指标预期(性能需求目标) 发压工具配…

vue2 使用@vue/composition-api依赖包 编译、打包各种报错

vue2 使用vue/composition-api依赖包 编译、打包各种报错问题来源解决办法最近在维护以前(大概一年前)的项目时,遇到个这种问题: 项目本身是用 vue-cli 创建的 vue 2.x.xx 版本的项目,然后引入 vue/composition-api 依…

MIT6.830-2022-lab5实验思路详细讲解

文章目录前言一、实验背景二、实验正文Exercise 1 :SearchExercise 2 :Insert - Splitting PagesExercise 3 :Delete - Redistributing pagesExercise 4:Delete - Redistributing pages总结前言 Datebase中很重要的一部分就是ind…

【Java面试】SpringBoot篇

注:本文通篇将SpringBoot以sb代替。 文章目录Spring和SpringBoot的关系和区别?谈谈你对SpringBoot的理解,它有哪些特性?SpringBoot的核心注解说说你对SpringBoot自动配置的理解为什么SpringBoot的jar包可以直接运行?Sp…

uboot启动流程分析(基于i.m6ull)

一、uboot的makefile 1.1 makefile整体解析过程 为了生成u-boot.bin这个文件,首先要生成构成u-boot.bin的各个库文件、目标文件。为了各个库文件、目标文件就必须进入各个子目录执行其中的Makefile。由此,确定了整个编译的命令和顺序。 1.2 makefile整…

10.2 初始泛型算法

文章目录只读算法find()count()accumulate()equal()写容器元素算法fill()fill_n()back_inserter()copy()copy_backward()replace()replace_copy()next_permutation()prev_permutation()重排容器元素算法sort()unique()stable_sort()除了少数例外,标准库算法都对一个…

pandas数据聚合与分组运算

文章目录数据聚合与分组运算分组与聚合的原理通过groupby()方法将数据拆分成组按列名进行分组按Series对象进行分组按字典进行分组按函数进行分组数据聚合与分组运算 对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分…

哈佛结构和冯诺依曼结构?STM32属于哈佛结构还是冯诺依曼结构?

现代的CPU基本上归为冯诺伊曼结构(也成普林斯顿结构)和哈佛结构。 冯诺依曼体系 冯诺依曼体系结构图如下 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数据与指令都存储在同一存储区中&…

大数据技术架构(组件)5——Hive:流程剖析2

1.1.2、Stage division(不够细致,需要例子)Stage理解:结合对前面讲到的Hive对查询的一系列执行流程的理解,那么在一个查询任务中会有一个或者多个Stage.每个Stage之间可能存在依赖关系。没有依赖关系的Stage可以并行执…

IIS部署应用程序连接 LocalDB 数据库

使用.net core框架创建ASP.NET Core API应用程序,利用Entity Framework core实体进行MS LocalDB数据库进行连接操作(增/删/改/查运行)。 问题: 在Visual Studio 2022 开发工具可以正常运行 Web API 应用程序连接 LocalDB 数据库…

R语言基于poLCA包进行潜类别分析

潜在类别分析是一种分析多元分类数据的统计技术。当观测数据以一系列分类响应的形式出现时- -例如,在民意调查、个人层面的投票数据、人与人之间可靠性的研究或消费者行为和决策中- -通常感兴趣的是调查观测变量之间的混淆来源,识别和表征相似案例的集群…

初步了解高性能队列——Disruptor(Java)

高性能队列——Disruptor ① 概述 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后&#xff0c…

DevOps利器之二(Git,Gitlab)

一、背景Git,Gitlab在DevOps中主要解决持续集成源码管控部分,本文主要从基本概念,实施部署两部分介绍。二、git概述https://git-scm.com/book/zh/v2 --推荐官方电子书 Git - 它是一个源代码分布式版本控制系统,可让开发人员在本地…

行业分享:锂电池4大生产难题,视觉检测即可有效解决

导语:机器视觉检测已在锂电池生产的各个环节中,为产品产量与质量提供可靠保障。维视智造作为锂电池视觉检测系统提供商,为企业提供专业、系统、稳定的锂电行业解决方案,可保证0漏检,确保安全生产,全面提升生…

Java总结(运算符)

1.算数运算符short s12;s1s12; (编译不能运行)short s12;s1 2 ; (编译能运行,不改变变量本身的数据类型)2.逻辑运算符区分&和&&相同点:运算结果相同;当符号左边是true时,两者都会执行符号右边的运算不同点…

医疗数据安全实力派 | 美创科技品牌案例入选《2022年医疗行业网络安全报告》

近日,网络安全产业机构“数说安全”正式发布《2022年医疗行业网络安全报告》(以下简称“报告”)。报告对我国医疗行业信息化现状和政策、医疗行业市场发展、医疗行业需求侧及供给侧进行深度剖析。美创科技作为专业数据安全代表厂商入选医疗网…

你应该知道的机器学习模型部署细节和实施步骤

机器学习操作 (MLOps,Machine Learning Operations ) 是“机器学习”和“工程”的组合,涵盖了与生产 ML 生命周期管理有关的所有内容。 ML模型生命周期可大致分为三个阶段 文章目录技术交流设计模型开发操作步骤1:确定部署环境命令行终端Cond…

Arduino开发ESP8266网页服务器控制LED灯

根据板卡原理RGB三色LED对应引脚&#xff1a;int LEDR12、int LEDG14、int LEDB13;设置串口波特率为115200Serial.begin(115200);源代码如下所示&#xff1a;3.1添加头文件#include <ESP8266WiFi.h> // 提供 Wi-Fi 功能的库#include <ESP8266WebServer.h> // 提供网…

Solidity 中的数学(第 3 部分:百分比和比例)

本文是关于在 Solidity 中进行数学运算的系列文章中的第三篇 。 这次的主题是&#xff1a;百分比和比例。 介绍 金融数学从百分比开始。y的x百分比是多少&#xff1f;y占x的多少百分比&#xff1f;我们都知道答案&#xff1a;y的x百分比是x y 100&#xff0c;y是y 10…