瑞萨RA-T系列芯片马达类工程TCM加速化设置

本篇介绍在使用RA8-T系列芯片,建立马达类工程应用时,如何将电流环部分的指令和变量设置到TCM单元,以提高电流环执行速度,从而提高系统整体的运行性能,在伺服和高端工业领域有很高的实用价值。本文以RA8T1为范例,亦可推广到具备TCM功能的RA8-T系列其他芯片和相关领域。


瑞萨新产品RA8-T系列芯片,采用Cortex-M85内核,并具有直接与处理器核心耦合的片上存储器TCM,通过专用接口访问,相比普通RAM或缓存,能提供更快的访问速度和较低的延迟和确定性访问。在RA8T1中,配置64KB(8KB×8 block)的ITCM和64KB(8KB×8 block)的DTCM。请参看数据手册,可以看到TCM在RA8T1的实际地址。




ITCM和DTCM分别用于存储指令和数据,以优化程序执行性能。在马达控制这种对实时性要求更高的应用中,可以将电流环等关键环节的指令和变量放到TCM中,提高执行速度,从而提高系统整体性能。

本文以瑞萨RA8T1官方样例工程RA8T1_MCILV1_SPM_LESS_FOC_E2S_V101为基础,对电流环进行TCM化设置,相关操作可推广到RA系列搭载TCM的其他芯片,和对应的示例软件工程。
RA8T2 sensorless方案的样例工程
 

当前工程测试环境及工具,获取链接如下所示:

IDE:版本:e2studio 2025-01
工具链:版本:13.2.1.arm-13-7。该版本可通过e2studio进行集成化安装。
FSP:版本:5.6.0
测试软件适配瑞萨官方开发套件MCK-RA8T1:该套件的相关资料可在瑞萨官网下载,链接:MCK-RA8T1 User's Manual。套件由CPU板、驱动板、通信板、样例电机及相关配件组成。



可按如下图示,参考用户手册搭建系统,调试马达工程。系统电源推荐DC24V,请另行准备。



将马达样例工程进行TCM优化的具体步骤

以RA8T1_MCILV1_SPM_LESS_FOC_E2S_V101工程为例,首先需统计电流环需要的的所有函数,并将它们分配到ITCM中。在本样例工程中,这些函数分为两类:一类是Open Source的,一类被封装到lib文件中的

由于涉及到的函数数量较多,现仅举例说明设置方法:
如函数R_ADC_Read,其作用是读出当前的相电流采样数据,是整个电流环计算的开端。函数体定义在/工程根目录/ra/fsp/src/r_adc/r_adc.c文件中。可在函数定义前增加修饰语句__attribute__((section(".itcm_data"))),将该函数指定分配到ITCM中。
示例:

__attribute__((section(".itcm_data")))
fsp_err_tR_ADC_Read(adc_ctrl_t * p_ctrl, adc_channel_tconst reg_id, uint16_t * const p_data)


ITCM起始地址为0x00000000,编译后,查看map文件,可以确认函数被分配到了ITCM区域中。



也可用系统推荐宏定义进行设置,宏定义在\工程根目录\ra\fsp\src\bsp\mcu\all\bsp_compiler_support.h文件中,具体定义如下所示:

#defineBSP_PLACE_IN_SECTION(x)_attribute__((section(x))) __attribute__((__used__))


本宏定义增加了对函数属性的进一步修饰,通常可用的修饰如下所示:

noinline/inline
used
long_call


对于函数的修饰,不是本文重点,请查阅其他材料进行确认。您可点击 【GUN】Function-Attributes_gun编译器高级属性-CSDN博客 获得相关信息。

通常情况下,算法是公司的核心资产。所以存在封库使用,或者利用第三方提供算法库的情况。在这样的情况下我们无法找到算法库中的函数本体进行设置。那我们就需要考虑将库文件整体放入ITCM中

如RA8T1_MCILV1_SPM_LESS_FOC_E2S_V101样例工程,使用了三个库文件librm_motor_current.a,librm_motor_estimate.a,librm_motor_speed.a,分别用于处理电流环、位置估算、速度环的一些算法。

要实现本操作,需对ld文件进行修改。ld文件(链接描述文件)是控制链接器行为的关键脚本文件,主要用于管理目标文件的内存布局和符号解析。通过脚本指令精确控制输入文件(.o/.a)如何组合到输出文件(可执行文件/库)中,并定义程序在内存中的布局结构。‌

在本工程的ld文件中,首先定义了存储器的物理参数:包括各内存区域的起始地址、容量及访问属性(如可读/写/执行);接着加载了必要的库文件;通过SECTIONS指令规划段的分布策略,明确代码段、数据段、特殊功能段在存储空间的具体位置。同时脚本还设置了关键的系统级配置:指定程序执行的入口地址,各模块能按预定逻辑在存储器中精准排布。

关于ld文件的布局,不是本文重点,请搜索相关资源,进行理解。比如链接文章:LD文件详解-Asp1rant-博客园。

ld文件的设置需使用标准命令,本文不详细展开,请点击相关资源,进行理解。

下面我们详细介绍本次修改的操作


在工程目录script文件夹下,打开fsp.ld文件。

在SECTIONS命令后,链接代码段.text :内删除*(.text*)语句,更改为*(EXCLUDE_FILE(*librm_motor_estimate.a:*.o *librm_motor_current.a:*.o *librm_motor_speed.a:*.o) .text.*)。这样在链接时,将不对这三个.o的lib文件在此处进行链接。请看如下示例:



在SECTIONS命令后,在.itcm_data段内在KEEP(*(.itcm_data*))语句下面,增加下面三个语句:

KEEP(*librm_motor_estimate.a:*.o(.text.*))
KEEP(*librm_motor_current.a:*.o(.text.*))
KEEP(*librm_motor_speed.a:*.o(.text.*))

更改后,在链接过程中,将这三个指定.o文件连接到itcm段。请看如下示例:



设置完成后,重新编译工程。排查map文件,可以看到lib中的函数已经放置到ITCM中。如位置估算这几个函数,排查如下:



然后需统计电流环执行用到的所有变量,并将所有变量放置到DTCM中。由于数量较多,现举例说明设置方法。

如结构体变量g_motor_sensorless0,此变量是电流环操作的主要变量结构体。变量定义在/工程目录/ra_gen/hal_data.c文件中,可在变量定义前增加修饰语句__attribute__((section(".dtcm_data")))将其分配到DTCM中。
请看如下示例:

__attribute__((section(".dtcm_data"))) motor_instance_t g_motor_sensorless0 =
{ .p_ctrl = &g_motor_sensorless0_ctrl, .p_cfg = &g_motor_sensorless0_cfg, .p_api = &g_motor_on_sensorless, };


在本应用中,g_motor_sensorless0内部嵌套了其他结构体变量,那么被嵌套的其他结构体也需要做类似声明,分配到DTCM中。
 

DTCM起始地址为0x20000000,编译后查看map文件,可以确认变量被分配到了DTCM区域中。




因为瑞萨官方样例工程,用FSP架构设置系统参数。所以在应用本例程测试时,需做两个手动设置:
1)将/工程目录 /ra_gen/,目录下的hal_data.c和hal_data.h文件设置为只读属性,这样在每次编译时,文件中所作的更改才不会被FSP默认设置覆盖。
2)在进行变量的DTCM设置时,如变量具有const标识符修饰,需将const标识符去掉。否则,类型修改产生冲突,新的设置不能成功。

因为实际应用过程中,系统建立的方法各不相同,遇到上面两种情况需注意,如自建工程,没有相关设计,则无需这两个手动步骤。
 

设置完成后,可以在电流环程序块的出入口,分别拉高和拉低I/O口,以测试电流环执行时间。

测试结果:为4.79us。



同等条件下,未TCM化的例程,电流环执行时间为5.72us。
可以看到TCM化有明显性能提升效果。


 

本文介绍了,在使用瑞萨RA8-T系列芯片设计马达工程时,如何将指令和变量放置到TCM单元,从而加速特定执行的运行速度。可以最大限度地发挥瑞萨芯片优势,为客户提供更好的解决方案。


文章来源:RA生态工作室https://www.ramcu.cn/

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

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

相关文章

获取Unity节点路径

解决目的: 避免手动拼写节点路径的时候,出现路径错误导致获取不到节点的情况。解决效果: 添加如下脚本之后,将自动复制路径到剪贴板中,在代码中通过 ctrlv 粘贴路径代码如下: public class CustomMenuItems…

Docker 安装 Oracle 12C

镜像 https://docker.aityp.com/image/docker.io/truevoly/oracle-12c:latest docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/truevoly/oracle-12c:latest docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/truevoly/oracle-12c:latest d…

Linux内核网络协议注册与初始化:从proto_register到tcp_v4_init_sock的深度解析

一、协议注册:proto_register的核心使命 在Linux网络协议栈中,proto_register是协议初始化的基石,主要完成三项关键任务: Slab缓存创建(内存管理核心) prot->slab = kmem_cache_create_usercopy(prot->name, prot->obj_size, ...); if (prot->twsk_prot) pr…

GD32 MCU的真随机数发生器(TRNG)

GD32 MCU的真随机数发生器(TRNG) 文章目录 GD32 MCU的真随机数发生器(TRNG)一、定义与核心特征二、物理机制:量子与经典随机性三、生成方法四、应用场景五、与伪随机数的对比六、局限性⚙️ 七、物理熵源原理🔧 八、硬件实现流程(以GD32F450 GD32L233为例)8.1. **初始…

Vulkan学习笔记6—渲染呈现

一、渲染循环核心 while (!glfwWindowShouldClose(window)) {glfwPollEvents();helloTriangleApp.drawFrame(); // 绘制帧} 在 Vulkan 中渲染帧包含一组常见的步骤 等待前一帧完成(vkWaitForFences) 从交换链获取图像(vkAcquireNextImageKH…

React第六十二节 Router中 createStaticRouter 的使用详解

前言 createStaticRouter 是 React Router 专为 服务端渲染(SSR) 设计的 API,用于在服务器端处理路由匹配和数据加载。它在构建静态 HTML 响应时替代了客户端的 BrowserRouter,确保 SSR 和客户端 Hydration 的路由状态一致。 一…

qt 双缓冲案例对比

双缓冲 1.双缓冲原理 单缓冲:在paintEvent中直接绘制到屏幕,绘制过程被用户看到 双缓冲:先在redrawBuffer绘制到缓冲区,然后一次性显示完整结果 代码结构 单缓冲:所有绘制逻辑在paintEvent中 双缓冲:绘制…

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…

ParaGraphX [特殊字符]

https://github.com/stevechampion1/paragraphx 一个基于 JAX 的、为 CPU/GPU 加速而生的超高性能图算法库。 ParaGraphX 是一个实验性的 Python 库,旨在利用 JAX 的即时编译 (JIT) 和大规模并行计算能力,为经典的图算法提供惊人的性能提升。我们的目标…

如何用4 种可靠的方法更换 iPhone(2025 年指南)

Apple 每年都会发布新版本的 iPhone。升级到新 iPhone 是一种令人兴奋的体验,但转移所有宝贵数据的想法有时会让人感到畏惧。幸运的是,我们准备了 4 种有效的更换 iPhone 的方法,让你可以毫不费力地更换到你的新 iPhone。 此外,您…

GitLab 拉取变慢的原因及排查方法

前言:在软件开发的快节奏世界里,高效协作与快速交付是制胜关键。然而,当开发团队兴高采烈地投入工作,却发现从GitLab拉取代码的速度慢如蜗牛,那种沮丧感简直能瞬间浇灭热情。在分布式开发环境中,这种情况时…

落水人员目标检测数据集(猫脸码客第253期)

落水人员目标检测:科技守护生命之舟 一、背景与意义 随着人类海洋活动和水上活动的日益频繁,海上与水域安全事故频发。每年都会开展大量的海上救援行动,以搜救数以万计的落难人员。在水上活动区域,如水库、河道等,溺…

JAVA_强制类型转换:

类型范围大的变量,不可以直接赋值给类型变量小的变量 需要进行强制类型转换: 想要完成类型范围大的变量传给类型范围小的变量需要先创建一个新的变量(类型与方法的形参类型要相同)。将类型范围大的变量前面加上(转换类…

打卡第44天:无人机数据集分类

重复以下内容 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶: 并拆分成多个文件 import os import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader,…

个人网站大更新,还是有个总站比较好

个人网站大更新,还是有个总站比较好 放弃了所有框架,用纯htmlcssjs撸了个网站,这回可以想改啥改啥了。 选择了黑紫作为主色调,暂时看着还算可以。 为什么不用那些框架了 几个原因: 尝试用vuepress、vitepress、not…

高精度算法详解:从原理到加减乘除的完整实现

文章目录 一、为什么需要高精度算法二、高精度算法的数据结构设计2.1 基础工具函数2.2 高精度加法实现2.3 高精度减法实现2.4 高精度乘法实现2.5 高精度除法实现 三、完整测试程序四、总结 一、为什么需要高精度算法 在编程中,处理极大数值是常见需求,例…

排序--计数排序

一,引言 计数排序是一种针对整数数据的高效排序算法。其主要流程可分为三个步骤:首先计算整数数据的数值范围;接着按大小顺序统计各数值的出现次数;最后根据统计结果输出排序后的数据序列。 二,求最值 遍历现有数据,获取最大值…

Kubernetes安全机制深度解析(四):动态准入控制和Webhook

#作者:程宏斌 文章目录 动态准入控制什么是准入 Webhook? 尝试准入Webhook先决条件编写一个准入 Webhook 服务器部署准入 Webhook 服务即时配置准入 Webhook对 API 服务器进行身份认证 Webhook 请求与响应Webhook 配置匹配请求-规则匹配请求&#xff1a…

WDK 10.0.19041.685,可在32位win7 sp1系统下搭配vs2019使用,可以编译出xp驱动。

(14)[驱动开发]配置环境 VS2019 WDK10 写 xp驱动 (14)[驱动开发]配置环境 VS2019 WDK10 写 xp驱动_microsoft visual 2019 wdk-CSDN博客文章浏览阅读3k次,点赞8次,收藏17次。本文介绍了如何在VS2019环境下安装和配置Windows Driver Kit(WDK)&#xff0…

论坛系统自动化测试

1、项目背景与测试目标 系统定位 论坛系统作为典型的高并发Web应用,需支持用户注册、登录、发帖、评论、私信及个人中心管理等核心功能,是用户公开交流与信息共享的核心平台。其稳定性与响应效率直接影响用户体验及平台活跃度。 测试必要性 功能可靠性&…