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/TI-RTOS:AM572x IPC 问题

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

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/621228/rtos-ti-rtos-am572x-ipc-issue

器件型号:TI-RTOS

工具/软件:TI-RTOS

您好!

我使用 的是 ti-processor-sdk-linux-am57xx-03.01.00.06和 ti-processor-sdk-rtos-am57xx-evm-03.01.00.06-Windows-x86-64安装程序。

最近、我尝试在 IPC_3_43_02_04/examples/DRA7XX_BIOS_elf/ex01_hello 测试该示例。

使用 CCS 时一切都很好。

但我想加载 DSP 映像格式 lib/固件、DSP 内核未加电、并且在文件系统中找不到 trace0文件。

因此、我将 DRA7XX_Linux_elF/ex02_MessageQ 的 ipc.cfg.xs、config.Bld、Dsp1.cfg 和 Dsp2.cfg 文件复制到 ex01_hello 文件夹。

我加载新 的 DSP 映像、 然后执行 cat /sys/kernel/debug/remoteproc/remoteproc2/trace0、我看到错误"IPC_START FAILED"

我 参考 ex01_hello 文件夹中的 ipc.cfg.xs、config.bld、Dsp1.cfg 文件、添加 SR_0的定义并进行编译。

然后 、"IPC_START FAILED"会显示、但 IPC_Attach 失败、并返回-11。

我检查此错误。有人告诉我共享区域未设置。

因为我不熟悉共享区域、所以我想对它有一些想法。

这是我的问题:

在此 站点中是否应使用 ti.sdo.ipc.SharedRegion 模块?

我想修改 DRA7XX_Linux_elf/ex02_MessageQ 中的 cfg 文件以让 ex01_hello 在 Linux 上运行、我注意到哪些 cfg 模块?

以下是我的 cfg 文件:

/*
 *版权所有(c) 2013-2015 Texas Instruments Incorporated - http://www.ti.com
 *保留所有权利。
 *
 *以源代码和二进制形式重新分发和使用、有无
 *如果满足以下条件、则允许进行修改
 符合*:
 *
 ** 源代码的重新分发必须保留上述版权
 *  注意、此条件列表和以下免责声明。
 *
 * *二进制形式的再发行必须复制上述版权
 *  请注意、中的此条件列表和以下免责声明
 *  随分发提供的文档和/或其他材料。
 *
 * *德州仪器公司的名称和名称均不相同
 *  其贡献者可用于认可或推广衍生产品
 *  未经特定的事先书面许可。
 *
 *本软件由版权所有者和贡献者"按原样"提供
 *以及任何明示或暗示的保证、包括但不限于:
 *特定适销性和适用性的隐含保证
 *不承认目的。 在任何情况下、版权所有者不得或
 *派遣国应对任何直接、间接、偶然、特殊、
 *典型或必然的损害(包括但不限于
 *采购替代货物或服务;丧失使用、数据或利润;
 *或业务中断)、无论原因是什么以及任何责任理论、
 *无论是合同、严格责任还是侵权行为(包括疏忽或)
 *否则)因使用本软件而以任何方式产生、
 *即使被告知可能会发生此类损坏。
 *
/*
 * ==== Dsp1.cfg ===========
  *平台:DRA7XX_Linux_elf
 * 目标:TI.targets.elf.c66
 *
/*配置对象模型的根*/
VAR 计划= xdc.useModule('xdc.cfg.Program');
var cfgArgs = Program.build.cfgArgs;
var rb =(cfgArgs.profile ="发布"? true:false);
/*应用程序使用以下模块和软件包*/
xdc.useModule('xdc.runtime.Assert');
xdc.useModule('xdc.runtime.Diags');
xdc.useModule('xdc.runtime.Error');
xdc.useModule('xdc.runtime.Log');
xdc.useModule('xdc.runtime.Registry');
xdc.useModule('ti.sysbios.knl.Semaphore');
xdc.useModule('ti.sysbios.knl.Task');
/*
 * ==== IPC 配置====
 *
xdc.useModule('ti.ipc.ipcmgr.IpcMgr');
//xdc.global.SR0_cacheEnable = false;
/*加载跨内核共享的配置 */
Program.global.procName ="DSP1";
var ipc_cfg = xdc.loadCapsule ("../shared/ipc.cfg.xs);
/*选择 IPC 库*/
//var build = xdc.useModule('ti.sdo.ipc.Build');
//build.libType =(rb? build.LibType_Non检测:build.LibType_Debug);
//build.assertsEnabled =(rb? false:true);
//build.logsEnabled =(rb? false:true);
VAR BIOS    = xdc.useModule('ti.sysbios.BIOS');
BIOS.addUserStartupFunction ('&IpcMgr_ipcStartup');
/*
 * ==== SYS/BIOS 配置====
 *
if (Program.build.profile =>"debug"){
  BIOS.libType = BIOS.LibType_Debug;
}否则{
  BIOS.libType = BIOS.LibType_Custom;
/*无 RTS 堆*/
program.argSize = 100; /*最小大小*/
program.stack = 0x1000;
VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
Task.common$.namedInstance = true;
/*默认内存堆*/
VAR 内存= xdc.useModule('xdc.runtime.Memory');
VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var heapMemParams = new HeapMem.Params();
heapMemParams.size = 0x8000;
Memory.defaultHeapInstance = HeapMem.create (heapMemParams);
/*为 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);
/*设置 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 ="EXT_CODE";
/* 使用 SysMin、因为 Linux/QNX 需要跟踪缓冲区地址
 * 跟踪调试驱动程序、加提供更好的性能。
 *
VAR 系统= xdc.useModule('xdc.runtime.System');
VAR SysMin = xdc.useModule('ti.trace.SysMin');
System.SupportProxy = SysMin;
SysMin。bufSize = 0x8000;
Program.sectMap[".tracebuf"]="trace_BUF";
Program.sectMap[".errorbuf"]="EXC_DATA";
/*-------------------- 勾选---------------------------------------- *
VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
clock.tickSource = Clock.tickSource_NULL;
//Clock.tickSource = Clock.tickSource_user;
/*将 BIOS 时钟源配置为 GPTimer5 */
//Clock.timerId = 0;
VAR 计时器= xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
/*跳过计时器频率验证检查。 需要稍后删除*
Timer.checkFrequency = false;
/*将其与提供 dmTimers 的 SYS_CLK 频率相匹配。
 *一旦 SYS/BIOS 系列设置被更新、就不需要。 *
Timer.intFreq.hi = 0;
Timer.intFreq.lo = 19200000;
//var timerParams = new Timer.Params ();
//timerParams.period = Clock.tickPeriod;
//timerParams.periodType = Timer.piodType_microsecs;
/*关闭软件重置以使以下设置生效*/
//timerParams.tiocpCfg.softreset = 0x0;
/*智能空闲唤醒功能模式*/
//timerParams.tiocpCfg.idlemode = 0x3;
/*溢出唤醒生成*/
//timerParams.twer.OVF WUP_ENA = 0x1;
//Timer.create (Clock.timerId、Clock.doTick、timerParams);
VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');
VAR Deh = xdc.useModule('ti.deh.Deh');
/*必须置于电源管理之前*/
idle.addFunc ('&ti_deh_deh_idleBegin');
/*
 * ==== 仪表配置====
 *
/*系统记录器*/
VAR LoggerSys = xdc.useModule('xdc.runtime.LoggerSys');
VAR LoggerSysParams = new LoggerSys.Params();
VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
Defaults.common$.logger = LoggerSys.create (LoggerSysParams);
/*为非 XDC 规范模块启用运行时 Diags_setMask()*/
VAR 诊断= xdc.useModule('xdc.runtime.Diags');
Diags.setMaskEnabled = true;
/*覆盖选定模块的诊断掩码*/
xdc.useModule('xdc.runtime.Main');
Diags.setMaskMeta("xdc.runtime.Main"、
  diags.entry | Diags.exit | Diags.info、Diags.RUNTIME_ON);
VAR 注册表= xdc.useModule('xdc.runtime.Registry');
Registry.common$.diags_ENTRY = Diags.RUNTIME_OFF;
Registry.common$.diags_EXIT = Diags.RUNTIME_OFF;
Registry.common$.diags_INFO = Diags.RUNTIME_OFF;
Registry.common$.diags_USER1 = Diags.RUNTIME_OFF;
Registry.common$.diags_LIFECYCLE = Diags.RUNTIME_OFF;
Registry.common$.diags_STATUS = Diags.RUNTIME_OFF;
VAR Main = xdc.useModule('xdc.runtime.Main');
Main.common$.diags_ASSERT = Diags.always_on;
Main.common$.diags_INTERNAL = Diags.always_on;
/*
 *版权所有(c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
 *保留所有权利。
 *
 *以源代码和二进制形式重新分发和使用、有无
 *如果满足以下条件、则允许进行修改
 符合*:
 *
 ** 源代码的重新分发必须保留上述版权
 *  注意、此条件列表和以下免责声明。
 *
 * *二进制形式的再发行必须复制上述版权
 *  请注意、中的此条件列表和以下免责声明
 *  随分发提供的文档和/或其他材料。
 *
 * *德州仪器公司的名称和名称均不相同
 *  其贡献者可用于认可或推广衍生产品
 *  未经特定的事先书面许可。
 *
 *本软件由版权所有者和贡献者"按原样"提供
 *以及任何明示或暗示的保证、包括但不限于:
 *特定适销性和适用性的隐含保证
 *不承认目的。 在任何情况下、版权所有者不得或
 *派遣国应对任何直接、间接、偶然、特殊、
 *典型或必然的损害(包括但不限于
 *采购替代货物或服务;丧失使用、数据或利润;
 *或业务中断)、无论原因是什么以及任何责任理论、
 *无论是合同、严格责任还是侵权行为(包括疏忽或)
 *否则)因使用本软件而以任何方式产生、
 *即使被告知可能会发生此类损坏。
 *
/*
 * ==== ipc.cfg.xs ===
 *
/*配置对象模型的根*/
VAR 计划= xdc.useModule('xdc.cfg.Program');
var cfgArgs = Program.build.cfgArgs;
/*配置处理器名称*/
VAR procNameAry =["DSP1"、"DSP2"、"EVE1"、"EVE2"、"EVE3"、"EVE4"、"EVE4"、"IPU1"、"IPU2"、
    "主机"];
VAR MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
MultiProc.setConfig(Program.global.procName、procNameAry);
/* IPC 配置*/
VAR IPC = xdc.useModule('ti.sdo.ipc.Ipc');
Ipc.procSync = IPC.ProcSync_pair;
ipc.sr0MemorySetup = true;
/*共享区域配置*/
VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
/*配置 SharedRegion #0 (IPC)*/
VAR SR0Mem = Program.cpu.memoryMap["SR_0"];
SharedRegion.setEntryMeta(0、
  新建 SharedRegion.entry ({
    姓名:      "SR_0"、
    基址:      0xA0000000、
    长度:       0x10000000、
    ownerProcId:  MultiProc.getIdMeta ("DSP1")、
    IsValid:    true、
    高速缓冲使能:  false
  })
);
/*
 *版权所有(c) 2013-2015、德州仪器(TI)公司
 *保留所有权利。
 *
 *以源代码和二进制形式重新分发和使用、有无
 *如果满足以下条件、则允许进行修改
 符合*:
 *
 ** 源代码的重新分发必须保留上述版权
 *  注意、此条件列表和以下免责声明。
 *
 * *二进制形式的再发行必须复制上述版权
 *  请注意、中的此条件列表和以下免责声明
 *  随分发提供的文档和/或其他材料。
 *
 * *德州仪器公司的名称和名称均不相同
 *  其贡献者可用于认可或推广衍生产品
 *  未经特定的事先书面许可。
 *
 *本软件由版权所有者和贡献者"按原样"提供
 *以及任何明示或暗示的保证、包括但不限于:
 *特定适销性和适用性的隐含保证
 *不承认目的。 在任何情况下、版权所有者不得或
 *派遣国应对任何直接、间接、偶然、特殊、
 *典型或必然的损害(包括但不限于
 *采购替代货物或服务;丧失使用、数据或利润;
 *或业务中断)、无论原因是什么以及任何责任理论、
 *无论是合同、严格责任还是侵权行为(包括疏忽或)
 *否则)因使用本软件而以任何方式产生、
 *即使被告知可能会发生此类损坏。
 *
/*
 * ==== CONFIG.BRD =====
 *
 *
VAR Build = xdc.useModule('xdc.bld.BuildEnvironment');
 ti.platforms.evmDRA7XX:dsp1和 ti.platforms.evmDRA7XX:dsp2的/*内存映射
 *
 * --外部存储器--
 * 虚拟  物理    大小       注释
 ** *****************************************************************************************************
 * 9500_4000 ?????????   10_0000 ( ~1MB) EXT_CODE
 * 9510_0000 ?????????   10_0000 ( 1MB) EXT_DATA
 * 9520_0000 ?????????   30_0000 ( 3MB) EXT_HEAP
 * 9F00_0000 9F00_0000  6_0000 (384KB) TRACE_BUF
 * 9F06_0000 9F06_0000  1_0000 ( 64KB) EXC_DATA
 * 9F07_0000 9F07_0000  2_0000 (128KB) PM_DATA (电源管理)
 *
var evmDRA7XX_ExtMemMapDsp ={
  EXT_CODE:{
    名称:"EXT_CODE"、
    基地址:0x95000000、
    Len: 0x00100000、
    太空:"代码"、
    访问:"rwx"
  }、
  EXT_DATA:{
    名称:"EXT_DATA"、
    基地址:0x95100000、
    Len: 0x00100000、
    太空:"数据"、
    访问:"RW"
  }、
  EXT_HEAP:{
    名称:"EXT_HEAP "、
    基地址:0x95200000、
    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? *
  }、
};
/********* /
VAR SR_0 ={
  名称:"SR_0"、空格:"data"、访问:"rw"、
  基地址:0xA00C0000、len:0x1000000、
  注释:"SR#0存储器(16 MB)"
};
/********* /
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]、
/******** /
["SR_0"、SR_0]
/******** /
  ]、
  代码内存:"EXT_CODE"、
  dataMemory:"EXT_DATA"、
  stackMemory:"EXT_DATA"、
};
Build.platformTable["ti.platforms.evmDRA7XX:dsp2"]=
Build.platformTable["ti.platforms.evmDRA7XX:dsp1"];
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CY、

    您似乎正在尝试在 CCS 中构建 DSP IPC 项目、然后在 A15上从 Linux 加载/运行其二进制文件。 Wiki processors.wiki.ti.com/.../Linux_IPC_on_AM57xx 中的"Adding_IPC_TO_AN_Existing_TI-RTOS_Application_ON_SLAVE_Cores"部分 应该会有所帮助。

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

    您好、Garrett

    感谢您的回复。

    我看到了您 的网页,但我仍有一些问题需要问。

    ex01_hello 示例涉及 DSP1和 DSP2的通信、

    在 HelloDsp1.c 中,示例将使用一些函数,如 IPC_attach(),仅 SYS/BIOS 支持这些函数。

    我有什么东西可以替代此函数吗?

    谢谢。

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

    如果您重新基于 examples/DRA7XX_linux_elf/ex41_forwardmsg、则只应进行集成、该示例介绍了如何设置共享区域和修改.cfg、但该示例演示了 DSP 和 IPU 之间的数据通信、而不是 DSP1和 DSP2。 IPC_attach()对于创建到指定远程处理器的连接至关重要,需要显式或间接调用。

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

    您好!

    Garrett

    感谢您的建议、我很喜欢"IPC_ATT"失败的问题。

    顺便说一下,我想知道 MessageQ_open()函数的一些信息。

    我在 DSP2上创建一个消息队列,并希望使用 MessageQ_open 远程队列。

    但我发现、我无法在 DSP1上打开远程队列、但我可以在 DSP1上打开一个本地队列。

    当我在 DSP1上使用 MessageQ_open 时、程序停止且不 执行以下语句。

    这太奇怪了,MessageQ_open()应该打开远程队列。

    您知道该错误的问题是什么吗?

    谢谢。

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

    您好、Garrett

    感谢您的建议。

    我已成功从 Linux 上的 A15上加载并运行其二进制文件。