十二、从0开始卷出一个新项目之瑞萨RZN2L 基于IAR coremark fsp200工程构建和iar icf链接文件修改方法

news2024/12/22 9:34:57

目录

一、概述

二、rzn2l_fsp2.0.0_coremark工程构建

2.1 目录结构

2.2 项目一览

2.3 iar工程打开报错如何处理

三、代码优化的问题

3.1 system.c中复制内存

3.2 iar代码优化等级与volatile关键字

3.3 iar配置优化单个文件与预编译宏的范围

四、iar .icf链接文件修改方法

4.1 .icf文件的构成

4.1.1 包含另一个icf文件

4.1.2 符号/变量symbol

4.1.3 region 定义内存区域

4.1.4 定义段到内存的映射

4.1.5 initialize

4.2 .icf文件的重要语法

4.3 ram执行:fsp_ram_execution.icf

4.4 flash启动:fsp_xspi0_boot.icf

4.5 app全部运行在sram:fsp_xspi0_boot_sram_all.icf

4.6 仅text使用sram:fsp_xspi0_boot_sram_text.icf

4.7 优先使用sram特殊使用atcm:fsp_xspi0_boot_sram_atcm.icf

4.8 参考separating-loader-and-application

4.9 总结

五、测试结果


一、概述

  • 在十一、从0开始卷出一个新项目之瑞萨RZN2L介绍过GCC编译器的工程构建

  • 基于IAR的coremark fsp200工程构建和iar .icf链接文件的修改方法

  • 介绍基于IAR的工程构建过程碰到的一些问题(弄了很久)

  • 借此重点介绍iar .icf文件的几种修改方法(为什么要修改优化等级和链接文件:嵌入式科普(22)c代码究竟是如何一步步运行的之链接)

二、rzn2l_fsp2.0.0_coremark工程构建

2.1 目录结构

详见十一、从0开始卷出一个新项目之瑞萨RZN2L

2.2 项目一览

2.3 iar工程打开报错如何处理

  • iar版本不向下兼容,iar9.40.1

  • build action中2个cmd可以取消

    图片

  • 升级rzsc

  • 上传临时文件夹,rzsc重新生成代码和配置

三、代码优化的问题

3.1 system.c中复制内存

问题:内存复制相关代码被优化,导致无法初始化

  • iar不支持gcc的“范围单独优化”:

#pragma GCC optimize ("O1")
#pragma GCC reset_options
  • iar只支持“单独优化函数”或通过配置优化单个文件

#pragma optimize=low

深入浅出编译优化选项(上):https://www.iar.com/zh/knowledge/learn/programming/compiler-optimization-1

图片

3.2 iar代码优化等级与volatile关键字

问题:printf重定向的串口发送标志位,iar9.40.1错误的优化,volatile无效

  • IAR:

volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
}
void IoPutchar (int32_t buffer)
{
      R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t*) &buffer, TRANSFER_LENGTH);
      while (!g_transfer_complete)
      {
      }
      g_transfer_complete = 0;
}

图片

  • GCC:

volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
}

_write(int fd, char *pBuffer, int size)
{
    (void)fd;
    fsp_err_t err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
    if(FSP_SUCCESS != err) __BKPT();

    while(uart_send_complete_flag == false);
    uart_send_complete_flag = false;
    
    return size;
}

图片

  • iar9.40.1测试cubemx生成的103c8t6正常

3.3 iar配置优化单个文件与预编译宏的范围

需要单独优化的文件,需要预编译宏控制的文件,是同一个文件。那么预编译宏也要单独定义

图片

四、iar .icf链接文件修改方法

iar icf与gcc ld文件对比:
    语法较为复杂,整体逻辑不清晰;
    不能自动递增地址,需要手动设置各个内存地址;
    只支持文件的通配符,不支持文件夹目录的通配符;
    工具生成的icf文件中符号命名不便于理解

4.1 .icf文件的构成

4.1.1 包含另一个icf文件

例如:
    include "memory_regions.icf"

4.1.2 符号/变量symbol

例如:
define symbol SYSTEM_RAM_END_OFFSET        = 0x00048000;
define symbol FLASH_ADDRESS                = xSPI0_CS0_SPACE_PRV_START;

4.1.3 region 定义内存区域

例如:
define region ATCM_region              = mem:[from __region_ATCM_start__  to __region_ATCM_end__ ];
define region BTCM_region              = mem:[from __region_BTCM_start__  to __region_BTCM_end__ ];

4.1.4 定义段到内存的映射

例如:
place in ROM_region   { block USER_PRG_RBLOCK, readonly };
place in S_RAM_region { block USER_DATA_RBLOCK, block USER_DATA_NONCACHE_RBLOCK };

define block USER_PRG_RBLOCK with alignment = 4 { ro code };
define block USER_PRG_WBLOCK with alignment = 4 { rw code };
define block USER_DATA_ZBLOCK with alignment = 4 { section .bss };

4.1.5 initialize

initialize manually

do not initialize

4.2 .icf文件的重要语法

嵌入式科普(22)c代码究竟是如何一步步运行的之链接---4.2 IAR .icf

4.3 ram执行:fsp_ram_execution.icf

  • fsp-BSP-Board-(RAM execution without flash memory)

  • 未下载到flash,掉电/复位无法继续执行;boot+app

  • btcm(loader&stack)+atcm(text&data&stack&heap)

4.4 flash启动:fsp_xspi0_boot.icf

  • fsp-BSP-Board-(xSPI0 x1 boot mode)

  • 下载到flash,掉电/复位可执行,需等待写flash

  • btcm(loader&stack)+atcm(text&data&stack&heap)

4.5 app全部运行在sram:fsp_xspi0_boot_sram_all.icf

  • fsp-BSP-Board-(xSPI0 x1 boot mode)

  • 下载到flash,掉电/复位可执行,需等待写flash

  • btcm(loader&stack)+sram(text&data&stack&heap)

  • dma、usb等需要注意处理,使用nocache

4.6 仅text使用sram:fsp_xspi0_boot_sram_text.icf

  • fsp-BSP-Board-(xSPI0 x1 boot mode)

  • 下载到flash,掉电/复位可执行,需等待写flash

  • btcm(loader&stack)+sram(text)+atcm(data、stack、heap)

4.7 优先使用sram特殊使用atcm:fsp_xspi0_boot_sram_atcm.icf

  • fsp-BSP-Board-(xSPI0 x1 boot mode)

  • 下载到flash,掉电/复位可执行,需等待写flash

  • btcm(loader&stack)+sram(优先使用-text&data&stack&heap)+atcm(*/coremark文件夹-text&data)

  • 不改变原有分区结构,只增加单独文件夹使用atcm

  • 需要修改system.c,增加复制过程。通过宏控制FSP_XSPI0_BOOT_SRAM_ATCM

4.8 参考separating-loader-and-application

4.9 总结

\rzn2l_coremark_fsp200_iar\script\readme.txt

block PRG_RBLOCK ro code
block PRG_WBLOCK rw code

block DATA_ZBLOCK bss
block DATA_RBLOCK data
block DATA_WBLOCK data_init

initialize manually
do not initialize

五、测试结果

hello word!
date:Jul  9 2024
time:10:12:22
file:C:\Users\jerry.chen\RASmartConfigurator\rzn2l_coremark_fsp200_iar\src\hal_entry.c
func:hal_entry,line:37
hello world!
PI=3.141593
check script ld first!!!
start coremain!!!

[10:16:25.284]收←◆2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 18050
Total time (secs): 18.050000
Iterations/Sec   : 1108.033241
Iterations       : 20000
Compiler version : Please put compiler version here (e.g. gcc 4.1)
Compiler flags   : Please put compiler flags here (e.g. -o3)
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x382f
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 1108.033241 / Please put compiler version here (e.g. gcc 4.1) Please put compiler flags here (e.g. -o3) / STACK
FSP_PRIV_CLOCK_CPU0=400000000
running!!!

[10:20:18.593]收←◆hello word!
date:Jul  9 2024
time:10:17:53
file:C:\Users\jerry.chen\RASmartConfigurator\rzn2l_coremark_fsp200_iar\src\hal_entry.c
func:hal_entry,line:37
hello world!
PI=3.141593
check script ld first!!!
start coremain!!!

[10:20:45.072]收←◆2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 26459
Total time (secs): 26.459000
Iterations/Sec   : 755.886466
Iterations       : 20000
Compiler version : Please put compiler version here (e.g. gcc 4.1)
Compiler flags   : Please put compiler flags here (e.g. -o3)
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x382f
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 755.886466 / Please put compiler version here (e.g. gcc 4.1) Please put compiler flags here (e.g. -o3) / STACK
FSP_PRIV_CLOCK_CPU0=400000000
running!!!

[10:23:06.511]收←◆hello word!
date:Jul  9 2024
time:10:21:49
file:C:\Users\jerry.chen\RASmartConfigurator\rzn2l_coremark_fsp200_iar\src\hal_entry.c
func:hal_entry,line:37
hello world!
PI=3.141593
check script ld first!!!
start coremain!!!

[10:23:40.199]收←◆2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 33667
Total time (secs): 33.667000
Iterations/Sec   : 594.053524
Iterations       : 20000
Compiler version : Please put compiler version here (e.g. gcc 4.1)
Compiler flags   : Please put compiler flags here (e.g. -o3)
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x382f
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 594.053524 / Please put compiler version here (e.g. gcc 4.1) Please put compiler flags here (e.g. -o3) / STACK
FSP_PRIV_CLOCK_CPU0=400000000
running!!!


图片

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

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

相关文章

内容与资讯API优质清单

作为开发者,拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源,为你的开发工作提供了强大的支持!无论你是在构建网站、开发应用还是进行数据分析,这个合集都能满足你的需求。你可以通过这些免费API获…

线程知识总结(二)

本篇文章以线程同步的相关内容为主。线程的同步机制主要用来解决线程安全问题,主要方式有同步代码块、同步方法等。首先来了解何为线程安全问题。 1、线程安全问题 卖票示例,4 个窗口卖 100 张票: class Ticket implements Runnable {priv…

多智能体/多机器人网络中的图论法

一、引言 1、网络科学至今受到广泛关注的原因: (1)大量的学科(尤其生物及材料科学)需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解; (2)科技的发展促进了综合网…

OB删除1.5亿数据耗费2小时

目录 回顾:mysql是怎么删除数据的? 删除方案 代码实现 执行结果 结论 本篇是实际操作 批量处理数据以及线程池线程数设置 记录学习 背景:有一张用户标签表,存储数据量达4个亿,使用OceanBase存储,由于…

简洁IIC协议讲述

目录 一:首先,IIC传输是在2条线上传输的。 二:时钟信号的频率和占空比解释(可以看作PWM波形) 三:传输信号的流程图(起始和终止信号都是由主机(我)控制) 四:开始信号和…

IIC I2C子协议 SMBus协议 通信协议原理 时序 SMBus深度剖析

引言:系统管理总线(SMBus)是一种双线接口,通过该接口,各种系统组件芯片和设备可以相互以及与系统其他部分通信。它基于IC总线的操作原理。附录B提供了一些SMBus特性与IC总线不同的方式的描述。 SMBus为系统和电源管理相…

重拾设计模式--建造者模式

文章目录 建造者模式(Builder Pattern)概述建造者模式UML图作用:建造者模式的结构产品(Product):抽象建造者(Builder):具体建造者(Concrete Builder&#xff…

Orleans异常传递测试

Orleans具备非常简单的异常传递机制,Grain或Placement注解逻辑抛异常,可以直接传递到客户端,测试代码如下: 首先在客户端、Silo服务程序的Main方法增加ThreadException事件处理函数,避免未处理异常导致进程闪退。 sta…

【Linux进程】基于管道实现进程池

目录 前言 1. 进程池 1.1 基本结构: 1.2. 池化技术 1.3. 思路分析 1.4. 代码实现 总结 前言 上篇文章介绍了管道及其使用,本文在管道的基础上,通过匿名管道来实现一个进程池; 1. 进程池 父进程创建一组子进程,子进…

PCL点云库入门——PCL库中点云数据拓扑关系之K-D树(KDtree)

1、点云的拓扑邻域 在三维空间数据处理的领域中,点云的邻域概念显得尤为关键,它不仅链接了点云数据之间的拓扑结构,而且在构建点云间的拓扑关系时起到了桥梁的作用。这种关系的建立,使得我们能够以一种高效、迅速的方式管理庞大的…

Leecode刷题C语言之根据第k场考试的分数排序

执行结果:通过 执行用时和内存消耗如下: int gk 0;int compare(const void* a, const void* b) {int* ua *(int**)a;int* ub *(int**)b;return ub[gk] - ua[gk]; }int** sortTheStudents(int** score, int scoreSize, int* scoreColSize, int k, int* returnSiz…

由popover框一起的操作demo问题

场景: 当popover框弹出的时候,又有MessageBox 提示,此时关闭MessageBox 提示,popover就关闭了。将popover改为手动激活,可以解决这个问题,但是会引起另外一个问题,之前(click触发的时…

QT修改运行窗口的图标

首先,在.pro下添加两行: Debug:DESTDIR $$PWD Release:DESTDIR $$PWD 指定目标文件的路径 指定生成的debug和release文件夹路径在当前项目下 上面是为了防止爆奇怪的错 右键项目添加新文件 选择QT-》QT Resource File 起个名,然后下一步…

降低Mobx技术债问题-React前端数据流方案调研整理

我们现在主要是使用Mobx,但是Mobx的易于上手和灵活度也带来了很多预期以外的问题,随着项目的增长我们的代码技术债变得愈加沉重,不同的模块杂糅一起、单一store无限膨胀。 为此我们的调研是希望能找到一个更好的state配置、数据流的约定方案。…

sql server索引优化语句

第一步 建一个测试表 --create table TestUsers --( -- Id int primary key identity(1,1), -- Username varchar(30) not null, -- Password varchar(10) not null, -- CreateDateTime datetime not null --)第二步 插入100w数据 大概1分钟执行时间 ----插入数据…

aioice里面candidate固定UDP端口测试

环境: aioice0.9.0 问题描述: aioice里面candidate固定UDP端口测试 解决方案: /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…

Java(二十五)final关键字

Java中的final关键字在编写程序中,比较常用。尤其是在上文中的匿名内部类中。 final 表示最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思。 使用final修饰的的类,是“断子绝孙”的。 一:final修饰成员变量 Final修饰的类的成员变量是常量,不可被改变。 …

MySQL三大日志-Redo Log

Redo Log简介 事务中修改的任何数据,将最新的数据备份存储的位置(Redo Log),被称为重做日志。 Redo Log 的生成和释放 随着事务操作的执行,就会生成Redo Log,在事务提交时会将产生Redo Log写入Log Buff…

【libuv】Fargo信令2:【深入】client为什么收不到服务端响应的ack消息

客户端处理server的ack回复,判断链接连接建立 【Fargo】28:字节序列【libuv】Fargo信令1:client发connect消息给到server客户端启动后理解监听read消息 但是,这个代码似乎没有触发ack消息的接收: // 客户端初始化 void start_client(uv_loop_t

html中实用标签dl dt dd(有些小众的标签 但是很好用)

背景描述 html <dl> <dt> <dd>是一组合标签&#xff0c;他们与ol li、ul li标签很相似 但是他却是没有默认前缀并且有缩进的标签 使用方式与table表格的标签一致 使用方式 dt和dd是放于dl标签内&#xff0c;dt与dd处于dl下相同级。就是dt不能放入dd内&am…