您好!
我在测试A53和M4F通信过程中,尝试用ipc_rpmsg_echo_linux示例测试Vring空间的大小,在配置文件中,我观察到Vring空间有256个缓冲区,每个缓冲区大小为512字节,配置文件代码如下。
/* Number of CPUs that are enabled for IPC RPMessage */ #define IPC_RPMESSAGE_NUM_CORES (2U) /* Number of VRINGs for the numner of CPUs that are enabled for IPC */ #define IPC_RPMESSAGE_NUM_VRINGS (IPC_RPMESSAGE_NUM_CORES*(IPC_RPMESSAGE_NUM_CORES-1)) /* 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)
与是我git clone https://git.ti.com/git/rpmsg/ti-rpmsg-char.git 中的rpmsg_char_simple测试程序代码,重新编译测试程序,以下是我修改后的测试程序中传输数据部分的代码。
/* single thread communicating with a single endpoint */ int rpmsg_char_ping(int rproc_id, char *dev_name, int local_endpt, int remote_endpt, int num_msgs) { int ret = 0; int i = 0; int packet_len; char eptdev_name[32] = { 0 }; char packet_buf[512] = { 0 }; char *str = "hello worldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1234567aaaaaaa"; char str1[1024] = {0}; int data_len = strlen(str); int block_len = 496; rpmsg_char_dev_t *rcdev; int flags = 0; /* * Open the remote rpmsg device identified by dev_name and bind the * device to a local end-point used for receiving messages from * remote processor */ sprintf(eptdev_name, "rpmsg-char-%d-%d", rproc_id, getpid()); rcdev = rpmsg_char_open(rproc_id, dev_name, local_endpt, remote_endpt, eptdev_name, flags); if (!rcdev) { perror("Can't create an endpoint device"); return -EPERM; } printf("Created endpt device %s, fd = %d port = %d\n", eptdev_name, rcdev->fd, rcdev->endpt); printf("Exchanging %d messages with rpmsg device ti.ipc4.ping-pong on rproc id %d ...\n\n", num_msgs, rproc_id); for (i = 0; i < num_msgs; i++) { /* memset(packet_buf, 0, sizeof(packet_buf)); sprintf(packet_buf, "hello there %d!", i); packet_len = strlen(packet_buf); printf("Sending message #%d: %s\n", i, packet_buf); ret = send_msg(rcdev->fd, (char *)packet_buf, packet_len); */ sprintf(str1, "hello there %d,%s", i,str); printf("sending messages #%d,",i); char *block_ptr = str1; do{ if(data_len < 496){ block_len = data_len; } memset(packet_buf, 0, sizeof(packet_buf)); memcpy(packet_buf,block_ptr,block_len); packet_len = strlen(packet_buf); ret = send_msg(rcdev->fd, (char *)packet_buf, packet_len); printf("%s , len = %d \n", packet_buf,packet_len); block_ptr += 496; if (ret < 0) { printf("send_msg failed for iteration %d, ret = %d\n",i, ret); goto out; } if (ret != packet_len) { printf("bytes written does not match send request, ret = %d, packet_len = %d\n", i, ret); goto out; } }while(packet_len == 496); /* printf("Receiving message #%d: ", i); do{ memset(packet_buf, 0, sizeof(packet_buf)); ret = recv_msg(rcdev->fd, 512, (char *)packet_buf, &packet_len); if (ret < 0) { printf("recv_msg failed for iteration %d, ret = %d\n", i, ret); goto out; } printf("%s, len = %d\n", packet_buf,packet_len); }while(packet_len == 496);*/ } for (i = 0; i < num_msgs; i++) { printf("Receiving message #%d: ", i); do{ memset(packet_buf, 0, sizeof(packet_buf)); ret = recv_msg(rcdev->fd, 512, (char *)packet_buf, &packet_len); if (ret < 0) { printf("recv_msg failed for iteration %d, ret = %d\n", i, ret); goto out; } printf("%s, len = %d\n", packet_buf,packet_len); }while(packet_len == 496); } printf("\nCommunicated %d messages successfully on %s\n\n", num_msgs, eptdev_name); out: ret = rpmsg_char_close(rcdev); if (ret < 0) perror("Can't delete the endpoint device\n"); return ret; }
在我的代码中,先只进行发送消息,而不接收,发送超过Vring空间大小的数据。这样按理说会赛满整个Vring空间,最终应该有两个结果,1.程序中断,2.覆盖Vring队列的先写入的数据。
然而最终结果与我想的不一样,我输入指令./rpmsg_char_simple -r 9 -n 1000后,发现所有数据均正常发送和接收,即,先发送了1000条数据(0-999),然后接收了1000条数据(0-999),这是为什么?
为什么Vring空间没有被塞满或者覆盖?明明数据的长度已经超过了Vring空间的大小。
希望能够给我解答,或者给出测试Vring空间的代码和方法,非常感谢
此致
FengLang