本文以RZ/T2H多軸控制/驅動的實例,介紹RZ/T2H平臺的多核異構應用場景。分為:
示例軟件基本框架;
使用RemoteProc啟動R核;
程序啟動后,R核之間通過數據共享來傳遞數據;
RZ/T2H的啟動流程。
該例程運行于RZ/T2H平臺,該平臺由兩個CR52核和四個CA55核構成。其中,CA55核跑Linux OS+EtherCAT主站軟件;CR52_1運行EtherCAT從站,與主站實現9軸的控制/狀態數據實時交互;CR52_2運行9軸的電機驅動程序。
01基本框架

圖一 多核異構的軟硬件框架
EtherCAT Controller(CiA402)位于CA55 Linux 側,負責上位通信控制。包括EtherCAT主站通信、電機控制指令下發和現場數據收集等等。
EtherCAT Slave device(CiA402)位于CR52_1上,運行EtherCAT從站協議棧,執行EtherCAT數據幀處理與設備對象管理,運行在裸機環境中,保證實時性。
CA55端的ECAT主站和CR52_1端的ECAT從站,通過內部端口連接,EtherCAT數據流直接在2個域之間流動,不需要從外部端口回環;
9-axis motor drive位于CR52_0,負責伺服電機驅動(多軸機器人控制)。功能包括:PWM計算和輸出,編碼器反饋數據采集,電流環/速度環/位置環計算和數據反饋,運行在裸機環境。
運行于CA55的CODESYS RUNTIME(EtherCAT Master),通過EtherCAT協議向CR52_1發送控制數據,CR52_1通過共享內存向CR52_0轉發解析后的數據,CR52_0控制外設來控制電機。
同理,電機的實時狀態數據由CR52_0采集,通過共享內存機制傳遞到CR52_1,CR52_1再通過EtherCAT協議把數據傳回主站。
02CA55端采用OpenAMP的RemoteProc來啟動CR52_0和CR52_1

圖二 remoteProc啟動CR52_0和CR52_1
Remoteproc代碼位于/sources/linux-renesas/drivers/remoteproc/rz_rproc.c
2.1 操作結構體

rz_rproc_ops是一個struct rproc_ops類型的結構體,它定義了遠程處理器(remoteproc)的操作函數集。這個結構體在`rz_rproc_probe`函數中被使用,具體是在創建新的remoteproc實例時作為參數傳遞給devm_rproc_alloc函數:
左右滑動查看完整內容
rproc= devm_rproc_alloc(dev, np->name, &rz_rproc_ops, NULL, sizeof(*pdata));
該操作包含以下操作函數:
prepare:準備遠程處理器的資源
start:啟動遠程處理器,當系統需要啟動遠程處理器時會調用
stop:停止遠程處理器,當需要停止遠程處理器時會調用
da_to_va:設備地址到虛擬地址的轉換,見源碼中的A55核和R52核之間的地址訪問轉換關系
parse_fw:解析固件,當需要加載固件時,會調用 parse_fw 和相關的 ELF 操作函數
2.2 probe的驅動框架層次:
左右滑動查看完整內容
module_platform_driver(rz_rproc_driver) |-- 設備樹匹配 "renesas,rz-cr52" |-- rz_rproc_probe() |-- devm_kzalloc() 分配私有數據 |-- devm_rproc_alloc() 分配 remoteproc 結構 | |-- 關聯 rz_rproc_ops 操作函數集 |-- 讀取設備樹屬性 | |-- renesas,rz-core | |-- renesas,rz-swint | |-- renesas,rz-start_address | |-- renesas,rz-autoboot |-- pm_runtime_enable() 啟用電源管理 |-- rproc_add() 注冊遠程處理器 |-- 創建 sysfs 接口 |-- 初始化遠程處理器狀態
當執行echo gcc_rzn2h_cr52_0_rpmsg_linux_baremetal_demo.elf> /sys/class/remoteproc/remoteproc0/firmware時,會調用firmware_store修改firmware的名字。
當執行echo start > /sys/class/remoteproc/remoteproc0/state,會產生state_store->rproc_boot->request_firmware->rproc_fw_boot->rproc_start,此時調用rz_rporc.c中的rproc->ops->start
左右滑動查看完整內容
rproc_boot() |-- rproc_prepare_device() | |-- rz_rproc_prepare() // 我們驅動中的準備函數 |-- request_firmware() // 從文件系統加載固件 |-- rproc_fw_sanity_check() | |-- rz_rproc_ops.sanity_check() |-- rproc_parse_fw() | |-- rz_rproc_parse_fw() // 解析固件內容 |-- rproc_load_segments() | |-- rproc_elf_load_segments() |-- rproc_start() |-- rz_rproc_start() // 啟動遠程處理器
2.3 設備樹節點分析


設備樹節點的compatible="renesas,rz-cr52"會匹配到驅動中的:
左右滑動查看完整內容
staticconststructof_device_idrz_rproc_of_match[] = {
{ .compatible="renesas,rz-cr52"},
{/* end of list */},
};
從而找到該驅動。
資源初始化流程:
`reg`屬性定義了兩個內存區域:
cr52_sram:0x10000000-0x101FFFFF (SRAM區域)
cr52_ddr:0x3E0000000-0x3E9000000(DDR區域)
`memory-region`指向三個預留內存區域:
`vdev0vring1:虛擬設備環形緩沖區1
`vdev0buffer`:虛擬設備共享緩沖區
左右滑動查看完整內容
renesas,rz-core = <0x0>; // CR52核編號 renesas,rz-swint = <10>; // 軟中斷通道 renesas,rz-start_address = <0x00000000>; // 啟動地址
注意CR52_0:
啟動地址0x00000000,CR52_1:啟動地址0x10061000。這兩個地址需要與firmware編譯后的地址一致。
2.4 remoteProc的start本地實現
我們提取其中的static int rz_rproc_start(struct rproc*rproc)來做一下簡單介紹:
prcrs_base= ioremap(PRCRS,0x4); prcrn_base= ioremap(PRCRN,0x4);
設置PRCRS和PRCRN,用于使能GPIO寫功能。
接下來建立CA55視角的地址空間:
左右滑動查看完整內容
atcm_base_0 = ioremap(BSP_PRV_ATCM_AXIS_CR520_ADDRESS, (CR52_ATCM_END - CR52_ATCM_START));
同理得到:atcm_base_1,btcm_base_0,sysram_base。
從T2H的用戶手冊上,也可以查到A55核訪問異構核的對應地址。

圖三 A55訪問ATCM/BTCM/SRAM的物理地址
接下來是拷貝CR52_1的firmware

拷貝完成后Reset CR52_0,通過設置SWRCPU0為0x4321A502來release和reset,便開始執行該firmware。
啟動腳本為:
左右滑動查看完整內容
# 將存在的固件名寫入remoteproc sysfs 入口 echoCR52_0_motor.elf>/sys/class/remoteproc/remoteproc0/firmware echoCR52_1_ECAT.elf>/sys/class/remoteproc/remoteproc1/firmware #啟動遠端處理器 echostart>/sys/class/remoteproc/remoteproc0/state echostart>/sys/class/remoteproc/remoteproc1/state
03CR52_0與CR52_1之間的共享數據
CR52_0和CR52_1之間通過核間通信(基于共享內存機制),交換電機控制參數和狀態信息。使用 Shared Memory驅動(r_shared_memory,通過瑞薩FSP生成)和核間中斷機制,實現核間數據交換,同時通過硬件信號量和軟件標志位來保證數據完整性和互斥訪問。

圖四 CR52_0與CR52_1之間的數據共享

圖五 數據共享的消息序列圖
數據傳輸
CR52_1使用SHARED_MEMORY API將數據結構寫入到2個CPU的共享內存區域。寫入操作僅在數據發生變化時進行,從而避免不必要的訪問,寫入完成,CR52_1產生一個核間中斷通知CR52_2。
數據接收
CR52_2收到CR52_1發來的中斷,開始從共享內存區讀取數據,同時在回調函數會設置一個標志位,以標志數據讀取過程完成。
T2H自帶2MB的SRAM,將CR52_0和CR52_1之間的1.5KB數據共享放到了如下地址:

圖六 數據共享地址
04T2H的啟動順序

圖七 T2H多核啟動順序
注
BL2表示引導加載程序的第2階段(Boot Loader stage 2),BL3表示引導加載程序的第3階段(Boot Loader stage 3),WFI表示Wait For Interrupt。
T2H上電后,始終從CR52_0啟動,BOOTROM根據BL2的加載地址決定是從CR52_0繼續啟動還是跳轉到CA55啟動;
上圖的啟動流程:
系統上電后,Boot function將BL2加載到 SystemRAM中,并跳轉到其入口地址執行。
BL2將BL3和U-Boot加載到DDR SDRAM中,并跳轉到BL3的入口地址執行。
BL3為U-Boot做一些初始化準備工作,然后跳轉到U-Boot的入口地址執行。
U-Boot加載Linux并啟動它。
通過remoteproc加載并啟動Cortex-R52 CPU0 的固件。
Cortex-R52 CPU0開始執行其固件。
通過remoteproc加載并啟動Cortex-R52 CPU1 的固件。
Cortex-R52 CPU1開始執行其固件。
以上完成多核的啟動,再配合CA55端的CODESYS RUNTIME,可以完成驅控一體的系統搭建。9軸驅控視頻請見:
RZ T2H完整的軟硬件設計規范、參考例程、工具等,請登錄以下網址獲取更多資料。
RZ/T2H - Advanced High-End MPU with Integrated Powerful Application Processing and High-Precision Real-Time Control for 9-Axis Motor Control | Renesas
https://www.renesas.com/en/products/microcontrollers-microprocessors/rz-mpus/rzt2h-advanced-high-end-mpu-integrated-powerful-application-processing-and-high-precision-real-time
-
Linux
+關注
關注
88文章
11641瀏覽量
218197 -
ethercat
+關注
關注
19文章
1400瀏覽量
43708 -
多核異構
+關注
關注
0文章
24瀏覽量
5617
原文標題:RZ/T2H多核異構的應用場景分析
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
瑞薩RZ/T2H PCIe通信的調試方法
瑞薩教你如何使用RZ/T2L RZ/N2L RSK J-Link OB
RZ T2H PCIe裸機程序開發和Linux下的配置介紹
工業MPU新標桿,多協議工業以太網+運動控制 - 瑞薩RZ/T2H 新產品
瑞薩電子量產高性能工業設備MPU RZ/T2H
瑞薩交流日進行中,米爾演講-RZ/T2H高性能模組賦能工業產品創新
RZ/T2H MPU數據手冊和產品介紹#集成了強大的應用處理能力和精確的實時控制功能

瑞薩RZ/T2H平臺多核異構的應用場景分析
評論