This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/PROCESSOR-SDK-AM57X:IPU IPC/GateMP 配置

Guru**** 2587365 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/591987/rtos-processor-sdk-am57x-ipu-ipc-gatemp-configuration

器件型号:PROCESSOR-SDK-AM57X

工具/软件:TI-RTOS

大家好、  

在我们的应用中,我们希望在以下3个内核之间使用共享内存:A15 (Linux)、IPU (SYS/BIOS)和 DSP (SYS/BIOS)。 我根据“AM57x Processor SDK LinuxRegistered:定制多核”(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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Biser、

    我们还面临 AM57X 上的类似问题、并有兴趣回答。

    我有一个相关问题:

     rsc_table_dsp.h 中指定的物理地址(DSP_SR0)位于 DDR-SDRAM 地址空间内。 是否必须在 Linux DTS 中指定它,与 CMA 分割和 CMEM 块类似;以便 Linux 不会接触此内存区域?

    谢谢、
    Paritosh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Olivier、

    CreateHeap 在 packages/ti/ipc/SharedRegion.h 中定义:

      bool createHeap;

      /*!<@简要说明是否为该区域创建了堆

      *

      * 如果为 true,则创建大小为的 HeapMemMP 实例

      * 跨越共享区域的长度减去任何内存

      * 保留在该区域中。  如果"false"、则没有堆

      * 在共享区域中创建。

      *

    当您将 DSP1定义为共享区域所有者时、您观察到的错误应由 DSP 和 IPU 尝试在共享区域中创建 HeapMP 引起。 如果目的是共享区域(DSP1)的所有者在共享区域中创建堆、并且 IPU 使用 heapMP、则在 IPU 配置中设置以下内容可能会有所帮助。

    IPU:cfg

          CreateHeap:  false、 

    此致、
    Garrett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Garret、

    快速查询:
    GateMP 是否必须配置 SharedRegion?

    MessageQ 在没有 SharedRegion 的情况下工作正常;分配 MessageQ 消息时,我们使用 HeapID 作为0;堆是否不同?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Garrett、

    感谢你的答复。

    按照您的建议、在 IPU:cfg 中、我将'createHeap'参数设置为 false、但我遇到相同的问题:IPU 的"a_noHeap:区域没有堆"错误。  GateMP_create()函数用于 DSP。

    我尝试将 IPU1设置为共享区域所有者:  

    IPU1:*。cfg:

    SharedRegion.setEntryMeta(0、
    新建 SharedRegion.entry ({
    姓名: "sr0"、
    基址: SR0Mem.base、
    长度: SR0Mem.len、
    createHeap:true、
    ownerProId:IPC_cfg.MultiProc.getIdMeta ("IPU1")、
    高速缓冲启用:true、
    IsValid: 真
    })
    ); 

    DSP1:*。cfg:

    SharedRegion.setEntryMeta(0、
    新建 SharedRegion.entry ({
    姓名: "sr0"、
    基址: SR0Mem.base、
    长度: SR0Mem.len、
    CreateHeap:false、
    ownerProId:IPC_cfg.MultiProc.getIdMeta ("IPU1")、
    高速缓冲启用:true、
    IsValid: 真
    })
    );
    

    但 IPU1固件加载会崩溃...
    这是否是 MMU 的问题?

    正如 Paritosh 所说:“是否必须在 Linux DTS 中指定[SR0区域],类似于 CMA 分割和 CMEM 块;以便 Linux 不会接触此内存区域?”

    此致、
    Olivier

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Paritosh、

    是的、必须在 Linux DTS 中指定 SR0区域、类似于 CMA 分割和 CMEM 块;以便 Linux 不会接触此存储器区域。

    reserved_mem{(&S)

               dsp1_sr0:dsp1_sr0@bfb00000{

                   reg =<0x0 bfb00000 0x0 0x100000>;

                   无地图;

                   状态="正常";

           };

    };

    仅 BIOS 支持共享区、对于 GateMP 是必需的。

    Olivier、

    您观察到了哪种类型的碰撞? 通常、如果内核启动日志中存在 iommu 错误、则需要使用自定义资源表来处理它。

    此致、
    Garrett

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Garret、

    这是否意味着 GateMP 不能用于 C66 (SYS/BIOS)和 A15 (Linux)之间的共享存储器(如 CMEM)同步?

    谢谢、
    Paritosh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Paritosh、

    GateMP 在 C66 (SYS/BIOS)和 A15 (Linux)上受支持、但仅限于特定的 SharedRegion 模块。

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Garret。

    在本例中、GateMP 的 SharedRegion 有哪些替代?

    您能否给我们指出配置 GateMP 以实现 C66 (SYS/BIOS)和 A15 (Linux)之间的同步的用户指南?

    谢谢、
    paritosh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    现在、为了不修改 dst 文件、我使用 CMEM 空间作为 SR0区域、这样 Linux 就不会接触到该存储器。 Linux 应用程序不使用此 CMEM/SR0区域。 因此,SR0现在从地址0xA0000000开始。 以下是我的新配置:

    IpuAmmu.cfg:与 ex02_MessageQ 示例相同:

    /******* 大页数 /
    //*指令代码:大页(512M);可高速缓冲*/
    *配置大页[0]以将512MB VA 0x0映射到 L3 0x0 */
    Ammu.imulePages [0]。pageEnabled = Ammu.Enable_Yes;
    Amample.largePages [0];Ammu.imu.imu.ePhes= 0x0;Ammu.Ammu.arge.pages[Amule.Amages.Amages[0]
    ;Amarge.Amarge.Amarge.Amulations.Amulations=Amule.Amages.Amulations.Amages[Amages].Amarge.Amule.Amages.Amages.Amules.Am
    
    
    Ammu.largePages [0]。L1_posted= Ammu.PostedPolicy_posted;
    
    //外围设备区域:大页(512M);不可高速缓冲*/*
    配置大页[1],以映射512MB VA 0x60000000到 L3 0x60000000 */
    AmachePages [1].pages=Amuleages[AM1].Amuleages=Amule1mu.Amule1u.Amu.Amuleages;AMe1u.Amule1u.Amulations=Amule1u.Amu.Amuleages[AM1u.Amule].Amule1u.Amages].Amules].Amule1u.Amules=Amule1u.Amule1u.Amule1u.Amule1u.Amu.Amu.Amul
    
    
    
    
    Ampolicy.largePages [1].l1_posted = Ammu.PostedPolicy_posted;
    
    /*私有、共享和 IPC 数据区域:大页(512M);可高速缓冲*/
    /*配置大页[2]以将512MB VA 0x80000000映射到
    
    
    
    
    高速缓冲地址0x80000000 */ AmicalPages[2];Amuleages=Amuleages[Amule2].Amages=Amule2mu.Amu.Amuleages[Amules]];Amuleages=Amulations=Amuleages[Amule2].Amule2mu.Amu.Amulgu.Amuleages[Amule].Amuleages=Amu.Amuleages].Amules[Amule].Amuleages].Amules=Amuleages
    AmargePAGE[2].L1_LOADED = Ammu.PostedPolicy_posted;
    
    //倾斜和 DMM 区域:大页(512M);可高速缓冲*//*
    配置大页[3]以映射512MB VA 0xA0000000到
    
    
    
    
    已启用0xA0000000*/已启用 AmePAGE[3].Ameages=Ameages=AM3mu.Amealmu.Ameages=AM3mu.Ame=Ameages[512mu.Amu.Ameages].Ame=Ameages=Ame=AmeL3.amu.Ame=Amula3u.Ame3u.Ame3mu.Amu.Amu.Amu.Ameages=Amules=Ame3u.Ameages=Ame3u.Amu.Amule3u.Amu.Ame
    Ammu.largePages [3].L1_posted= Ammu.PostedPolicy_posted; 

    配置%ld:  

    //
    var evmDRA7XX_SR_0 ={
    名称:"SR_0"、空格:"data"、访问:"rw"、
    基地址:0x88000000、len:0x01000000、
    注释:"SR#0 Memory"
    };
    
    var evmDRA7XX_ExtMemMapIpu1 ={
    EXT_CODE:{
    名称:"EXT_CODE"、
    基地址:0x00004000、
    Len:0x000FC000、
    太空:"代码"、
    访问:"rwx"
    }、
    EXT_DATA:{
    名称:"EXT_DATA"、
    基地址:0x8000000、
    Len:0x00200000、
    太空:"数据"、
    访问:"RW"
    }、
    EXT_HEAP:{
    名称:"EXT_HEAP "、
    基地址:0x80200000、
    Len:0x00300000、
    太空:"数据"、
    访问:"RW"
    }、
    TRACE_BUF:{
    名称:"trace_BUF"、
    基地址:0x9F000000、
    Len:0x00060000、
    太空:"数据"、
    访问:"RW"
    }、
    EXC_DATA:{
    名称:"EXC_DATA"、
    基地址:0x9F060000、
    Len:0x00010000、
    太空:"数据"、
    访问:"RW"
    }、
    PM_DATA:{
    名称:"PM_DATA"、
    基地址:0x9F070000、
    Len:0x00020000、
    太空:"数据"、
    访问:"rwx"/*这是否应该具有执行 perm? *
    }、
    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:与“rsc_table_vayu.h”文件相同,并有新的“IPU_SR0”条目:

    #define IPU_CMEM_IOBUFS 0x88000000
    #define PHYS_CMEM_IOBUFS 0xA0000000
    #define IPU_CMEM_IOBUFS_SIZE (SZ_1M * 16)
    
    struct my_resource_table{
    [...]
    uint32 offset[19];/*应与实际定义中的'num'匹配*/
    [...]
    /* devmem 条目*/
    struct fw_RSC_devmem devmem13;
    };
    
    struct my_resource_table ti_ipc_remoteproc_ResourceTable ={
    [...]
    19、 /*表中的条目数*/
    [...]
    offsetof (struct my_resource_table、devmem13)、
    [...]
    {
    TYPE_DEVMEM、
    IPU_CMEM_IOBUFS、PHY_CMEM_IOBUFS、
    IPU_CMEM_IOBUFS_SIZE、0、0、"IPU_SR0"、
    },
    }; 

    我有相同的行为:  
    - DSP 是 IPU 的拥有者:"a_noHeap:区没有堆"错误。  GateMP_create()函数用于 DSP。
    -IPU 是所有者:IPU 固件加载崩溃:

    [0][ 0.000]异常发生在(PC)= 000196e2
    [0][ 0.000] CPU 上下文:线程
    [0][ 0.000] BIOS 主名称:(空任务)句柄:0x0。
    [0][ 0.000] BIOS 主堆栈基地址:0x8006d428。
    [0][ 0.000] BIOS 主堆栈大小:0x1000。
    [0][ 0.000][t=0x000a1235] ti.sysbios.family.arm.m3/hwi:错误:1104行:E_hardFault:强制
    [0][ 0.000] ti.sysbios.family.arm.m3.hwi:第1104行:e_hardFault:强制
    [0][ 0.000][t=0x000ca7ed] ti.sysbios.family.arm.m3/Hwi:错误:第1181行:e_busFault:IMPRECISERR:延迟总线故障、确切地址未知、地址:e000ed38
    [0]。[ 0.000] ti.sysbios.family.arm.m3/Hwi:第1181行:E_busFault:IMPRECISERR:延迟总线故障、确切的地址未知、地址:e000ed38
    [0][ 0.000] R0 = 0x00000001 R8 = 0x00000000
    [0][ 0.000] R1 = 0x00000000 R9 = 0x00025978
    [0][ 0.000] R2 = 0x4a0f6800 R10 = 0x8006d3c4
    [0][ 0.000] R3 = 0x00000000 R11 = 0x8006e3ac
    [0][ 0.000] R4 = 0x00000001 R12 = 0x00025f39
    [0][ 0.000] R5=0x00000014 SP (R13)=0x8006e350
    [0][ 0.000] R6 = 0x00000050 LR (R14)= 0x00019693
    [0][ 0.000] R7 = 0x00024a0e PC (R15)= 0x000196e2
    [0][ 0.000] PSR = 0x01000200
    [0][ 0.000] ICSR = 0x00400803
    [0][ 0.000] MMFSR = 0x00
    [0][ 0.000] BFSR = 0x04
    [0][ 0.000] UFSR = 0x0000
    [0][ 0.000] HFSR = 0x40000000
    [0][ 0.000] DFSR = 0x00000000
    [0][ 0.000] MMAR = 0xe000ed34
    [0][ 0.000] BFAR = 0xe000ed38
    [0][ 0.000] AFSR = 0x00000000 

    我的配置有什么问题?

    谢谢、

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    paritosh、

    如 Olivier 所述、IPC/packages 目录中有"gatempapp"示例、请参见

    /linux/src/tests/GateMPApp.c

    /packages/ti/ipc/tests/gatempapp_rsc_table_vayu_dsp.h

    /packages/ti/ipc/tests/gatempapp.c

    /packages/ti/ipc/tests/gatempapp.cfg

    Linux 实现中的 GateMP 位于以下文件中:

    /linux/src/demon/GateMP_demon.c

    /linux/src/demon/GateHWSpinlock.c

    /linux/include/GateMP_config.h

    Olivia、

    "IPU is the owner:IPU firmware loading crash"-您是否曾尝试通过在 IPU 代码中仅保留 GateMP 相关函数调用来缩小问题范围?

    "DSP 是 IPU 的所有者:"a_noHeap:区没有堆"错误。" e2e 线程中有几个关于错误的讨论(但主要来自 DSP),不确定您是否已经完成了这个过程?


    此致、Garrett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 IPU 代码中、如果我只保留 GateMP 相关函数(即删除 *。cfg 文件中的共享区域配置、并且仅调用*。c 文件中的 GateMP_create ()函数)、则我具有"a_noHeap:区域没有堆"。 因此、正是共享区域配置/创建"崩溃"了 IPU。 当然是内存映射问题、Ammu 或 IOMMU 端。 DSP 没有问题。 您在我的配置中没有看到任何错误?

    我在 e2e 论坛上看到这个错误,我看到了线程:"a_noHeap:区没有堆"。 我首先启动 DSP 内核(所有者),以便它在 SR0中初始化堆,然后在启动 IPU 内核之后:我有相同的错误。