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.

AM625: 使用ipc_rpmsg测试Vring空间实际大小,产生的结果与我预期的不符合

Part Number: AM625

您好!

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

  • 1. 缓冲区大小不是512字节:您提到配置文件中每个缓冲区大小为512字节,但实际上可能不是这样。您可以检查一下配置文件中的缓冲区大小是否正确,并确保它与您的代码中使用的缓冲区大小一致。

    2. 消息长度被截断:如果您的消息长度大于缓冲区大小,那么它可能会被截断。这意味着您可能没有发送完整的消息,因此Vring空间没有被塞满。您可以尝试发送小于或等于缓冲区大小的消息,以确保消息被正确发送。

    3. 接收端没有处理所有消息:如果您的接收端没有处理所有消息,那么发送端可能会继续发送消息,导致Vring空间没有被塞满。您可以检查一下接收端的代码,确保它能够处理所有消息。

    4. 队列溢出:如果您的Vring空间大小不够大,那么它可能会在发送大量消息时溢出。您可以尝试增加Vring空间的大小,以确保它能够容纳所有消息。

    为了测试Vring空间的大小,您可以尝试发送一些大于缓冲区大小的消息,并检查发送是否成功。如果发送失败,那么您可以尝试逐渐减小消息大小,直到发送成功为止。另外,您可以检查发送端和接收端的日志,以了解发送和接收的详细信息。

  • 您好,谢谢您的回答,

    缓冲区在配置文件中为512字节,经过我的测试,但是实际上是496字节,有16个字节的头。

    超过496字节部分确实会发生截断,但是我的代码中进行了判断,超过496部分会进行偏移,再次发送,以确保数据被正确发送。

    我尝试发送大量的消息,例如1000条496字节的数据,我在配置文件中设置的Vring空间大小是256 * 512,但是Vring空间却没有发生溢出,这超出了我的预期,我如何才能使Vring空间溢出?

  • 您可以尝试增加发送数据的速率,或者减小Vring空间的大小。您还可以尝试在发送数据时故意制造网络拥塞,以触发Vring空间溢出。