五、从0开始卷出一个新项目瑞萨RZN2L之RZT2L BaseProject coremark的移植

news2024/11/24 3:57:03

感谢来自b站热心帅气的同学分享的RZT2L移植经验总结的md文档
1 需要注意的小点
    1.1 使用Flash运行调试前,新板子需要erase
    1.2 在线debug,需要修改startup.c
2 coremark工程建立
    2.1 工程创建
    2.2 src 用户c代码移植
    2.3 debug调试
    2.4 修改printf 重定向
    2.5 修改编译等级
    2.6 修改 迭代次数
    2.7 修改ld文件和system.c
3 小结
    3.1 clock_t编译报错问题
    3.2 移植coremark的目的个人理解
    3.3 尝试FSP V1.30

五、从0开始卷出一个新项目瑞萨RZN2L之RZT2L BaseProject coremark的移植

参照【四、从0开始卷出一个新项目之瑞萨RZN2L软件基础工程构建】 https://www.bilibili.com/video/BV1cQ4y1p7of/?share_source=copy_web&vd_source=0b6b29722ed1b9adf9a9fa82857ec3a0

1 需要注意的小点

1.1 使用Flash运行调试前,新板子需要erase

图片

参照Getting Started with Flexible Software Package手册的附录,下载Jlink, 按着手册进行芯片擦除

1.2 在线debug,需要修改startup.c

参照Getting Started with Flexible Software Package手册的附录,在线debug,还需在starup.c添加 #if 1 // Software loops are only needed when debugging.的代码,如下图所示。

图片

FSP 版本1.2和1.3生成的starup.c有所区别

2 coremark工程建立

使用开发套件自带配件:Jlink-Ob debug调试:J19 State: open,typeC-usb 电脑供电,USB串口线
使用FSPV1.2进行工程配置

2.1 工程创建

可以看视频创建流程,大致差不多,稍微有一点区别,可以参照一下下面的图。

最小工程-闪灯程序--hello world !for 开发板

图片


RSK FOR RZT2L : 挂载xspi1

图片


选择 SPI1 x1 boot mode

图片


改成800M

图片


定时器配置

图片


串口配置

图片

2.2 src 用户c代码移植

把coremark和下面的hal_entry.c 代码复制到src文件下
hal_entry.c

/***********************************************************************************************************************

  • Copyright [2020-2022] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved.

  • This software and documentation are supplied by Renesas Electronics Corporation and/or its affiliates and may only

  • be used with products of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized.

  • Renesas products are sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for

  • the selection and use of Renesas products and Renesas assumes no liability. No license, express or implied, to any

  • intellectual property right is granted by Renesas. This software is protected under all applicable laws, including

  • copyright laws. Renesas reserves the right to change or discontinue this software and/or this documentation.

  • THE SOFTWARE AND DOCUMENTATION IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND

  • TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY,

  • INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE

  • SOFTWARE OR DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH.

  • TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR

  • DOCUMENTATION (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER,

  • INCLUDING, WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY

  • LOST PROFITS, OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE

  • POSSIBILITY OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS.
    **********************************************************************************************************************/

#include "hal_data.h"



void R_BSP_WarmStart(bsp_warm_start_event_t event) BSP_PLACE_IN_SECTION(".warm_start");

void user_copy_to_sram (void);

extern bsp_leds_t g_bsp_leds;

extern void atcm_user_init(void);
extern void coremain(void);//BSP_PLACE_IN_SECTION(".atcm");


///rzn2l may be not support segger rtt print, so exclude file SEGGER_RTT_V780c
#ifndef PRINTF
#define PRINTF
#endif
#ifdef PRINTF
#include <stdio.h>
/**
 * notice: g_uart0CB; g_uart0_ctrl
 *
 * e2s:
 * 1.uart0 callback:g_uart0CB
 * 2.FSP-BSP-heap size:0x400
 * 3.-u _printf_float
 * 4.other link void
 *
 * iar:
 * 1.uart0 callback:g_uart0CB
 * 2.FSP-BSP-heap size:0x400
 * 3.libray=full
 * 4.Semihosted=None
 *
 * keil:
 * 1.uart0 callback:g_uart0CB
 * 2.FSP-BSP-heap size:0x400
 */
volatile bool uart_send_complete_flag = false;
void g_uart0CB (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
}
#if defined __GNUC__ && !defined __clang__
int _write(int fd, char *pBuffer, int size); //??????
int _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;
}
#else
int fputc(int ch, FILE *f)
{
   (void)f;
   fsp_err_t err = R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
   if(FSP_SUCCESS != err) __asm("bkpt 0");
   while(uart_send_complete_flag == false);
   uart_send_complete_flag = false;

   return ch;
}
#endif//#if defined __GNUC__ && !defined __clang__
#endif//PRINTF

extern void func_atcm_bss_init (void);
///
/*******************************************************************************************************************//**
 * @brief  Blinky example application
 *
 * Blinks all leds at a rate of 1 second using the software delay function provided by the BSP.
 *
 **********************************************************************************************************************/
void hal_entry (void)
{
    //R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);

    /* Define the units to be used with the software delay function */
    const bsp_delay_units_t bsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS;

    /* Set the blink frequency (must be <= bsp_delay_units */
    const uint32_t freq_in_hz = 2;

    /* Calculate the delay in terms of bsp_delay_units */
    const uint32_t delay = bsp_delay_units / freq_in_hz;

    /* LED type structure */
    bsp_leds_t leds = g_bsp_leds;

    /* 中断使能 */
//    __enable_irq();
    __asm volatile ("cpsie i");
    //    __ASM volatile ("cpsie i" : : : "memory");

#ifdef PRINTF
    g_uart0.p_api->open(&g_uart0_ctrl, &g_uart0_cfg);

    g_uart0.p_api->write(&g_uart0_ctrl, "Renesas\n", strlen("Renesas\n"));
    while(!uart_send_complete_flag);
    uart_send_complete_flag = false;
    printf("date:%s\ntime:%s\nfile:%s\nfunc:%s,line:%d\nhello world!\n", __DATE__, __TIME__, __FILE__, __FUNCTION__, __LINE__);

    float PI = 3.1415926;
    printf("PI=%f\n", PI);
#endif//PRINTF


    R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
    R_GPT_Start(&g_timer0_ctrl);
    R_GPT_Enable(&g_timer0_ctrl);

    printf("start coremain!!!\r\n");

    /* If this board has no LEDs then trap here */
    if (0 == leds.led_count)
    {
        while (1)
        {
            ;                          // There are no LEDs on this board
        }
    }

    /* This code uses BSP IO functions to show how it is used.*/
    /* Turn off LEDs */
    for (uint32_t i = 0; i < leds.led_count; i++)
    {
        R_BSP_PinClear(BSP_IO_REGION_SAFE, (bsp_io_port_pin_t) leds.p_leds[i]);
    }

#if FSP_XSPI1_BOOT_SRAM_ATCM//only use fsp_xspi0_boot_SRAM_ATCM.ld
    //first, change FSP_XSPI0_BOOT_SRAM_ATCM in project property - symbol
    //second,change .ld in project property cross arm c linker - general
    atcm_user_init();

    printf("use fsp_xspi1_boot_SRAM_ATCM.ld!!!\r\n");
#else
    printf("use fsp_xspi1_boot.ld or use fsp_xspi1_boot_SRAM_MIRROR.ld!!!\r\n");
#endif

    coremain();

    //default 200Mhz,modify fsp-clock  CPUOCLK Mul:ICLKx1 -> CPUOCLK Mul:ICLKx2
    uint32_t freq_hz = R_FSP_SystemClockHzGet(FSP_PRIV_CLOCK_CPU0);
    printf("FSP_PRIV_CLOCK_CPU0=%ld\r\n", freq_hz);


    while (1)
    {
        printf("running!!!\r\n");
        for (uint32_t i = 0; i < leds.led_count; i++)
        {
          R_BSP_PinToggle(BSP_IO_REGION_SAFE, (bsp_io_port_pin_t) leds.p_leds[i]);
        }
        R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
    }

}



/*******************************************************************************************************************//**
 * This function is called at various points during the startup process.  This implementation uses the event that is
 * called right before main() to set up the pins.
 *
 * @param[in]  event    Where at in the start up process the code is currently at
 **********************************************************************************************************************/
void R_BSP_WarmStart (bsp_warm_start_event_t event)
{
    if (BSP_WARM_START_POST_C == event)
    {
        /* C runtime environment and system clocks are setup. */

        /* Configure pins. */
        R_IOPORT_Open(&g_ioport_ctrl, &g_bsp_pin_cfg);

    }
}

/*
 * g_timer0CB
 * rzn2l core R52 havenot systick, so init g_timer0 cnt
 */
extern volatile clock_t cnt;
void g_timer0CB(timer_callback_args_t *p_args)
{
    if (TIMER_EVENT_CYCLE_END == p_args->event)
    {
        cnt++;
    }
}

图片

但不知道这里clock_t就是说未定义??其实是有定义的,,,
该问题3.1节有提到

2.3 debug调试

startup.c line:380加入

>#if 1 // xpsi boot debug must software_loop+software_loop2.Software loops are only needed when debugging.
>     __asm volatile (
>         " mov r0, #0 \n"
>         " movw r1, #0xf07f \n"
>         " movt r1, #0x2fa \n"
>         "software_loop: \n"
>         " adds r0, #1 \n"
>         " cmp r0, r1 \n"
>         " bne software_loop \n"
>         ::: "memory");
>#endif

图片

2.4 修改printf 重定向

图片

2.5 修改编译等级

图片

2.6 修改 迭代次数

20000--->30000

图片

图片

2.7 修改ld文件和system.c

ld文件
SRAM首选和ATCM次选的baseproject

图片

图片

图片

system.c

图片

图片

图片

3 小结

非常感谢陈工的视频教程加上亲自的远程指导,废了很大的劲才能跑通,自己主要吃了没有文化的亏;其中还有一些细小问题未能解释,很多现象只能表述,还不能解释背后的原理,所以疑惑也较多;

3.1 clock_t编译报错问题

对于clock_t编译报错问题,选择下图的toolchain,可以解决,但为什么,很难解释。。从报错的提示看有提到toolchain 所以更换了。

图片

图片

3.2 移植coremark的目的个人理解

coremark文件夹的源码在atcm运行,其他源码都是sram运行
移植coremark并且SRAM首选和ATCM次选的baseproject的目的,是让coremark代码选择在ATM上快速运行,
对于我后续移植开发,如果需要要求执行速度快的代码,也需要和修改coremark的system.c一样去修改,其他的应用代码移植过来直接默认在SRAM上。这一块如何去学习到灵活自主的修改能力?目前对于ld文件、system.c文件理解不是很透彻,还是简单的搬运!!

3.3 尝试FSP V1.30

最开始尝试FSP V1.30 移植coremark,到2.4都是可以的,后续进行2.7ld文件、system.c的修改,首先版本差异导致这两个文件差异很大,其次修改后报了很多奇怪的错误,个人能力有限很难看懂。干脆改成FSP1.2了,希望有大佬能够搞定。我也学习下。

图片

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

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

相关文章

Java 基础学习(十五)集合排序、Lambda和Stream

1 集合排序 1.1 集合排序API 1.1.1 集合排序概述 集合排序是指对一个集合中的元素按照特定规则进行重新排列&#xff0c;以使得集合中的元素按照预定义的顺序呈现。 在集合排序中&#xff0c;通常需要定义一个比较规则&#xff0c;这个比较规则用于决定集合中的元素在排序后…

cpp笔记2

this 友元 友元的目的就是让一个函数或者类 访问另一个类中私有成员 全局函数做友元 friend void goodGay(Building * building);类做友元 friend class goodGay;成员函数做友元 //告诉编译器 goodGay类中的visit成员函数 是Building好朋友&#xff0c;可以访问私有内容fr…

【2023CANN训练营第二季】——Ascend C代码实操分享

1.实操题目&#xff1a; 使用Ascend C实现Addcdiv算子 参考pytorch的Addcdiv算子&#xff0c;实现Ascend C算子Addcdiv,算子命名为AddcdivCustom相关算法:out x y/z*value 要求: 1、完成Kernel侧实现代码和host侧调用算子代码&#xff0c;支持fp16类型输入 2、完成AcInn方式调…

Centos 8.5 Oracle12c安装

由于多次安装踩坑&#xff0c;所以本次写了一份12c安装的完整版。可以直接使用。 一、安装数据库基本信息 名称 值 主机名 database 操作系统 CentOS Linux release 8.5.2111 Oracle用户名/密码 oracle Oracle 版本 12c Enterprise Edition Release 12.2.0.1.0 oracle…

【解决Typora图片不是显示问题】PicGo+Github+Typora+ onedrive/坚果云 实现笔记同步

【解决Typora图片不是显示问题】PicGo、Github、Typora实现笔记同步 写在前面&#xff1a; typora笔记软件使用记录typora图片上传问题&#xff1a;原因分析&#xff1a;解决方案&#xff1a;PicGoGithubTypora 坚果云/onedrive 实现笔记同步第一步. 设置上传模式&#xff1a;u…

解析Spring确定构造方法的过程

解析Spring确定构造方法的过程 文章目录 解析Spring确定构造方法的过程前言一、三个普通构造函数解析过程二、加Autowired 和 只有一个有参构造函数解析过程总结 前言 每次都是从关键代码进行定位解析&#xff0c;希望大家对Spring源码有一定的了解再看&#xff0c;本篇主要解…

IP子网划分【专题突破】

1、IP地址基础 IPv4地址是32位&#xff0c;采用点分十进制方式表示&#xff0c;其次必须掌握二进制的转换。 IPv6地址是128位&#xff0c;采用冒号分隔的十六进制表示方法。 2、IP地址的分类 RFC1918规定的私有地址 A类地址范围&#xff1a;10.0.0.0-10.255.255.255(1个A类…

在idea中不经意把模块remove moudle后在delete删除了怎么办

删除模块 我先演示一遍删除操作&#xff0c;看看您是不是这样误删的。 这时候模块已经被删除了 恢复模块 接下来进行恢复 File → Local_History → Show_History 打开历史记录 通过时间线或者找到要恢复的文件一步一步查找&#xff0c;找到要恢复的位置即可 以下位…

【python】进阶--->网络编程(一)

一、网络编程 网络 : 为了联络多方然后进行通信,将数据从一方传递给另一方. 网络协议 : 不同计算机只需要通过联网,那么就可以相互进行传递数据,那么不同种类的计算机之间就和不同语言的人之间沟通一样,需要一种大家都认可都遵循的协议即可. 那么计算机都遵循的网络通信协议叫…

二维码智慧门牌管理系统升级的重要性与功能

文章目录 前言一、系统的双重作用二、系统的挑战与未来发展三、结论与未来展望四、为未来智慧管理铺平道路 前言 随着科技不断进步&#xff0c;智能化管理已贯穿于我们日常生活的各个领域。其中&#xff0c;二维码智慧门牌管理系统升级解决方案因其独特的考核评估系统和实用功…

鸿蒙、ChatGPT 入选全球十大工程成就丨 RTE 开发者日报 Vol.111

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

2023.12.18 关于 CentOS7 安装 Redis5

目录 安装步骤 创建符号连接 修改配置文件 启动 redis 服务器 停止 redis 服务器 安装步骤 CentOS7 的 yum 仓库中&#xff0c;redis 的默认版本为 3 系列为了 能让 CentOS7 安装上 Redis5&#xff0c;此处我们需要安装额外软件源 1、安装额外软件源 yum install cento…

Python与Flink的完美融合:合流基本操作解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Apache Flink 是一个流式处理框架&#xff0c;支持复杂事件处理和大规模数据分析。在 Flink 中&#xff0c;合流&#xff08;Join&#xff09;是一种常见的操作&#xff0c;用于将两个或多个流中的数据按照指定条…

vue 点击添加多个input且与v-model绑定

<template><div><tr v-for"(item, index) in formArr" :key"index"><td><el-input v-model"item.value1" placeholder"请输入" /></td><td><el-input v-model"item.value2" p…

【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)-简化升级版

文章目录 前言正文一、项目简介二、核心代码2.1 pom.xml 依赖配置2.2 ExcelHeadMapFactory2.3 ExcelDataLinkedHashMap2.4 自定义注解 ExcelExportBean2.5 自定义注解 ExcelColumnTitle2.6 建造器接口 Builder2.7 表格工具类 ExcelUtils2.8 GsonUtil2.9 模版类 ExportDynamicCo…

金蝶云星空业务对象标识是否可以修改

文章目录 金蝶云星空业务对象标识是否可以修改业务背景说明根本原因开发规范终极临时解决方案 金蝶云星空业务对象标识是否可以修改 业务背景 开发人员不注意&#xff0c;新建业务对象或者直接扩展标准产品的业务对象就直接操作保存&#xff0c;然后再次打开界面发现标识已经…

数字生态文明:构建可持续发展的未来

数字技术的快速发展给人类社会带来了巨大的变革,同时也对生态环境产生了深远的影响。在这个背景下,数字生态文明的概念应运而生,它强调在数字时代实现经济、社会和环境的协调发展,构建可持续的未来。 一、数字生态文明的内涵 数字生态文明是指在数字经济发展过程中,遵循…

【数据库】函数依赖

什么是函数依赖 就是在具体的表中/问题中&#xff0c;哪个属性决定另外几个属性。 A属性值相同的时候&#xff0c;能否决定唯一的B U {学号&#xff0c;姓名&#xff0c;年龄&#xff0c;班号&#xff0c;班长&#xff0c;课号&#xff0c;成绩} 就有&#xff1a; ‘学号’ 决…

vxe-table 修改[表尾数据]footer的高度

下面展示一些 内联代码片。 <style> .vxe-table--render-default.size--small .vxe-footer--column.col--ellipsis {height: 20px; } </style>

ElementUI中修改el-table的滚动条样式

注意&#xff1a;本文仅基于webkit引擎浏览器&#xff1b; 如果是火狐浏览器&#xff0c;则是-moz-&#xff1b; 部分webkit引擎浏览器&#xff1a;Google Chrome谷歌浏览器、Safari浏览器、搜狗高速浏览器、QQ浏览器、360极速浏览器等… 当内容超出容器时会出现滚动条&#…