Tool/software:
Hello, experts
I want to test the IPC driver provided in the RTOS SDK on my J721E. However, during this process, I found that the program for testing IPC would be blocked when calling Sciclient_init
, which prevented me from testing the IPC driver.
When testing the IPC driver, I hope to achieve the following functions:
mcu1_1(baremetal) sends a msg to mcu2_0(baremetal) through the IPC driver
In order to achieve the above-mentioned functions, I referred to 4.11.9.Writing HelloWorld App using IPCLLD
I also referred to the < PDK_INSTALL_PATH >/packages/ti/drv/ipc/examples/common/src/ipc_testsetup_baremetal.c
file
I have respectively written two test codes, ipc_test_mcu1_1.c
and ipc_test_mcu2_0.c
, as follows:
/* * ipc_test_mcu1_1.c */ #include <stdint.h> #include <ti/board/board.h> #include <ti/csl/tistdtypes.h> #include <ti/drv/ipc/examples/common/src/ipc_setup.h> #include <ti/drv/ipc/ipc.h> #include <ti/drv/ipc/soc/V1/ipc_soc.h> #include <ti/drv/sciclient/sciclient.h> #include <ti/drv/uart/UART_stdio.h> uint32_t virt2phy_func(const void *virtAddr) { return ((uint32_t)virtAddr); } void *phy2virt_func(uint32_t phyAddr) { uint32_t temp = phyAddr; return ((void *)temp); } void newmsg_callback_func(uint32_t srcEndPt, uint32_t procId) { return; } void uart_print(const char *str) { UART_printf("%s", str); return; } uint8_t vqBuf[VQ_BUF_SIZE] __attribute__((section("my_ipc_data_buffer"), aligned(8))); uint8_t selfBuf[RPMSG_DATA_SIZE] __attribute__((section("my_ipc_data_buffer"), aligned(8))); int main(void) { Sciclient_ConfigPrms_t config; Sciclient_configPrmsInit(&config); Sciclient_init(&config); Board_initCfg boardCfg; boardCfg = BOARD_INIT_PINMUX_CONFIG | BOARD_INIT_UART_STDIO; Board_init(boardCfg); UART_printf("IPC_echo_test mcu1_1\n"); uint32_t numProc = 1; uint32_t pRemoteProcArray[] = {IPC_MCU2_0}; uint32_t selfProcId = IPC_MCU1_1; uint32_t selfPt = 10; uint32_t remotePt = 10; uint32_t remoteProcId = IPC_MCU2_0; Ipc_InitPrms initPrms; Ipc_VirtIoParams vqParam; /* Step1 : Initialize the multiproc */ if (IPC_SOK == Ipc_mpSetConfig(selfProcId, numProc, pRemoteProcArray)) { UART_printf("IPC_echo_test (core : %s) .....\r\n", Ipc_mpGetSelfName()); /* Initialize params with defaults */ IpcInitPrms_init(0U, &initPrms); initPrms.newMsgFxn = &newmsg_callback_func; initPrms.virtToPhyFxn = &virt2phy_func; initPrms.phyToVirtFxn = &phy2virt_func; initPrms.printFxn = &uart_print; if (IPC_SOK != Ipc_init(&initPrms)) { return -1; } } else { UART_printf("Ipc_mpSetConfig failed\n"); } /* Step2 : Initialize Virtio */ vqParam.vqObjBaseAddr = (void *)vqBuf; vqParam.vqBufSize = numProc * Ipc_getVqObjMemoryRequiredPerCore(); vqParam.vringBaseAddr = (void *)VRING_BASE_ADDRESS; vqParam.vringBufSize = IPC_VRING_BUFFER_SIZE; vqParam.timeoutCnt = 100; /* Wait for counts */ Ipc_initVirtIO(&vqParam); /* Step 3: Initialize RPMessage */ RPMessage_Params selfRPMsgParam; RPMessageParams_init(&selfRPMsgParam); selfRPMsgParam.buf = selfBuf; selfRPMsgParam.bufSize = RPMSG_DATA_SIZE; selfRPMsgParam.stackBuffer = NULL; selfRPMsgParam.stackSize = 0U; selfRPMsgParam.requestedEndpt = remotePt; RPMessage_init(&selfRPMsgParam); RPMessage_Handle selfRPMsgHandle; selfRPMsgHandle = RPMessage_create(&selfRPMsgParam, &selfPt); char sendMsg[256] = "hello from mcu1_1"; uint32_t msgLen = strlen(sendMsg); int32_t status = RPMessage_send(selfRPMsgHandle, remoteProcId, remotePt, selfPt, (void *)sendMsg, msgLen); if (status != IPC_SOK) { UART_printf("Failed: RPMessage %s ----> %s\nMsg: %s\n", Ipc_mpGetSelfName(), Ipc_mpGetName(remoteProcId), sendMsg); } else { UART_printf("Success: RPMessage %s ----> %s\nMsg: %s\n", Ipc_mpGetSelfName(), Ipc_mpGetName(remoteProcId), sendMsg); } return (0); }
/* * ipc_test_mcu2_0.c */ #include <stdint.h> #include <ti/board/board.h> #include <ti/csl/tistdtypes.h> #include <ti/drv/ipc/examples/common/src/ipc_setup.h> #include <ti/drv/ipc/ipc.h> #include <ti/drv/ipc/soc/V1/ipc_soc.h> #include <ti/drv/sciclient/sciclient.h> #include <ti/drv/uart/UART_stdio.h> uint32_t virt2phy_func(const void *virtAddr) { return ((uint32_t)virtAddr); } void *phy2virt_func(uint32_t phyAddr) { uint32_t temp = phyAddr; return ((void *)temp); } void newmsg_callback_func(uint32_t srcEndPt, uint32_t procId) { return; } void uart_print(const char *str) { UART_printf("%s", str); return; } uint8_t vqBuf[VQ_BUF_SIZE] __attribute__((section("my_ipc_data_buffer"), aligned(8))); uint8_t selfBuf[RPMSG_DATA_SIZE] __attribute__((section("my_ipc_data_buffer"), aligned(8))); int main(void) { Sciclient_ConfigPrms_t config; Sciclient_configPrmsInit(&config); Sciclient_init(&config); Board_initCfg boardCfg; boardCfg = BOARD_INIT_PINMUX_CONFIG | BOARD_INIT_UART_STDIO; Board_init(boardCfg); UART_printf("IPC_echo_test mcu2_0\n"); uint32_t numProc = 1; uint32_t pRemoteProcArray[] = {IPC_MCU1_1}; uint32_t selfProcId = IPC_MCU2_0; uint32_t selfPt = 10; uint32_t remotePt = 10; uint32_t remoteProcId = IPC_MCU1_1; Ipc_InitPrms initPrms; Ipc_VirtIoParams vqParam; /* Step1 : Initialize the multiproc */ if (IPC_SOK == Ipc_mpSetConfig(selfProcId, numProc, pRemoteProcArray)) { UART_printf("IPC_echo_test (core : %s) .....\r\n", Ipc_mpGetSelfName()); /* Initialize params with defaults */ IpcInitPrms_init(0U, &initPrms); initPrms.newMsgFxn = &newmsg_callback_func; initPrms.virtToPhyFxn = &virt2phy_func; initPrms.phyToVirtFxn = &phy2virt_func; initPrms.printFxn = &uart_print; if (IPC_SOK != Ipc_init(&initPrms)) { return -1; } } else { UART_printf("Ipc_mpSetConfig failed\n"); } /* Step2 : Initialize Virtio */ vqParam.vqObjBaseAddr = (void *)vqBuf; vqParam.vqBufSize = numProc * Ipc_getVqObjMemoryRequiredPerCore(); vqParam.vringBaseAddr = (void *)VRING_BASE_ADDRESS; vqParam.vringBufSize = IPC_VRING_BUFFER_SIZE; vqParam.timeoutCnt = 100; /* Wait for counts */ Ipc_initVirtIO(&vqParam); /* Step 3: Initialize RPMessage */ RPMessage_Params selfRPMsgParam; RPMessageParams_init(&selfRPMsgParam); selfRPMsgParam.buf = selfBuf; selfRPMsgParam.bufSize = RPMSG_DATA_SIZE; selfRPMsgParam.stackBuffer = NULL; selfRPMsgParam.stackSize = 0U; selfRPMsgParam.requestedEndpt = remotePt; RPMessage_init(&selfRPMsgParam); RPMessage_Handle selfRPMsgHandle; selfRPMsgHandle = RPMessage_create(&selfRPMsgParam, &selfPt); char recvMsg[256] = {0}; uint16_t msgLen = strlen(recvMsg); int32_t status = RPMessage_recv(selfRPMsgHandle, recvMsg, &msgLen, &remotePt, &remoteProcId, IPC_RPMESSAGE_TIMEOUT_FOREVER); if (status != IPC_SOK) { UART_printf("Failed: RPMessage %s <---- %s\nMsg: %s\n", Ipc_mpGetSelfName(), Ipc_mpGetName(remoteProcId), recvMsg); } else { UART_printf("Success: RPMessage %s <---- %s\nMsg: %s\n", Ipc_mpGetSelfName(), Ipc_mpGetName(remoteProcId), recvMsg); } return (0); }
After successfully compiling the above code, I debugged the above code through CCS
The basic debugging process is:
1.Refer to EVM Setup for J721E to configure J721E
2.Refer to CCS Setup for J721E to successfully connect to J721E using CCS
3.Run the sciserver_testapp
program in mcu1_0
4.Run the ipc_test_mcu2_0
program in mcu2_0
5.Run the ipc_test_mcu1_1
program on mcu1_1
During the debugging process, both ipc_test_mcu1_1
and ipc_test_mcu2_0
will be blocked in the Sciclient_init
statement, causing the program to fail to execute normally
I want to ask the experts why my program is blocking to Sciclient_init
?
How should I modify my program so that it can execute normally?
The version of SDK I'm using is:PROCESSOR-SDK-RTOS-J721E —10.00.00.05