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:IPC 的共享存储器的可缓存选项应该是什么

Guru**** 2609895 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/644799/rtos-what-should-be-the-cache-able-option-for-shared-memory-for-ipc

Thread 中讨论的其他器件:OMAPL138SYSBIOS

工具/软件:TI-RTOS

大家好、我已经安装了 IPC 3.46.00.02、并且已经在 OMAPL138上运行了 ex02_MessageQ 示例、并且在 ARM 上运行了 Linux。

我不理解 DSP.cfg 文件中添加的缓存选项:

VAR Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
/*将0xc4000000 -> 0xc4ffff 设置为共享内存 IPC 的非缓存值*/
cache.MAR192_223 = 0x00000010;

我想、从这条评论开始是错误的。 这里我们将禁用0xc3000000、而不是0xc4000000。  

您能否解释一下有关此缓存选项的想法? IPC 内存是否不能缓存?  

已附上完整的 dsp.cfg 文件供您参考。

Thanks.e2e.ti.com/.../2337.Dsp.cfg

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。
    在 ex02示例中、MessageQ 的配置使用 HeapBuf、然后将其注册到 heapID 0。 是否有办法添加该堆已启用缓存?

    来自 dsp.cfg 文件的行:
    /*为 MessageQ 消息创建堆*/
    VAR HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
    var params = new HeapBuf.Params;
    params.align = 8;
    params.blocksize = 512;
    params.numBlocks = 256;
    var msgHeap = HeapBuf.create (params);

    VAR MessageQ = xdc.useModule('ti.sdo.ipc.MessageQ');
    MessageQ.registerHeapMeta (msgHeap、0);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好。

    是否有任何方法可以在堆存储器中启用缓存的情况下运行此 ex02示例。

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

    我已通知 RTOS 团队。 他们的反馈将直接发布在此处。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在此处查看 MAR 位说明:
    www.ti.com/.../sprufk5a.pdf

    MAR192对应于位0、MAR196对应于配置中设置为1的位4。

    该设置的解释可在 SYBIOS 文档中找到:
    software-dl.ti.com/.../Cache.html

    n`t 您不希望为此设置使用.cfg、则可以使用此处提供的 API:
    software-dl.ti.com/.../Cache.html

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

    您好、Rahul、

    ex02示例配置中的注释错误。  

    它说  

    /*将0xc4000000 -> 0xc4ffff 设置为共享内存 IPC 的非缓存值*/
    //Cache.MAR192_223 = 0x00000010;

    但是、它启用了0xc4000000 -> 0xc4ffff、其余部分禁用。

    如何使用具有以下设置的 ex02示例:

    cache.MAR192_223 = 0x00000018;

    设计的入口点为0xc3000000

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

    我认为您是正确的、cache.MAR192_223 = 0x00000010将0xc4000000 -> 0xc4fff 设置为可缓存。 我将与团队确认这一点。

    cache.MAR192_223 = 0x00000018将设置0xc3000000 -> 0xc4ffff 以进行缓存。

    您可以在 ti.sysbios.family.c64p.cache 模块的 CDOC 中找到有关缓存配置的更多信息。 可以在\BIOS_6_46_05_55\docs\CDOC\ti\SysBIOS\family\c64p\Cache.html 目录中找到 CDOC。

    您还可以查看以下代码片段以供参考:

    /*配置外部内存高速缓存属性
    *
    * C000_0000 - C7FFFF 800_0000 (128 MB) cache.MAR192_223
    ***********************************************************************************************。
    * C000_0000 - C1FF_FFFF 200_0000 (32 MB)--- 不用担心
    * C200_0000 - C202_FFFF 3_0000 (192KB) SR_0、SR-1无高速缓存 MAR194
    * C203_0000 - C2FF_FFFF FD_0000 (~15MB)---- 无高速缓存 MAR194
    * C300_0000 - C37F_FFFF 80_0000 (8 MB) DSP_PROG 高速缓存启用 MAR195
    * C380_0000 - C3FF_FFFF 80_0000 (8 MB)---- 高速缓存启用 MAR195
    * C400_0000 - C7FFFF 400_0000 (64MB)--- 不用担心
    *

    高速缓存= xdc.useModule('ti.sysbios.family.c64p.Cache');
    cache.MAR192_223 = 0x00000008;/* xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx 10xx */


    配置后、您可以使用 ROV 检查高速缓存的状态。 请查看以下主题以了解更多信息:

    e2e.ti.com/.../111081


    希望这对您有所帮助。 如果您有任何疑问、请告知我们。

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

    您好、Sahin、

    当我运行具有 defualt 高速缓存设置的示例时、似乎都可以正常工作。 但是、当我更改 MessageQ 堆的使用缓存时、示例 ex02设计停止工作!!!

    请帮我解决这个问题。 如何使用启用高速缓存的 ex02示例。 谢谢。  

    我是否需要添加高速缓存回写函数?  

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

    您好、请了解有关此问题的任何更新信息。
    谢谢

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

    你(们)好。  

    在我的设计中、我想对在 DSP 上运行的软件使用高速缓存选项。 查看 IPC 的示例、可以看到缓存似乎已禁用、用于 IPC 通信。

    是否有办法使用 OMAPL138地址0x8000000 SharedRam 上的内部片上存储器?

    我在配置文件中添加了以下代码:

    /*共享内存基址和长度*/
    VAR SHAREMDE= 0x80001400;
    VAR SHAREDMEMSIZE = 0x00020000;

    /*
    *需要定义共享区域。 IPC 模块使用此功能
    *以制作可移植指针。 所有处理器都需要添加此内容
    *使用其共享存储器区域的基址进行调用。
    *如果处理器无法访问内存,请勿添加。
    *
    VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
    SharedRegion.setEntryMeta(0、
    {基地址:SHAREMMEM,
    Len:SHAREDMEMSIZE、
    ownerProId:0、
    IsValid:true、
    createHeap:true、
    高速缓冲启用:true、
    名称:"SharedMem"、
    });

    VAR HeapMemMP = xdc.useModule('ti.sdo.ipc.heaps.HeapMemMP');
    VAR paramsMP =新 HeapMemMP.Params;
    paramsMP.name ="SHR";
    paramsMP.RegionID = 0;
    paramsmp.sharedAddr = SHAREMMEDEM;
    paramsmp.sharedBufSize = SHAREDMEMSIZE;
    var msgHeap1 = HeapMemmp.create (paramsMP);

     

    如何将此缓冲区用作 MessageQ 的堆?

    谢谢。

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

    您好、Mitesh、

    很抱歉耽误你的回答。 在 SharedRegion 配置中、createHeap 设置为"true"、指示 IPC 自动创建大小为整个共享区域的 HeapMemMP 实例。 使用此配置、您无需像在 cfg 文件中那样创建另一个 HeapMemMP 实例。

    如果您只想使用共享区域的子集创建 HeapMemMP 实例、请将 createHeap 设置为"false"、并像您所做的那样创建 HeapMemMP 实例。 只需注意、HeapMemMP 的大小需要小于 SharedRegion。

    此外、在 SharedRegion 内创建的任何 IPC 实例都将继承 SharedRegion 的缓存设置。 因此、由于将 cacheEnable 设置为"true"、创建的 HeapMemMP 实例也将启用缓存。 (请参阅 http://www.ti.com/lit/ug/sprugo6e/sprugo6e.pdf#page=62)

    但愿这对您有所帮助。 如果您有任何其他问题、请告知我们。

    最棒的
    Sahin

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

    您好、Sahin、

    感谢您的再次光临。

    我已将 createHeap 设置更改为 false 并使用 HeapMemMP 创建堆、但设计无法编译。

    错误:HeapMemMP 不支持静态实例。

    我能否执行以下操作:

    /*共享内存基址和长度*/
    VAR SHAREMDE= 0xC0000000;/0x80001400;
    VAR SHAREDMEMSIZE = 0x00020000;

    /*
    *需要定义共享区域。 IPC 模块使用此功能
    *以制作可移植指针。 所有处理器都需要添加此内容
    *使用其共享存储器区域的基址进行调用。
    *如果处理器无法访问内存,请勿添加。
    *
    VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
    SharedRegion.setEntryMeta(0、
    {基地址:SHAREMMEM,
    Len:SHAREDMEMSIZE、
    ownerProId:0、
    IsValid:true、
    CreateHeap:false、//true、
    高速缓冲启用:true、
    名称:"SharedMem"、
    });

    /*为 MessageQ 消息创建堆*/
    VAR HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
    var params = new HeapBuf.Params;
    params.align = 8;
    params.blocksize = 512;
    params.numBlocks = 256;
    //params.sectionName ="testHeap";
    var msgHeap = HeapBuf.create (params);

    //Program.sectMap["testHeap"]="SharedMem";//"DDR";

    VAR MessageQ = xdc.useModule('ti.sdo.ipc.MessageQ');
    MessageQ.registerHeapMeta (msgHeap、0);

    但不确定如何从 SharedMem 分配 msgHeap。

    请您解释一下、谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Sahin、我按照你的建议尝试了折页。
    但即使是编译设计、仍然会出错。

    在 C 代码中添加了:
    HeapBufMP_Params heapParams;
    HeapBufMP_Handle heapHandle;
    HeapBufMP_Params_init (heapParams);
    heapParams.RegionID = 1;
    heapHandle = HeapBufMP_create (heapParams、&EB);

    MessageQ_registerHeap (heapHandle、1);


    还有一点、我不确定是否能够在 DSP 和 ARM/Linux 内核之间使用 sharedRam for IPC?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我从 CCS 获取的错误:

    未定义 第一个参考
    符号 文件中
    ------ --------
    TI_sdo_ipc_堆_HeapBufMP_Params__init__S ./main.obj
    TI_sdo_ipc_堆_HeapBufMP_create /main.obj

    错误#10234-D:未解析的符号仍然存在
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin、
    好的、正如您之前的答复、
    我已将 SharedRegion 配置、createHeap 保留为"true"、并从 cfg 文件中删除了额外的 HeapMemMP 实例。

    然后我添加了
    MessageQ_registerHeap (SharedRegion_getHeap (1)、1);
    进行编程。 我认为,我们需要添加此项,以便从该共享区域分配 MessageQ。 这有道理吗?

    共享区域的 ROV 视图:ID 1:
    、1、0x80001400、0x800033ff、0x2000、0、false、true、8、0、0x0、SharedRAM

    CCS 中出现以下错误:
    0xc3110000处有3个资源条目
    [T=0x0a2aac5f] ti.sdo.ipc.MessageQ:错误:第191行:断言失败:A_heapIdInvalid:heapId 无效
    TI.sdo.IPC.MessageQ:第191行:断言失败:A_heapIdInvalid:heapId 无效
    xdc.runtime.Error.raise:终止执行


    在 C 代码中:我使用了以下代码:
    MessageQ_registerHeap (SharedRegion_getHeap (1)、1);

    和 CFG:
    /*共享内存基址和长度*/
    VAR SHAREMMEM = 0x80001400;
    VAR SHAREDMEMSIZE = 0x00002000;

    /*
    *需要定义共享区域。 IPC 模块使用此功能
    *以制作可移植指针。 所有处理器都需要添加此内容
    *使用其共享存储器区域的基址进行调用。
    *如果处理器无法访问内存,请勿添加。
    *
    VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
    SharedRegion.setEntryMeta(1、
    {基地址:SHAREMMEM,
    Len:SHAREDMEMSIZE、
    ownerProId:0、
    IsValid:true、
    createHeap:true、
    高速缓存启用:false、
    高速缓存行大小:0、
    名称:"SharedRAM"、
    });


    还可以在 C 代码中尝试以下操作:
    MessageQ_registerHeap (SharedRegion_getHeap (SharedRegion_getIdByName ("SharedRAM"))、1);

    运气差。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin、
    在 MessageQ_alloc 之前、我在 C 代码中调用了 MessageQ_registerHeap。
    关于为 IPC 使用 SR0、我能否执行以下操作:

    /*共享内存基址和长度*/
    VAR SHAREMMEM = 0xc3200000;//0x80001400;
    VAR SHAREDMEMSIZE = 0x00020000;

    /*
    *需要定义共享区域。 IPC 模块使用此功能
    *以制作可移植指针。 所有处理器都需要添加此内容
    *使用其共享存储器区域的基址进行调用。
    *如果处理器无法访问内存,请勿添加。
    *
    /*var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
    SharedRegion.setEntryMeta(0、
    {基地址:SHAREMMEM,
    Len:SHAREDMEMSIZE、
    ownerProId:0、
    IsValid:true、
    createHeap:true、
    高速缓存启用:false、
    高速缓存行大小:0、
    名称:"SharedRAM0"、
    });*/

    /*共享内存基址和长度*/
    /var SHAREDMEM1 = 0xc200000;//0x80001400;
    //var SHAREDMEMSIZE1 = 0x00020000;

    /*
    *需要定义共享区域。 IPC 模块使用此功能
    *以制作可移植指针。 所有处理器都需要添加此内容
    *使用其共享存储器区域的基址进行调用。
    *如果处理器无法访问内存,请勿添加。
    *
    /*var SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
    SharedRegion.setEntryMeta(1、
    {基址:SHAREDMEM1,
    Len:SHAREDMEMSIZE1、
    ownerProId:0、
    IsValid:true、
    createHeap:true、
    高速缓存启用:false、
    高速缓存行大小:0、
    名称:"SharedRAM1"、
    });*/

    VAR MessageQ = xdc.useModule('ti.sdo.ipc.MessageQ');
    //MessageQ.registerHeapMeta (IPCHeap、0);

    /*设置 MessageQ 传输*/
    VAR VirtioSetup = xdc.useModule('ti.ipc.transports.TransportRpmsgSetup');
    MessageQ.SetupTransportProxy = VirtioSetup;

    /*安装名称服务器远程代理*/
    var nameserver = xdc.useModule("ti.sdo.utils.NameServer");
    VAR NsRemote = xdc.useModule("ti.ipc.namesrv.NameServerRemoteRpmsg");
    nameserver.SetupProxy = NsRemote;

    /*启用在 BIOS 资源表上运行的内存转换模块*/
    VAR 资源= xdc.useModule('ti.ipc.remoteproc.Resource');
    resource.loadSegment ="DDR";

    /*使用 SysMin、因为 Linux/QNX 需要跟踪缓冲区地址
    *跟踪调试驱动程序、加提供更好的性能。
    *
    VAR 系统= xdc.useModule('xdc.runtime.System');
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    System.SupportProxy = SysMin;
    SysMin。bufSize = 0x8000;

    Program.sectMap[".tracebuf"]="DDR";
    Program.sectMap[".errorbuf"]="DDR";

    VAR Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
    /*将0xc4000000 -> 0xc4ffff 设置为共享内存 IPC 的非缓存值*/
    cache.MAR192_223 = 0x00000008;

    /*使用我自己的*/覆盖默认资源表
    VAR 资源= xdc.useModule('ti.ipc.remoteproc.Resource');
    resource.customTable = true;


    在 C 代码中:
    MessageQ_registerHeap (SharedRegion_getHeap (SharedRegion_getIdByName ("SharedRAM1"))、1);
    不确定 heapID 是否应为0或1。

    MessageQ_alloc 将从何处分配内存? 它是0xc20000000吗?
    我是否能够使用它与 Linux 中的 Remoteproc 通信?

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

    配置看起来正常。 heapID 取决于要分配 MessageQ 的堆(请参阅 downloads.ti.com/.../_message_q_8h.html)
    downloads.ti.com/.../_shared_region_8h.html)

    MessageQ_alloc 将从使用 heapID 指定的堆分配内存。

    运行此配置时是否遇到任何错误? 如果是、它们是什么?

    此外、您是否已经在 ex02_MessageQ 中引用了 src 和 cfg 文件? 我想这个例子就是你在这里要做的。

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

    新年快乐!感谢您的回复。

    我已经介绍了 MessageQ_ex02示例的 C 代码。 但是、当我进行一次更改时

    1)  

    VAR Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
    /*将0xc4000000 -> 0xc4ffff 设置为共享内存 IPC 的非缓存值*/
    cache.MAR192_223 = 0x00000010;

    更改为  

    VAR Cache = xdc.useModule('ti.sysbios.family.c64p.Cache');
    /*将0xc4000000 -> 0xc4ffff 设置为共享内存 IPC 的非缓存值*/
    cache.MAR192_223 = 0x00000008;

    示例停止工作...  

    请帮我使其正常工作。

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

    新年快乐!

    线路

    cache.MAR192_223 = 0x00000008;

    将0xc3000000 -> 0xc3ffff 设置为缓存。 我相信虚拟缓冲区默认放置在该区域。 Vring 缓冲区需要标记为未缓存、因此请确保将其放置在缓存区之外。

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

    您好、Sahin、感谢您的回复。

    我以前曾尝试过这种方法、但无法启动 Linux。

    下面是我所做的更改:

     *将 VRINGS 的资源表地址更改为0xc2000000

     *将 DSP 应用从0xc3000000更改为运行

     *使0xc3000000可缓存  

     *在 DTS 文件中,CMA 区域更改为0xc2000000,长度为0x02000000

    但 Linux 无法引导!/...

    您是否能够为 DSP 应用创建一个新的 ex02示例、并为我在非高速缓存区域启用高速缓存和 VING?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    或请告知我们。 我们如何将 VING 保持在相同的区域0xc3000000中、但在缓存区域中运行 DSP 应用程序可能是0xc4000000。