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.

AM6442: [IPC RPMSG] Message send to remote core 5 @ 16 end point truncated due to lack of space in vring buffer !!!

Part Number: AM6442

hello:
Now I have two projects: one with version 09_02_00_50 and another with SDK version 10_01_00_32. Both use nortos and utilize cores a53ss0-0 and r5fss1-0. When testing with the same code, the 10_01_00_32 version runs without errors and functions normally, producing the following results.

Output from 10_01_00_32:

However, the 09_02_00_50 version generates an error, and I’m unsure why.

/*
 *  Copyright (C) 2021 Texas Instruments Incorporated
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *    Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 *    Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the
 *    distribution.
 *
 *    Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <kernel/dpl/ClockP.h>
#include <kernel/dpl/DebugP.h>
#include <drivers/ipc_notify.h>
#include <drivers/ipc_rpmsg.h>
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"

/* This example shows message exchange between multiple cores.
 *
 * One of the core is designated as the 'main' core
 * and other cores are designated as `remote` cores.
 *
 * The main core initiates IPC with remote core's by sending it a message.
 * The remote cores echo the same message to the main core.
 *
 * The main core repeats this for gMsgEchoCount iterations.
 *
 * In each iteration of message exchange, the message value is incremented.
 *
 * When iteration count reaches gMsgEchoCount, the example is completed.
 *
 */

/* number of iterations of message exchange to do */
uint32_t gMsgEchoCount = 1000u;

#if defined(SOC_AM243X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_M4FSS0_0,
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_R5FSS1_0,
    CSL_CORE_ID_R5FSS1_1,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined (SOC_AM263X) || defined (SOC_AM263PX)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_R5FSS1_0,
    CSL_CORE_ID_R5FSS1_1,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined(SOC_AM64X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS1_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_A53SS0_0,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined(SOC_AM273X) || defined(SOC_AWR294X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_C66SS0,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined(SOC_AM261X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

/*
 * Remote core service end point
 *
 * pick any unique value on that core between 0..RPMESSAGE_MAX_LOCAL_ENDPT-1
 * the value need not be unique across cores
 */
uint16_t gRemoteServiceEndPt = 16u;
//uint16_t gRemoteServiceEndPt = 3u;

/* maximum size that message can have in this example */
#define MAX_MSG_SIZE        (64u)

/* Main core ack reply end point
 *
 * pick any unique value on that core between 0..RPMESSAGE_MAX_LOCAL_ENDPT-1
 * the value need not be unique across cores
 */
#define MAIN_CORE_ACK_REPLY_END_PT  (12U)
#define DATA_BUFFER_SIZE             1024
/* RPMessage_Object MUST be global or static */
RPMessage_Object gAckReplyMsgObject;

/* 消息结构体 */
struct __attribute__((__packed__)) ipc_buf {
    uint32_t addr;    /* 共享内存物理地址 */
    uint32_t size;    /* 缓冲区大小 */
    uint32_t pattern; /* 模式 */
    uint8_t data[DATA_BUFFER_SIZE];
};


/* RPMessage_Object MUST be global or static */
static RPMessage_Object gRecvMsgObject;

void ipc_rpmsg_echo_remote_core_start(void)
{
    int32_t status;
    struct ipc_buf ibuf;
    uint16_t msgSize;
    RPMessage_CreateParams createParams;
//   uint32_t pattern = 0xAAAA5555; /* 示例模式 */
//    char recvMsg[MAX_MSG_SIZE];
//    uint16_t recvMsgSize;
    uint16_t remoteCoreId, remoteCoreEndPt;

    RPMessage_CreateParams_init(&createParams);
    createParams.localEndPt = gRemoteServiceEndPt;
    status = RPMessage_construct(&gRecvMsgObject, &createParams);
    DebugP_assert(status==SystemP_SUCCESS);

    /* wait for all cores to be ready */
//    IpcNotify_syncAll(SystemP_WAIT_FOREVER);

    DebugP_log("[a53ss0-0] Remote Core waiting for messages from main core ... !!!\r\n");
    ClockP_usleep(500*100); /* wait for log messages from remote cores to be flushed, otherwise this delay is not needed */
    /* wait for messages forever in a loop */
    while(1)
    {
        /* set 'recvMsgSize' to size of recv buffer,
        * after return `recvMsgSize` contains actual size of valid data in recv buffer
        */
//        recvMsgSize = sizeof(recvMsg);
//        status = RPMessage_recv(&gRecvMsgObject,
//            recvMsg, &recvMsgSize,
//            &remoteCoreId, &remoteCoreEndPt,
//            SystemP_WAIT_FOREVER);
//        DebugP_assert(status==SystemP_SUCCESS);

//        DebugP_log("get sync\r\n");
       // IpcNotify_waitSync(CSL_CORE_ID_R5FSS1_0,500*1000000);
        for(int i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++ )
        {
         msgSize = sizeof(ibuf);
         status = RPMessage_recv(&gRecvMsgObject, &ibuf, &msgSize,
                                 &remoteCoreId, &remoteCoreEndPt,
                                 SystemP_WAIT_FOREVER);
         DebugP_assert(status == SystemP_SUCCESS);


        /* echo the same message string as reply */

 //       DebugP_log("a53ss0-0:Buffer @%p (size %d) filled with pattern 0x%08x\r\n", ibuf.addr, ibuf.size, ibuf.pattern);

        }
        /* send ack to sender CPU at the sender end point */
//        status = RPMessage_send(
//            recvMsg, recvMsgSize,
//            remoteCoreId, remoteCoreEndPt,
//            RPMessage_getLocalEndPt(&gRecvMsgObject),
//            SystemP_WAIT_FOREVER);
//        DebugP_assert(status==SystemP_SUCCESS);

        //这里为了做验证,将pattern反转
        ibuf.pattern = ~ibuf.pattern;

        for(int i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++ )
        {
//        status = RPMessage_send(&ibuf, sizeof(ibuf),
//                                gRemoteCoreId[i], remoteCoreEndPt,
//                                RPMessage_getLocalEndPt(&gRecvMsgObject), SystemP_WAIT_FOREVER);
        status = RPMessage_send(&ibuf, sizeof(ibuf),
                                      remoteCoreId, remoteCoreEndPt,
                                      RPMessage_getLocalEndPt(&gRecvMsgObject), SystemP_WAIT_FOREVER);
           DebugP_assert(status == SystemP_SUCCESS);
        }

    }
    /* This loop will never exit */
}

void ipc_rpmsg_echo_main(void *args)
{
    Drivers_open();
    Board_driversOpen();



    ipc_rpmsg_echo_remote_core_start();


    Board_driversClose();
    /* We dont close drivers to let the UART driver remain open and flush any pending messages to console */
    /* Drivers_close(); */
}
/*
 *  Copyright (C) 2021 Texas Instruments Incorporated
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *    Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 *    Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the
 *    distribution.
 *
 *    Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <kernel/dpl/ClockP.h>
#include <kernel/dpl/DebugP.h>
#include <drivers/ipc_notify.h>
#include <drivers/ipc_rpmsg.h>
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"

/* This example shows message exchange between multiple cores.
 *
 * One of the core is designated as the 'main' core
 * and other cores are designated as `remote` cores.
 *
 * The main core initiates IPC with remote core's by sending it a message.
 * The remote cores echo the same message to the main core.
 *
 * The main core repeats this for gMsgEchoCount iterations.
 *
 * In each iteration of message exchange, the message value is incremented.
 *
 * When iteration count reaches gMsgEchoCount, the example is completed.
 *
 */

/* number of iterations of message exchange to do */
uint32_t gMsgEchoCount = 1000u;

#if defined(SOC_AM243X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_M4FSS0_0,
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_R5FSS1_0,
    CSL_CORE_ID_R5FSS1_1,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined (SOC_AM263X) || defined (SOC_AM263PX)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_R5FSS1_0,
    CSL_CORE_ID_R5FSS1_1,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined(SOC_AM64X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS1_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint16_t gRemoteCoreId[] = {
    CSL_CORE_ID_A53SS0_0,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined(SOC_AM273X) || defined(SOC_AWR294X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_C66SS0,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

#if defined(SOC_AM261X)
/* main core that starts the message exchange */
uint32_t gMainCoreId = CSL_CORE_ID_R5FSS0_0;
/* remote cores that echo messages from main core, make sure to NOT list main core in this list */
uint32_t gRemoteCoreId[] = {
    CSL_CORE_ID_R5FSS0_1,
    CSL_CORE_ID_MAX /* this value indicates the end of the array */
};
#endif

/*
 * Remote core service end point
 *
 * pick any unique value on that core between 0..RPMESSAGE_MAX_LOCAL_ENDPT-1
 * the value need not be unique across cores
 */
uint16_t gRemoteServiceEndPt = 13u;

/* maximum size that message can have in this example */
#define MAX_MSG_SIZE        (64u)

/* Main core ack reply end point
 *
 * pick any unique value on that core between 0..RPMESSAGE_MAX_LOCAL_ENDPT-1
 * the value need not be unique across cores
 */
#define MAIN_CORE_ACK_REPLY_END_PT  (12U)
#define REMOTE_CORE_END_PT          (16U)


#define SHARED_MEM_ADDR   0x70180000  //共享内存地址
#define SHARED_MEM_SIZE   (1024*10)   //10k

#define DATA_BUFFER_SIZE  (1024)
/* 消息结构体 */
struct __attribute__((__packed__)) ipc_buf {
    uint32_t addr;    /* 共享内存物理地址 */
    uint32_t size;    /* 缓冲区大小 */
    uint32_t pattern; /* 模式 */
    uint8_t data[DATA_BUFFER_SIZE];
};


/* RPMessage_Object MUST be global or static */
RPMessage_Object gAckReplyMsgObject;


/* 填充缓冲区 */
void buffer_init(uint32_t *buf, uint32_t size, uint32_t pattern) {
    for (uint32_t i = 0; i < size / sizeof(uint32_t); i++) {
        buf[i] = pattern;
    }
    CacheP_wb(buf, size, CacheP_TYPE_ALLD); /* 写回缓存 */
    DebugP_log("r5fss1-0:Buffer @%p (size %d) filled with pattern 0x%08x\r\n", buf, size, pattern);
}

/* 验证缓冲区 */
int buffer_validate(uint32_t *buf, uint32_t size, uint32_t pattern) {
    CacheP_inv(buf, size, CacheP_TYPE_ALLD); /* 失效缓存 */
    for (uint32_t i = 0; i < size / sizeof(uint32_t); i++) {
        if (buf[i] != pattern) {
            DebugP_log("r5fss1-0:Validation error at %p: expected 0x%08x, got 0x%08x\r\n", &buf[i], pattern, buf[i]);
            return -1;
        }
    }
    DebugP_log("r5fss1-0:Buffer validated successfully with pattern 0x%08x\r\n", pattern);
    return 0;
}


void ipc_rpmsg_echo_main_core_start(void)
{
    int32_t status;
    struct ipc_buf ibuf;
    uint16_t msgSize;
    uint32_t *shared_buf = (uint32_t *)SHARED_MEM_ADDR;
    uint32_t pattern = 0xAAAA5555; /* 示例模式 */


    RPMessage_CreateParams createParams;
    uint32_t msg, i, numRemoteCores;
    uint64_t curTime;

    char msgBuf[MAX_MSG_SIZE];
    uint32_t remoteCoreId, remoteEndPt;

    RPMessage_CreateParams_init(&createParams);
    createParams.localEndPt = MAIN_CORE_ACK_REPLY_END_PT;
    status = RPMessage_construct(&gAckReplyMsgObject, &createParams);
    DebugP_assert(status==SystemP_SUCCESS);

    numRemoteCores = 0;
    for(i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++)
    {
        numRemoteCores++;
    }

    /* wait for all cores to be ready */
 //   IpcNotify_syncAll(SystemP_WAIT_FOREVER);

    buffer_init(shared_buf, SHARED_MEM_SIZE, pattern);

    /* 准备消息 */
    ibuf.addr = SHARED_MEM_ADDR;
    ibuf.size = SHARED_MEM_SIZE;
    ibuf.pattern = pattern;



    DebugP_log("[r5fss1-0:] Message exchange started by main core !!!\r\n");
    DebugP_log("ibufsize=%d\n",sizeof(ibuf));
    curTime = ClockP_getTimeUsec();

    for(msg=0; msg<gMsgEchoCount; msg++)
    {
//        snprintf(msgBuf, MAX_MSG_SIZE-1, "%" PRIu32, msg);
//        msgBuf[MAX_MSG_SIZE-1] = 0;
//        msgSize = strlen(msgBuf) + 1; /* count the terminating char as well */

        /* send the same messages to all cores */
        for(i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++ )
        {
            status = RPMessage_send(&ibuf, sizeof(ibuf),
                                    gRemoteCoreId[i], REMOTE_CORE_END_PT,
                                    MAIN_CORE_ACK_REPLY_END_PT, SystemP_WAIT_FOREVER);
               DebugP_assert(status == SystemP_SUCCESS);
         //      IpcNotify_sendSync( gRemoteCoreId[i]);
        }


        memset(&ibuf,0,sizeof(ibuf));
        /* wait for response from all cores */
        for(i=0; gRemoteCoreId[i]!=CSL_CORE_ID_MAX; i++ )
        {
            /* set 'msgSize' to size of recv buffer,
            * after return `msgSize` contains actual size of valid data in recv buffer
            */
            msgSize = sizeof(ibuf);
            status = RPMessage_recv(&gAckReplyMsgObject, &ibuf, &msgSize,
                                    &remoteCoreId, &remoteEndPt,
                                    SystemP_WAIT_FOREVER);
            DebugP_assert(status == SystemP_SUCCESS);
        }
   //     DebugP_log("r5fss1-0:Received inverted pattern 0x%08x\r\n", ibuf.pattern);
    }

    curTime = ClockP_getTimeUsec() - curTime;
    DebugP_log("r5fss1-0:Received inverted pattern 0x%08x\r\n", ibuf.pattern);
    DebugP_log("[IPC RPMSG ECHO] All echoed messages received by main core from %d remote cores !!!\r\n", numRemoteCores);
    DebugP_log("[IPC RPMSG ECHO] Messages sent to each core = %d \r\n", gMsgEchoCount);
    DebugP_log("[IPC RPMSG ECHO] Number of remote cores = %d \r\n", numRemoteCores);
    DebugP_log("[IPC RPMSG ECHO] Total execution time = %" PRId64 " usecs\r\n", curTime);
    DebugP_log("[IPC RPMSG ECHO] One way message latency = %" PRId32 " nsec\r\n",
        (uint32_t)(curTime*1000u/(gMsgEchoCount*numRemoteCores*2)));
    /* 验证回显 */
    if (ibuf.pattern == ~pattern) {
        DebugP_log("r5fss1-0:Received inverted pattern 0x%08x\r\n", ibuf.pattern);
        /* 验证共享内存 */
        status = buffer_validate(shared_buf, SHARED_MEM_SIZE, ibuf.pattern);
        if (status == 0) {
            DebugP_log("r5fss1-0:Buffer validation passed\r\n");
        } else {
            DebugP_log("r5fss1-0:Buffer validation failed\r\n");
        }
    } else {
        DebugP_log("r5fss1-0:Unexpected pattern received: 0x%08x\r\n", ibuf.pattern);
    }

    RPMessage_destruct(&gAckReplyMsgObject);

    DebugP_log("All tests have passed!!\r\n");
}

/* RPMessage_Object MUST be global or static */
static RPMessage_Object gRecvMsgObject;

void ipc_rpmsg_echo_remote_core_start(void)
{
    int32_t status;
    RPMessage_CreateParams createParams;
    char recvMsg[MAX_MSG_SIZE];
    uint16_t recvMsgSize, remoteCoreId, remoteCoreEndPt;

    RPMessage_CreateParams_init(&createParams);
    createParams.localEndPt = gRemoteServiceEndPt;
    status = RPMessage_construct(&gRecvMsgObject, &createParams);
    DebugP_assert(status==SystemP_SUCCESS);

    /* wait for all cores to be ready */
    IpcNotify_syncAll(SystemP_WAIT_FOREVER);

    DebugP_log("[r5fss1-0] Remote Core waiting for messages from main core ... !!!\r\n");

    /* wait for messages forever in a loop */
    while(1)
    {
        /* set 'recvMsgSize' to size of recv buffer,
        * after return `recvMsgSize` contains actual size of valid data in recv buffer
        */
        recvMsgSize = sizeof(recvMsg);
        status = RPMessage_recv(&gRecvMsgObject,
            recvMsg, &recvMsgSize,
            &remoteCoreId, &remoteCoreEndPt,
            SystemP_WAIT_FOREVER);
        DebugP_assert(status==SystemP_SUCCESS);

        /* echo the same message string as reply */

        /* send ack to sender CPU at the sender end point */
        status = RPMessage_send(
            recvMsg, recvMsgSize,
            remoteCoreId, remoteCoreEndPt,
            RPMessage_getLocalEndPt(&gRecvMsgObject),
            SystemP_WAIT_FOREVER);
        DebugP_assert(status==SystemP_SUCCESS);
    }
    /* This loop will never exit */
}

void ipc_rpmsg_echo_main(void *args)
{
    Drivers_open();
    Board_driversOpen();

    if(IpcNotify_getSelfCoreId()==gMainCoreId)
    {
        ipc_rpmsg_echo_main_core_start();
    }

    Board_driversClose();
    /* We dont close drivers to let the UART driver remain open and flush any pending messages to console */
    /* Drivers_close(); */
}

Output from 09_02_00_50:

r5fss1-0: Buffer @70180000 (size 10240) filled with pattern 0xaaaa5555
[r5fss1-0:] Message exchange started by main core !!!
ibufsize=1036
WARNING: RPMessage_send:264: [IPC RPMSG] Message send to remote core 5 @ 16 end point truncated due to lack of space in vring buffer !!!



The shared memory configurations for IPC, including addresses and sizes, are identical in both projects. Please help me investigate this issue. I’ve attached the `ipc_rpmsg_echo.c` files for both the A-core and R-core.