工具/软件:TI-RTOS
大家好、
在我们的应用中,我们希望在以下3个内核之间使用共享内存:A15 (Linux)、IPU (SYS/BIOS)和 DSP (SYS/BIOS)。 我根据“AM57x Processor SDK Linux:定制多核”(sprac60)创建了 CMEM 共享内存。 Linux 分配此 CMEM 存储器、并通过 MessageQ 将物理地址发送到其他内核(IPU 和 DSP)。 每个内核都可以使用此共享存储器。 这很好。
现在、我们要使用 GateMP 机制来保护对该共享存储器的读取/写入。 我在 IPC/packages 目录中找到了"gatempapp"示例。 我实现了它。 我 创建了一个由 DSP 拥有的共享存储器(SR_0)。 GateMP 机制在 Linux (CREATE/OPEN)和 DSP (CREATE/OPEN)之间工作、但不在 IPU 内核中工作。
DSP:
*。cfg:
VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.addUserStartupFunction ('&IpcMgr_callIpcStart');
var GateMP = xdc.useModule('ti.sdo.ipc.GateMP');
GateMP.hostSupport = true;
var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
var SR0Mem = Program.CPU.memoryMap["SR_0"];
SharedRegion.setEntryMeta(0、
新建 SharedRegion.entry ({
姓名: "sr0"、
基址: SR0Mem.base、
长度: SR0Mem.len、
createHeap:true、
ownerProcId:MultiProc.getIdMeta ("DSP1")、
高速缓冲启用:true、
IsValid: 真
})
);
var Resource = xdc.useModule('ti.ipc.remoteproc.Resource');
Resource.customTable = true;
*.c:
GateMP_Params_init (gateParams); gateParams.name = App_gate_dsp_name; gateParams.localProtect = GateMP_LocalProtect_Process; gateParams.remoteProtect = GateMP_RemoteProtect_SYSTEM; gateParams.RegionID = 0; Module.slaveGateMPHandle = GateMP_create (gateParams);
IPU:
*。cfg:
VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.addUserStartupFunction ('&IpcMgr_callIpcStart');
var GateMP = xdc.useModule('ti.sdo.ipc.GateMP');
GateMP.hostSupport = true;
var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
var SR0Mem = Program.CPU.memoryMap["SR_0"];
SharedRegion.setEntryMeta(0、
新建 SharedRegion.entry ({
姓名: "sr0"、
基址: SR0Mem.base、
长度: SR0Mem.len、
createHeap:true、
ownerProcId:MultiProc.getIdMeta ("DSP1")、
高速缓冲启用:true、
IsValid: 真
})
);
var Resource = xdc.useModule('ti.ipc.remoteproc.Resource');
Resource.customTable = true;
*。c
GateMP_Params_init (gateParams); gateParams.name = App_gate_IPU_name; gateParams.localProtect = GateMP_LocalProtect_Process; gateParams.remoteProtect = GateMP_RemoteProtect_SYSTEM; gateParams.RegionID = 0; Module.slaveGateMPHandle = GateMP_create (gateParams);
IpuAmmu.cfg:与 ex02_MessageQ 示例相同
配置%ld:
var evmDRA7XX_ExtMemMapDsp ={ (笑声) SR_0:{ 姓名:evmDRA7XX_SR_0.name 基址:evmDRA7XX_SR_0.base、 len:evmDRA7XX_SR_0.len、 太空:"数据"、 访问:"RW" } }; Build.platformTable["ti.platforms.evmDRA7XX:dsp1"]={ externalMemoryMap:[ ["EXT_CODE"、evmDRA7XX_ExtMemMapDsp.EXT_CODE ]、 ["EXT_DATA"、evmDRA7XX_ExtMemMapDsp.EXT_DATA ]、 ["EXT_HEAP "、evmDRA7XX_ExtMemMapDsp.EXT_HEAP ]、 ["trace_BUF"、evmDRA7XX_ExtMemMapDsp.trace_BUF ]、 ["EXC_DATA"、evmDRA7XX_ExtMemMapDsp.EXC_DATA ]、 ["PM_DATA"、evmDRA7XX_ExtMemMapDsp.PM_DATA]、 [ evmDRA7XX_SR_0.name、evmDRA7XX_ExtMemMapDsp.SR_0] ]、 代码内存:"EXT_CODE"、 dataMemory:"EXT_DATA"、 stackMemory:"EXT_DATA"、 }; var evmDRA7XX_ExtMemMapIpu1 ={ (笑声) SR_0:{ 姓名:evmDRA7XX_SR_0.name 基址:evmDRA7XX_SR_0.base、 len:evmDRA7XX_SR_0.len、 太空:"数据"、 访问:"RW" } }; Build.platformTable["ti.platforms.evmDRA7XX:ipu1"]={ externalMemoryMap:[ ["EXT_CODE"、evmDRA7XX_ExtMemMapIpu1.EXT_CODE ]、 ["EXT_DATA"、evmDRA7XX_ExtMemMapIpu1.EXT_DATA ]、 ["EXT_HEAP "、evmDRA7XX_ExtMemMapIpu1.EXT_HEAP ]、 ["trace_BUF"、evmDRA7XX_ExtMemMapIpu1.trace_BUF ]、 ["EXC_DATA"、evmDRA7XX_ExtMemMapIpu1.EXC_DATA ]、 ["PM_DATA"、evmDRA7XX_ExtMemMapIpu1.PM_DATA ]、 [ evmDRA7XX_SR_0.name、evmDRA7XX_ExtMemMapIpu1.SR_0] ]、 代码内存:"EXT_CODE"、 dataMemory:"EXT_DATA"、 stackMemory:"EXT_DATA"、 };
rsc_table_ipu.h:
#define IPU_SR0_virt 0xBFB00000 #define IPU_SR0 0xBFB00000 #define IPU_SR0_size (sz_1M * 1) struct my_resource_table ti_ipc_remoteproc_ResourceTable ={ (笑声) { TYPE_DEVMEM、 IPU_SR0_virt、IPU_SR0、 IPU_SR0_SIZE、0、0、"IPU_SR0"、 }, };
rsc_table_dsp.h:
#define DSP_SR0_virt 0xBFB00000 #define DSP_SR0 0xBFB00000 #define DSP_SR0_SIZE (sz_1M * 1) struct my_resource_table ti_ipc_remoteproc_ResourceTable ={ (笑声) { TYPE_DEVMEM、 DSP_SR0_virt、DSP_SR0、 DSP_SR0_SIZE、0、0、"DSP_SR0"、 }, };
配置:
BIOS:6.46.01.38
IPC:3.44.0.0
XDC 工具:3.32.01.22
在 IPU 中,GateMP_create()函数返回以下错误:"ti.sdo.ipc.GateMP:第1160行:断言失败:a_noHeap:区域没有堆"("createHeap:true"是什么意思?)
如果创建了 HeapBufMP (DSP 端),并且我尝试将其打开(IPU 端), 则 HeapBufMP_open()函数返回:HeapBufMP_E_NOTFOUND。
您是否知道我为什么不能在 IPU 内核上创建 GateMP? 为什么我尝试打开堆、它找不到它?
感谢你的帮助、
Olivier