本篇介紹在使用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/