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.

[参考译文] Linux/AM5728:CMEM 错误

Guru**** 2589275 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/590859/linux-am5728-cmem-error

器件型号:AM5728

工具/软件:Linux

您好!

尝试在 Linux 和 DSP1之间进行通信时出现错误。 以下是在主机上运行程序的消息:

----------------------------------

root@am57xx-EVM:~/test/messageq/hostex #./hostex2 DSP1
-->主要:
->Main_main:
--> App_create:
CMEM_init 成功
MessageQ_Params_init
MessageQ_create
队列名称 DSP1:MSGQ:01
MessageQ_open
APP_CREATE:主机已就绪
<-- App_create:
--> App_exec:
APP_exec:发送消息
用户:0xaa5a2000 PHY:0xa0000000
XOR 中的数据0 = 0xAD[2211.926600] CMEMK 错误:找不到适合0x70的池

CMEM 错误:getPool:无法获取大小为0x70[2211.943117]的池 CMEMK 错误:Alloc:传递了无效的池(-1)。

CMEM 错误:allocPool:ioctl CMEM_IOCALLOC 从池-1失败:-1
CMEM_ALLOC()失败(返回 NULL)
<-- App_exec:-1
<-- Main_main:
<--主要:
root@am57xx-EVM:~/test/messageq/hostex

----------------------------------

我通过'cat'检查了/sys/module/cmemk/parameters/phys_start 和 phys_end 文件、它们显示为'null'。 然后、我运行'rmmod cmemk'并以此方式运行烟雾、

      insmod /lib/modules/4.4.19-rt25-gf572d285f0/extra/cmemk.ko phys_start=0xa0000000 phys_end=0xac000000 Pools = 4x50331648

出现以下消息:

----------------------------------

[6264.961831] CMEMK 模块:参考 Linux 版本4.4.19
[6264.969162]分配的堆缓冲区0x40500000、大小为0x100000
[6264.975069] cmemk 已初始化
----------------------------------

我再次检查了 PHYS_START 和 PHYS_END、现在分别显示了0xa0000000和0xac000000。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更多信息。 将 ger_zel 示例与资源表一起使用、仅适用于主机和 DSP1。

    bitbucket.org/.../cmem.git

    错误发生在分配的第二个循环中。 即使 PAYLOADSIZE 为0x700000、也会找到第一个环路。 以下是在循环中添加了注释的消息、后跟循环代码获取错误(对于使用的 PAYLOADSIZE 值0x700000和0x70都是如此)。
    ----------------------
    root@am57xx-EVM:~/test/messageq/hostex #./hostex2 DSP1
    -->主要:
    ->Main_main:
    --> App_create:
    CMEM_init 成功
    MessageQ_Params_init
    MessageQ_create
    队列名称 DSP1:MSGQ:01
    MessageQ_open
    APP_CREATE:主机已就绪
    <-- App_create:
    --> App_exec:
    APP_exec:发送消息

    环路0处的值。

    用户:0xaa5b5000 PHY:0xa0000000
    XOR 中的数据0 = 0xc6

    环路1 of 4。

    [15557.259802] CMEMK 错误:找不到适合0x700000的池
    CMEM 错误:getPool:无法获取大小为0x700000[15557.269706]的池 CMEMK 错误:Alloc:传递了无效池(-1)。

    CMEM 错误:allocPool:ioctl CMEM_IOCALLOC 从池-1失败:-1

    CMEM_ALLOC()失败(返回 NULL)
    <-- App_exec:-1
    <-- Main_main:
    <--主要:
    root@am57xx-EVM:~/test/messageq/hostex
    ----------------------

    代码段
    ----------------------
    对于(i = 0;i < 4;i++){

    printf ("\n\tat 循环%d、共4个。\n\n"、i);
    fflush (stdout);

    MSG->datain[i]= CMEM_LOPool (CMEM_getPool (PAYLOADSIZE)、&cmemAttrs);
    if (msg->datain[i]== NULL){
    printf ("\nCMEM_alloc()失败(返回 NULL)\n");
    状态=-1;
    离开;

    MSG->dataInPhys[i]= CMEM_getPhys(msg->datain[i]);

    printf ("用户:%p phys:0x%x\n"、msg->dataain[i]、msg->dataInPhys[i]);

    uint8_t *datain =(uint8_t*) msg->datain[i];

    MSG->inXor[i]= 0;

    对于(j = 0;j < PAYLOADSIZE;j++){
    datain[j]=rand();
    MSG->inXor[i]^= datain[j];


    printf ("XOR 中的数据%d = 0x%x\n"、i、msg->inXor[i]);

    ----------------------
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否尝试运行 TI IPC ex02 MessageQ 示例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用了这里发布的 host/DSP1示例、

    bitbucket.org/.../cmem.git
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我想知道示例 RSC_TABLE _DSP.h 中包含的资源表是否在所有 define 语句中都存在一些冲突。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不应该、但上次运行此示例时是1或2个版本之前。 我将使用与您相同的版本(ProcSDK 3.2、内核 v4.4)重试它、看看正在发生什么情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我注意到、我删除了 cmemk、然后再次使用以下命令 insmod cmemk、

    insmod /lib/modules/4.4.19-rt25-gf572d285f0/extra/cmemk.ko phys_start=0xa0000000 phys_end=0xac000000 Pools = 4x50331648

    然后是 cat /proc/cmem、我仍然会得到在引导过程中发生的默认1池、
    --------------------------------------------------
    块0:池0:1 bufs 大小0xc000000 (请求0xc000000)

    池0忙缓冲区:

    池0免费 bufs:
    ID 0:PHY 地址0xa0000000
    --------------------------------------------------
    我查看了 cmemk/parameters 文件、其中显示了我与 insmod 一起使用的内容、

    CAT /sys/module/cmemk/parameters/pools --显示--> 4x50331648

    这是否与仅获取一个池有关? 如果有足够的可用内存、我是否可以多次使用池?

    谢谢、
    Dan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我更改了 cmem dtsi 文件、并使用所有可用内存创建了8个大小相同的池。
    现在可以创建四个池。 现在、第二个 DSP2不会使用指向0x9f000000的 DSP2基址的相同资源表进行加载。

    这是在四个不同池中分配缓冲区的输出:
    --------------------------------------------------
    root@am57xx-EVM:~/test/messageq/hostex #./hostex2 DSP1
    -->主要:
    ->Main_main:
    --> App_create:
    CMEM_init 成功
    MessageQ_Params_init
    MessageQ_create
    队列名称 DSP1:MSGQ:01
    MessageQ_open
    APP_CREATE:主机已就绪
    <-- App_create:
    --> App_exec:
    APP_exec:发送消息

    环路0处的值。

    用户:bb4e41000 phys:0xaa800000

    INXOR:0
    MSG->inXor[i]:0
    INXOR:16
    MSG->inXor[i]:0
    环路1 of 4。

    用户:0xb3641000 phys:0xa9000000

    INXOR:0
    MSG->inXor[i]:0
    INXOR:16
    MSG->inXor[i]:0
    环路2或4。

    用户:b1e41000 phys:0xa7800000

    INXOR:0
    MSG->inXor[i]:0
    INXOR:16
    MSG->inXor[i]:0
    环路3或4。

    用户:b0641000 phys:0xa6000000

    INXOR:0
    MSG->inXor[i]:0
    INXOR:16
    MSG->inXor[i]:0
    INXOR:16
    MSG->inXOR[0]:0
    消息 Put Done (输入完成)。

    消息"完成"。

    INXOR:16
    MSG->inXor[0]:16.
    <-- App_exec:0

    --> App_delete:
    <-- App_delete:
    <-- Main_main:
    <--主要:
    --------------------------------------------------
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、在配置 cmem 池时可能需要进行澄清。
    如果在 dtsi 文件中配置了 cmem,也意味着'insmod cmemk...' 命令无法更新池配置?
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到运行 ex02_MessageQ 示例时出现任何问题。 我的跑步记录的相关日志如下所示:

    [9.160260] remoteproc3:为41000000.dsp 加电
    [9.192047] remoteproc3:引导 FW 映像 dra7-dsp2-fw.xe66、大小为4528816
    [9.222290] omap_hwmod:mu0_dsp2:_wait_target_disable 失败
    [9.228186] OMAP-IMU 41501000.MMU:41501000.MMU:版本3.0
    [9.234131] OMAP-IMU 41500.MMU:41500.MMU:版本3.0
    [9.297451] remoteproc3:远程处理器41000000.DSP 现已启动
    [9.313289] virtio_rpmsg_bus virtio2:rpmsg 主机处于联机状态
    [9.313672] virtio_rpmsg_bus virtio2:创建通道 rpmsg-proto addr 0x3D
    [9.333941] remoteproc2:为40800000.DSP 加电
    [9.356598] remoteproc2:引导 FW 映像 dra7-dsp1-fw.xe66、大小为4681692
    [9.378185] OMAP-hwmod:mu0_dsp1:_wait_target_disable 失败
    [9.384076] OMAP-iommu 40d01000.MMU:40d01000.MMU:版本3.0
    [9.390011] OMAP-iommu 40d020.MMU:40d020.MMU:3.0版
    [9.440844] remoteproc2:远程处理器40800000.DSP 现已启动
    [9.458507] virtio_rpmsg_bus virtio3:rpmsg 主机处于联机状态


    root@am57xx-evm:/lib/firmware ls -l dra7*.xe66
    lrwxrwxrwx 1根 根 2017年4月25日 dra7-dsp1-fw.xe66 -> ex02_server_dsp1_320.xe66
    lrwxrwxrwx 1根 根 2017年4月25日 dra7-dsp2-fw.xe66 -> ex02_server_dsp2_320.xe66

    root@am57xx-EVM:~# uname -a
    Linux am57xx-EVM 4.4.3.32-gadde2ca9f8 #8 SMP 抢占星期五4月7日14:16:56 EDT 2017 armv7l GNU/Linux


    root@am57xx-EVM:~./app_host_ex02_320 DSP1
    -->主要:
    ->Main_main:
    --> App_create:
    APP_CREATE:主机已就绪
    <-- App_create:
    --> App_exec:
    APP_exec:发送消息1
    APP_exec:发送消息2.
    APP_exec:发送消息3
    APP_exec:已收到消息、正在发送消息4
    APP_exec:已收到消息、正在发送消息5
    APP_exec:已收到消息、正在发送消息6
    APP_exec:已收到消息、正在发送消息7
    APP_exec:已收到消息、正在发送消息8
    APP_exec:已收到消息、正在发送消息9
    APP_exec:已收到消息、正在发送消息10
    APP_exec:已收到消息、正在发送消息11
    APP_exec:已收到消息、正在发送消息12
    APP_exec:已收到消息、正在发送消息13
    APP_exec:已收到消息、正在发送消息14
    APP_exec:已收到消息、正在发送消息15
    APP_exec:已收到消息
    APP_exec:已收到消息
    APP_exec:已收到消息
    <-- App_exec:0
    --> App_delete:
    <-- App_delete:
    <-- Main_main:
    <--主要:
    root@am57xx-EVM:~#

    root@am57xx-EVM:~# lsmod | grep -ir cmem
    cmemk 31462 0

    您可以尝试按照 processors.wiki.ti.com/.../Processor_SDK_IPC_Quick_Start_Guide 上的 IPC 快速入门指南中的说明进行操作

    在 DSP RTOS 端构建 IPC 示例之前、您确实需要在 ARM Linux 端构建 IPC 库。 如果默认文件夹中未安装 RTOS SDK 和 CCS、则需要导出 TI_RTOS_PATH 和 TI_CCS_PATH。

    ex02_MessageQ 示例包含在 RTOS SDK 和 RTOS_SDK/IPC_xx_xx_xx/examples/DRA7_Linux_elF/ex02_MessageQ 下

    我使用的是具有内核4.4.3.32的 ProcSDK 3.2版本。 上次运行该示例时、我使用的是与您的相同的内核版本、即 v4.4.19的 ProcSDK 3.1。

    雷克斯