您好,我在测试m4f与a53-linux之间的ipc通讯,我git-clone了ti-rpmsg-char代码(链接https://git.ti.com/cgit/rpmsg/ti-rpmsg-char/)
在ti-rpmsg-char代码中稍微修改,重新编译通过。
我将ti-rpmsg-char代码修改成了可以发出任意长度的数据,如下图所示,data_len是一个ssh命令行中获取的发送数据长度,而原代码只能发出"hello there %d"
通过这个程序与m4f进行通讯,m4f端的功能是收到什么内容返回什么内容(有一点我已经明白,发送用户数据不能超过496字节),
如下图所示,当我发送内容小于等于256字节时候,linux可以完整收到m4f端的回复,发送的内容以‘s’开始,以‘e’结束
如下图所示,当我发送内容大于256字节时,linux端就只能收到256字节的数据,发496字节也是返回256字节,发300字节,也是返回256字节,
我通过m4f的串口DebugP_log函数打出了信息,看到m4f是确实收到了所有数据的,且发送的时候也是按收到的长度去传入到RPMessage_send函数进行发送的,
但是就是发不出来,超过256字节就截断。
下图是m4f端vring的配置,vringbuf数量是256个,每个vringbuf长度是512字节(此处已经是512字节,为何出现前文所述的256字节截断问题?)
下面是m4f端的接收发送处部分代码
#define IPC_RPMESSAGE_MAX_MSG_SIZE (512u) char recvMsg[IPC_RPMESSAGE_MAX_MSG_SIZE+1]; /* +1 for NULL char in worst case */ /* 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 */ //DebugP_log("runing task_id=%d localEndPoint=%d rec_cnt=%d\r\n", inputArgs->task_id, localEndPoint, rec_cnt); recvMsgSize = IPC_RPMESSAGE_MAX_MSG_SIZE; status = RPMessage_recv(pRpmsgObj, recvMsg, &recvMsgSize, &remoteCoreId, &remoteCoreEndPt, 0); if(status==SystemP_SUCCESS) { /* echo the same message string as reply */ #if 1 /* not logging this so that this does not add to the latency of message exchange */ recvMsg[recvMsgSize] = 0; /* add a NULL char at the end of message */ //DebugP_log("recvMsg:%s\r\n", recvMsg); #endif /* send ack to sender CPU at the sender end point */ status = RPMessage_send( recvMsg, recvMsgSize, remoteCoreId, remoteCoreEndPt, RPMessage_getLocalEndPt(pRpmsgObj), 5); //DebugP_log("Rec Size=%d Cnt=%d ",recvMsgSize, rec_cnt); rec_cnt ++; if(status==SystemP_SUCCESS) { //DebugP_log("send ok %d\r\n", send_cnt); send_cnt++; } else { DebugP_log("send error = %02X\r\n", status); } //DebugP_assert(status==SystemP_SUCCESS); } else { vTaskDelay(1); } }
问题1:上述的问题出在哪里,如何解决
问题2:下图对应的IPC_RPMESSAGE_NUM_VRING_BUF和IPC_RPMESSAGE_MAX_VRING_BUF_SIZE,这两个参数如何理解?
是不是在ipc通讯中,有NUM_VRING个缓存区,每个缓存区的大小是VRING_BUF_SIZE,如果是这样的话,是不是linux连续发送NUM_VRING个消息,m4f一直不读取,一旦启动读取就可以读取出NUM_VRING个消息?
/* Number of a buffers in a VRING, i.e depth of VRING queue */
#define IPC_RPMESSAGE_NUM_VRING_BUF (256U)
/* Max size of a buffer in a VRING */
#define IPC_RPMESSAGE_MAX_VRING_BUF_SIZE (512U)