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/AM5728:IPC CMEM 区域和共享区域

Guru**** 2593120 points
Other Parts Discussed in Thread: SYSBIOS, AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/636703/rtos-am5728-ipc-cmem-area-and-shared-regions

器件型号:AM5728
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我对 ex41_forwardmsg 中的 IPC 内存映射使用有一些疑问:

devicetree 指定以下地址源/大小:
IPU1:0x9580 0000 / 0x0380 0000 (56M)
DSP1:0x9900 0000/0x0400 0000 (64M)
IPU1:0x9D00 0000/0x0200 0000 (32M)
DSP2:0x9F00 0000/0x0080 0000 (8M)
CMEM:0xA000 0000/0x0C00 0000 (192M)

在 config.Bld 中提供了以下信息:
DSP1:
 * 虚拟    物理       大小           注释
 ** *****************************************************************************************************
 * 9500_0000  ???0_0000   10_0000 ( ~1 MB) EXT_CODE
 * 9510_0000  ??0_0000   10_0000 (  1 MB) EXT_DATA
 * 9520_0000  ???0_0000   30_0000 (  3 MB) EXT_HAP
 * 9F00_0000  ???0_0000    6_0000 (384KB) TRACE_BUF
 * 9F06_0000  ???6_0000    1_0000 ( 64KB) EXC_DATA
 * 9F07_0000  ???7_0000    2_0000 (128KB) PM_DATA (电源管理)
 * BFC0_0000  ???0_0000   10_0000 (  1 MB) SR0 (共享区域)
IPU1:
 * 虚拟    物理       大小           注释
 ** *****************************************************************************************************
 * 0000_4000  ???0_4000    F_C000 ( ~1 MB) EXT_CODE
 * 8000_0000  ??0_0000   20_0000 (  2 MB) EXT_DATA
 * 8020_0000  ???0_0000   30_0000 (  3 MB) EXT_HAP
 * 9F00_0000  ???0_0000    6_0000 (384KB) TRACE_BUF
 * 9F06_0000  ???6_0000    1_0000 ( 64KB) EXC_DATA
 * 9F07_0000  ???7_0000    2_0000 (128KB) PM_DATA (电源管理)
 * BFC0_0000  ???0_0000   10_0000 (  1 MB) SR0 (共享区域)
(我添加了共享区0信息)

RSC_Table_dsp1:
#define DSP_MEM_TEXT           0x95000000
#define DSP_MEM_IOBUFS         0x8000000
#define DSP_MEM_DATA           0x95100000
#define DSP_MEM_HEAP           0x95200000
#define DSP_SR0_virt           0xBFC00000
#define DSP_SR0                0xBFC00000
#define DSP_MEM_IPC_DATA       0x9F000000
#define DSP_MEM_IPC_VRING      0xA0000000
#define DSP_MEM_RPMSG_VRING0   0xA0000000
#define DSP_MEM_RPMSG_VRING1   0xA0004000
#define DSP_MEM_VING_BUFS0    0xA0040000
#define DSP_MEM_VRING_BUFS1    0xA0080000
#define PHYS_MEM_IPC_VRING     0x99000000

RSC_Table_ipu1:
#define IPU_MEM_TEXT           0x0
#define IPU_MEM_DATA           0x8000000
#define IPU_SR0_virt           0xBFC00000
#define IPU_SR0                0xBFC00000
#define IPU_MEM_IPC_DATA       0x9F000000
#define IPU_MEM_IPC_VRING      0x60000000
#define IPU_MEM_RPMSG_VRING0   0x60000000
#define IPU_MEM_RPMSG_VRING1   0x60004000
#define IPU_MEM_VING_BUFS0    0x60040000
#define IPU_MEM_VING_BUFS1    0x60080000
#define PHYS_MEM_IPC_VRING     0x9D000000

- IPU/DSP 地址是否全部由 phys_MEM_IPC_VRING 中给出的偏移重新映射?

- TRACE_BUF、EXC_DATA 和 PM_DATA 段的偏移量很大、超出了分割范围。 它们指向哪个物理地址?

- IPU_SR0和 DSP_SR0位于0xBFC00000 (PHY)。 这在 RAM 内部、但在任何分割区之外。 Linux 端如何知道共享区域0使用此区域?


我需要修改以更改存储器映射的文件包括:
-用于指定 CMA 原点和长度的 Linux 设备树包含文件,以及 cmem origin 和 length
- config.bld (链接器信息)
- ipc.cfg.xs (共享区域配置)
- rsc_table.h (地址信息;两个版本、一个用于 DSP、一个用于 IPU)

我错过了什么吗?


对于我们的应用、我想在 Linux/DSP/IPU 之间交换消息。
- IPU 和 DSP 同时使用一个共享区域来分配内存(用于 MessageQ 消息)是否安全?
-我是否需要设置共享区域来为 MessageQ 消息分配内存,或者是否可以在 CMEM 区域之外使用? (CMEM 是否实现 IHeap?)
-共享区域仅用于 SYSBIOS,我是否可以将共享区域中分配的消息发送到 Linux MessageQ?


我还想在 Linux/DSP/IPU 之间共享一个大内存块、因为我要使用 CMEM 保留的一个 RAM 块。 这是推荐的方式吗?


此致、
环路2.


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

    您好!

    另一个问题:我尝试添加一个共享区域、如示例 ex41中所示。

    我仍然得到:

    TI.sdo.ipc.堆.HeapBufMP:错误:第812行:断言失败:A_noHeap:区域没有堆
    TI.sdo.ipc.堆.HeapBufMP:第812行:断言故障:A_noHeap:区域没有堆

     

    我在 config.Bld 中添加了一个条目、提供了自定义 rsc_table.h (包含 SR0条目)、在 Dsp1.cfg 中添加了该模块(var HeapBufMP  = xdc.useModule('ti.sdo.ipc.heaps.HeapBufMP');)、启用了自定义表(Resource.customTable = true)。

    生成的映射文件显示 SR0的条目:

    存储器配置

            名称           源   长度     使用    未使用  的属性   填充
    ------------  ----  ------  ----  ----  --------  
     L2SRAM               00800000  00040000 00000000 00040000 RW X
     OCMC_RAM1            40300000  00080000 00000000 00080000 RW X
     OCMC_RAM2            40400000  00100000 00000000 00100000 RW X
     OCMC_RAM3            40500000  00100000 00000000 00100000 RW X
     EXT_CODE             95000000  00100000 0002ca68 000d3598 RW X
     EXT_DATA             95100000  00100000 000730c0 0008cf40 RW  
     EXT_HEAP             95200000  00300000 00000000 00300000 RW  
     TRACE_BUF            9f000000  00060000 00008004 00057ffc RW  
     EXC_DATA             9f060000  00010000 00000200 0000fe00 RW  
     PM_DATA              9f070000  00020000 00000000 00020000 RW X
     SR_0                 bfc00000  00100000 00100000 00000000 rw

     

    我搜索了文档(Wiki)、但找不到缺失的位。

    此致、

    环路2.

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

    将尝试回答您的所有问题。 同时、您可以检查 Processor SDK 中的 BigData IPC 示例是否有用?

    processors.wiki.ti.com/.../Processor_SDK_Big_Data_IPC_Examples

    "TI 标准 IPC 软件包中的 Linux 目前不支持共享区和 HeapMem 模块。

    该示例为这些模块提供了为 Linux 实现的相同/相似 API、但有一些限制。

    CMEM API 为大数据缓冲区提供连续存储器的用户空间分配。 "

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

    您好、Garrett、

    感谢大数据示例、我将详细介绍它! 我不知道这个示例、只查看了 IPC/示例子目录。

    关于 DRA7xx_Linux 的 ex02和 ex41示例:

    ex02根本不调用 IPC_Attach、但 MessageQ 起作用;ex41调用 IPC_Attach (如手册中所述)。 这使我很困惑。

    如果我有多个线程、如何确保第一个线程调用 IPC_Attach?

    在创建任何线程之前、从主上下文调用它是否安全? (如果失败、我会跳过线程创建)

    此致、

    环路2.

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

    Ipc.procSync 配置启动协议。 使用 IPC.ProcSync_pair 时、需要调用 IPC_Attach。 对于 ex41、请参阅

    /dsp1/Dsp1.cfg:Ipc.procSync = IPC.ProcSync_pair;
    /ipu1/ipu1.cfg:Ipc.procSync = ipc.ProcSync_pair;

    在这里、DSP 和 IPU 都在运行 RTOS。 您可以在 processors.wiki.ti.com/.../IPC_Training_2_21.pdf 幻灯片中找到 IPC_START 和 IPC_Attach 的详细信息

    需要在 BIOS_start()之后的任务/线程中调用 IPC_attach。 不确定为什么需要第一个线程调用 IPC_Attach、但您可以管理任务/线程的优先级以获取第一个(高优先级)任务/线程来调用 IPC_Attach。

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

    您好、Garret、

    在 ex41中、Dsp1.cfg 具有以下两个条目:

    VAR BIOS       = xdc.useModule('ti.sysbios.BIOS');
    BIOS.addUserStartupFunction ('&IpcMgr_ipcStartup');

    VAR IPC = xdc.useModule('ti.sdo.ipc.Ipc');
    Ipc.procSync = IPC.ProcSync_pair;
    BIOS.addUserStartupFunction ('&IpcMgr_callIpcStart');

    我假设 BIOS_start()随后将为我调用 IPC_start(),对吧? (通过 IpcMgr.c 中的 IpcMgr_callIpcStart())

    因此、除非我使用 ProcSync_all、否则我需要与每个目标 CPU 配对。 我不会使用 ProcSync_all、因为我禁用了一个 DSP 和一个 IPU、并且不确定是否会正确处理。

    谢谢!

    环路2.

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

    >>我假设 BIOS_start()随后将为我调用 IPC_start(),对吧? (通过 IpcMgr.c 中的 IpcMgr_callIpcStart())
    正确。

    如果在 ex41_forwardmsg/shared/ipc.cfg.xs 中使用已知连接的内核更新 procNameAry、则仍应能够使用 ProcSync_all:

    VAR procNameAry =["host"、"IPU1"、"DSP1"];

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

    SharedRegion 对我来说显然不是很有用:我发送的大多数消息都来自 SYSBIOS 端。

    如果我在一个共享区上分配内存并将其发送到 Linux 端、则会收到一条消息、但内容错误(第一个 uint32_t 已改编)。
    您能确认这不应该起作用吗?

    ex41将消息从 SYSBIOS 端发送到 Linux、但始终在 Heap0上分配。 Heap1、共享区堆仅用于发送到 DSP/IPU 的消息、而不是 Linux。

    现在我可以使用 heap0、但默认大小设置为3MB、显然其中有很多正在使用。 一些新的 MessageQ_alloc 调用稍后会失败。

    -如何查看 heap0的堆使用情况/调试堆分配?
    -在 config.Bld 中增加堆大小是否足够?
    - MessageQ 和 MessageQ_Message 在堆上分配了多少内存?

    (我的消息通常是标头(32B)、并且仅多100个字节的数据)


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

    >>如果我在一个共享区上分配内存并将其发送到 Linux 端,则会收到一条消息,但内容错误(第一个 uint32_t 已改编)。 您能确认这不应该起作用吗?
    可以使用和不使用堆来分配消息。 消息通过 rpmsg 而不是 SharedRegion 在 Linux 和 BIOS 之间传递。 如果您在 SharedRegion 上分配内存、消息仍通过 rpmsg 到达 Linux、但您需要确保"消息的第一个字段必须仍然是 MsgHeader。 要确保 MsgHeader 具有有效的设置,应用程序必须调用 MessageQ_staticMsgInit(),请参见 processors.wiki.ti.com/.../MessageQ_Module。 共享区并不是 Linux 和 SYS/BIOS 之间真正共享的。

    >-如何查看 heap0的堆使用情况/调试堆分配?
    >-在 config.Bld 中增加堆大小是否足够?
    >- MessageQ 和 MessageQ_Message 在堆上分配了多少内存?

    关于堆使用、请参阅 processors.wiki.ti.com/.../HeapMP_Modules

    但是、增加堆大小似乎不是一个解决方案。 您似乎一直在分配消息、然后使用堆。 您是否在主机收到消息后通过调用 MessageQ_free 来释放消息?

    每个消息大小不能超过 rpmsg 缓冲区的512字节限制、并且"缓冲区的数量将根据 vring 支持的缓冲区数量计算、最多512个缓冲区(每个方向256个)。 每个缓冲区的 msg 标头将有16个字节、有效负载将有496个字节。 这将为缓冲器使用最大256KB 的总空间。" 请参阅 Linux 内核驱动程序/rpmsg/virtio_rpmsg_BUS.c 虚拟环缓冲区是从 Linux 设备树中定义的 CMA 内存中分配的,请参见资源表。 仅供参考、有一个补丁程序可调整 rpmsg 缓冲区大小、 patchwork.kernel.org/.../ 、但尚未批准/合并到主流中。

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

    感谢您的快速回复!


    >但是增加堆大小似乎不是一个解决方案。 似乎您一直在分配消息、然后>使用堆。 您是否在主机收到消息后通过调用 MessageQ_free 来释放消息?

    我在 Linux 端调用 MessagQ_free ()。

    我拥有的基本上是 IPU 上的一个自由运行的 SYSBIOS 线程、该线程在无限循环中执行以下操作:

    /*标头*/
    typedef 结构{
    MessageQ_MsgHeader保留;
    request_t request;
    uint32_t 大小;
    void*地址;
    }MEMORY_MESSAGE_t;

    typedef 结构{
    MessageQ_QueueID 内存队列;
    MessageQ_Handle memoryResponseQueue;
    }sharedmemoryHandle_t;

    /* init */
    MessageQ_Params_init (&msgqParams);
    执行{
    状态= MessageQ_open (memory_message_queue_name、&shm->memoryQueue);
    睡眠(1);
    } while (status =MessageQ_E_NOTFOUND);

    MessageQ_Params_init (&msgqParams);
    sprintf (name、"MEMORYREPLY%i%i"、MultiProc_self ()、UNIQUE id);
    SHM->memoryResponseQueue = MessageQ_create (name、&msgqParams);

    /*稍后*/
    无限循环{
    memory_message_t* msg;
    MSG =(memory_message_t*) MessageQ_alloc (memory_heap_ID、sizeof (memory_message_t));
    MessageQ_setReplyQueue (shm->memoryResponse Queue、(MessageQ_Msg)(msg));
    MessageQ_Put (shm->memoryQueue、(MessageQ_Msg) msg);
    MessageQ_get (shm->memoryResponseQueue、(MessageQ_Msg*)&msg、MessageQ_forever);
    MessageQ_free ((MessageQ_Msg) msg);
    Task_sleep (200);


    现在 memory_heap_ID 为零(使用默认堆)
    我之前尝试过使用 SharedRegion 堆、但正如您所解释的、这只适用于 DSP<->IPU (SYSBIS-SYSBIOS)。

    使用上面的代码、它可以运行一段时间、但随后失败:请求只能为0或1 (枚举)、但一段时间后它具有有趣的值(在 Linux 接收端)。
    我假设内存队列是线程安全的、因为上面列出的(测试)代码在 AM57xx IPU (双 M4)上的多个线程中运行。 现在我只运行一个线程、它也会失败、因此这不是问题。

    Linux 接收代码:

    无限循环(在 pthread 中){
    状态= MessageQ_get (memoryQueue、(MessageQ_Msg *)&msg、memory_poll_interval_ms*1000);
    if (status=MessageQ_S_Success){
    MessageQ_QueueID 队列 ID;
    QueueID = MessageQ_getReplyQueue (msg);
    /*执行操作*/
    MessageQ_Put (QueueID、(MessageQ_Msg) msg);




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

    您能否澄清一下您的意思:"但失败:请求只能是0或1 (枚举)、但稍后它具有有趣的值?" 您期望什么值?您得到什么值?

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

    我创建了有关以下内容的新帖子:
    e2e.ti.com/.../640731

    附加到消息的信息存在问题。

    我在 Linux 方面的设置:
    两个 pthread 正在运行。

    -第一个线程创建 MessageQ "记录器"、循环{每250ms 轮询一次}
    (我可以永远使用等待、但不能终止循环)
    它收到的消息类型为:
    typedef 结构{
    MessageQ_MsgHeader保留;
    uint8日志级别;
    字符LogEntry[256];
    }LOG_MESSAGE_t;
    接收消息并处理内容(至文件、stdout、...) 工作正常。
    通过 IPU->Linux、DSP->Linux 和 Linux->Linux 测试

    消息在 IPU 上分配并在 Linux 中释放


    -第二个线程创建 MessageQ "存储器"、循环{每250ms 轮询一次}
    (在这里也是如此:我可以永远使用等待、但我不能终止循环)
    它收到的消息类型为:
    typedef 结构{
    MessageQ_MsgHeader保留;
    request_t request;
    uint32_t 大小;
    void*地址;
    }MEMORY_MESSAGE_t;

    使用:typedef enum{MEM_ALLOCATE、MEM_FREE}request_t;

    目的是通过指针将 CMEM 块从 Linux 传输到 IPU (如 cmem 示例、大数据示例)
    消息在 IPU 上分配并在 Linux 中释放。 目前还没有返回路径、也没有访问 CMEM 的权限。 目前、这只是一个队列、用于将消息从 IPU 发送到 Linux。


    在 IPU (AM5728、那么双 M4?)上、SYSBIOS 创建三个任务:
    第一个任务是管理/控制任务,每1000个节拍向记录器 MessageQ 记录一条消息
    第二个循环是无限循环,现在测试它只能将日志发送到记录器队列
    -第三个任务也使用记录器队列并发送内存请求:
    MessageQ_Params mqp_memory;
    MessageQ_Handle MQ_MEMORY;
    MessageQ_QueueID MQ_id;

    MessageQ_Params_init (&mqp_memory);
    执行{
    状态= MessageQ_open (memory_message_queue_name、&mq_id);
    Task_sleep (1);
    }while (status=MessageQ_E_NOTFOUND);
    循环:{
    Logger (3、"I task:Alloc");
    /*分配消息*/
    //使用默认堆0:
    memory_message_t* msg2 =(memory_message_t*) MessageQ_alloc (0、sizeof (memory_message_t));
    if (msg2 =NULL) System_abort ("i task:message alloc failed");

    /*填充内容... *
    msg2->request = MEM_ALLOCATE;
    msg2->size=i++;

    /*。。然后发送*/
    MessageQ_Put (MQ_id、(MessageQ_Msg) msg2);


    在 Linux 端、我收到消息并打印内容:
    循环:{
    状态= MessageQ_get (MQ_MEMORY、(MessageQ_Msg*)&msg、MQ_POLL_INTERVE_MS*1000);
    if (status=MessageQ_S_Success){
    printf ("mem:请求:%i、大小:%i、地址:0x%x\n"、
    msg->request、msg->size、msg->address);
    MessageQ_free ((MessageQ_Msg) msg);

    否则、如果(status=MessageQ_E_TIMEOUT){

    否则{
    printf ("内存线程:接收消息0x%x\n"、status 时出错);



    现在、这里是输出:
    MEM:请求:0、大小:0、地址:0x0
    MEM:请求:0、大小:1、地址:0x0
    MEM:请求:0、大小:2、地址:0x0
    MEM:请求:0、大小:3、地址:0x0
    MEM:请求:0、大小:4、地址:0x0
    MEM:请求:0、大小:5、地址:0x0
    MEM:请求:0、大小:6、地址:0x0
    MEM:请求:0、大小:7、地址:0x0
    MEM:请求:0、大小:8、地址:0x0
    MEM:请求:0、大小:9、地址:0x0
    MEM:请求:0、大小:10、地址:0x0
    MEM:请求:0、大小:11、地址:0x0
    MEM:请求:0、大小:12、地址:0x0
    MEM:请求:0、大小:13、地址:0x0
    MEM:请求:0、大小:14、地址:0x0
    MEM:请求:0、大小:15、地址:0x0
    MEM:请求:0、大小:16、地址:0x0
    MEM:请求:1768843520、大小:17、地址:0x74206b73
    MEM:请求:1768843520、大小:18、地址:0x74206b73
    MEM:请求:1768843520、大小:19、地址:0x74206b73
    MEM:请求:1768843520、大小:20、地址:0x74206b73
    MEM:请求:1768710400、大小:21、地址:0x206b7361
    MEM:请求:1768843520、大小:22、地址:0x74206b73
    MEM:请求:1768843520、大小:23、地址:0x74206b73
    MEM:请求:1768843520、大小:24、地址:0x74206b73
    MEM:请求:1768843520、大小:25、地址:0x74206b73
    MEM:请求:1768710400、大小:26、地址:0x206b7361
    MEM:请求:1768843520、大小:27、地址:0x74206b73
    MEM:请求:1768843520、大小:28、地址:0x74206b73
    MEM:请求:1768843520、大小:29、地址:0x74206b73
    MEM:请求:1768843520、大小:30、地址:0x74206b73


    如果我在 IPU 上运行单个任务、这似乎是可以的、但我不确定。

    因此、我希望请求始终为"0"。 (以前可能是0或1、但现在我已将代码减少为始终发送0)。

    如果您有兴趣、我可以通过邮件将项目发送给您。

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

    您的代码看起来正常、您能不能附加您的项目、以便我们可以在结束时对其进行测试?

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


    我已经发现一个问题、我认为这是导致上述问题的原因:

    枚举的大小应为'int'、因此 sizeof (my_enum_t)=sizeof (int)。

    M4的 ti arm 编译器(AM57xx 的 IPU)显示:IPU sizeof (my_enum_t):1.
    linux/gcc 提示:linux sizeof (my_enum_t):4.

    因此、如果您在 MessageQ_Msg 中使用这样的枚举、会导致问题。

    对于上述问题、我在以下代码中使用了此结构:

    typedef enum{MEM_ALLOCATE、MEM_FREE}request_t;

    typedef 结构{
    MessageQ_MsgHeader 保留;
    request_t request;
    uint32_t 大小;
    void*地址;
    }MEMORY_MESSAGE_t;

    由于所需的转换、我不会遇到错误、但 request_t 的大小取决于所使用的编译器。 它的大小应为 int (根据 C11)。
    因此、对于 AM57xx 系统、我希望它在所有三个内核(A15、M4、C6000)上都具有4个字节。
    我已经检查了 IPU 和 Linux、它们是不同的。

    我不确定 TI 编译器为什么仅使其成为1个字节、我使用以下编译器标志:
    -qq -pdsw225 -ppd=$@.dep -ppa -@configuro/compiler.opt
    使用-@configuro/compiler.opt 是生成的任何 xs。

    您能否检查 TI ARM 编译器是否应生成大小为1字节的枚举?
    C6000编译器有什么作用?

    如果您需要该代码、能否向我提供电子邮件地址?

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

    对于 TI ARM、设置编译器标志--enum_type=int、这应该将其设置为4字节。 C6000编译器默认将其设置为4个字节、但用户可以通过设置编译器标志--small_enum 将其设置为1个字节。

    我将很快向您发送有关该项目的电子邮件。

    最棒的
    Sahin