您好!
我在测试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