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.

[参考译文] PROCESSOR-SDK-AM62X:ti-rpmsg-char 脚本问题,特别是 recv_msg ()方法

Guru**** 1144750 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1248401/processor-sdk-am62x-question-of-ti-rpmsg-char-scripts-specifically-the-recv_msg-method

器件型号:PROCESSOR-SDK-AM62X

大家好、

我的问题来了、当 使用 ti-rpmsg-char repo git.ti.com/.../作为 rpmsg 的应用程序示例、并尝试在我们的项目中使用它时。

在它提供的示例(rpmsg-char-simple.c)中、它在 Linux 内核与 远程处理器(例如、本例中的 M4F MCU)之间执行交替 rpmsg 通信。 基本上、Linux 内核会发送到远程处理器、然后远程处理器会退回消息、并重复此操作几次。

我已尝试在 AM62x 电路板上使用、示例按预期工作。 我的观察(请更正,如果不正确)是, recv_msg()方法是一个阻塞操作,如果没有收到任何消息,将会在那里挂起。 在乒乓通信示例中、这不是问题、因为消息的传入是确定性的(每次发送操作完成后/预先定义的消息数量)。

在我们的应用程序中,我希望使用 recv_msg()方法来处理随机时间/任意数量的邮件,就像一种监听模式。 我修改了脚本,并试图简单地调用 recv_msg()方法单独(不再以乒乓方式),虽然我发现如果不接受任何东西,它将挂起那里,没有办法优雅地退出。 (Ctrl-c 将导致"应用程序未关闭某些 rpmsg_char 设备"消息)、同时无法进行其他操作。

你能提供一些建议,如果我错过了什么,或者一些更好的 做法 使用 recv_msg()方法吗?

此致、  

我修改的代码如下所示:

#define RPROC_ID_USE 9
// ....
// ....

/**
 * @brief API for linux core get into the mode of receiving incoming rpmsg.
 * 
 * @param dev_name 
 * @param remote_endpt 
 * @return int 
 */
int rpmsg_recv_blob(char* dev_name, int remote_endpt)
{
	int ret = 0;
	int packet_len;
	char eptdev_name[32] = { 0 };
	char packet_buf[128] = { 0 };


	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_USE, getpid());
	rcdev = rpmsg_char_open(RPROC_ID_USE, dev_name, remote_endpt, eptdev_name, flags);
	if (!rcdev) {
	perror("Can't create an endpoint device");
	return -EPERM;
	}

	ret = recv_msg(rcdev->fd, 128, (char *)packet_buf, &packet_len);
	if (ret < 0) {
		printf("recv_msg failed, ret = %d\n", ret);
		goto out;
	}

	// handle the received data blob
	if (ret >= 0) {
		// ... do something
	}
	goto out;


out:
	ret = rpmsg_char_close(rcdev);
	if (ret < 0)
		perror("Can't delete the endpoint device\n");

	return ret;
}

/********************
and in main():
********************/
int main(int argc, char *argv[])
{
	int ret, status, c;
	int rproc_id = 0;
	int remote_endpt = REMOTE_ENDPT;
	char *dev_name = NULL;

    // .... 
    
	status = rpmsg_recv_blob(dev_name, remote_endpt);

	rpmsg_char_exit();

	return 0;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Wei、您好!

    嗯、问得好。 我知道的示例仅使用您所述的 recv_msg。

    看起来可能存在基于 rpmsg_char 驱动程序代码的某种用户空间信号处理程序功能。 然而、目前我还没有看到任何例子在 RPMsg 中使用信号处理程序:
    https://git.ti.com/cgit/rpmsg/ti-rpmsg-char/tree/src/rpmsg_char.c#n518

    我正在与 RPMsg Linux 开发人员核实、看看他们是否对我们有任何其他反馈。 如果我在其他几天内未再次回复、请对该主题执行 ping 操作。

    此致、

    尼克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了确认、您正在寻找执行其他操作的用户空间代码、然后能够被接收到的 RPMsg 中断、对吧? 是否需要轮询代码来查看是否收到 RPMsg 消息?

    此致、

    尼克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Nick 的回复。 是的、我正在寻找一些用户空间代码或示例、介绍如何以非阻塞方式使用 PRMsg 接收、正如您所提到的、能够通过接收到的 RPMsg 来中断。  

    我看到了该 API 文档页面、 https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/latest/exports/docs/api_guide_am64x/structRPMessage__CreateParams.html

    和 https://software-dl.ti.com/mcu-plus-sdk/esd/AM62X/08_06_00_18/exports/docs/api_guide_am62x/group__DRV__IPC__RPMESSAGE__MODULE.html#ga838d61fef6baad9d306f073a190e96b6

    它讨论注册 RPMessage_RecvCallback 以接收。 它看起来像我需要的东西(在教程中它提到"当回调在 RPMessage_CreateParams 中注册时、不得使用 RPMessage_recv。"、这是有道理的)。 这是我应该继续前进的正确方向吗? 如果是、我想知道是否有使用  RPMessage_RecvCallback 的代码示例、我在这个文档站点上没有找到该示例。

    感谢您的观看。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Wei、您好!

    该文档来自 MCU+ SDK 文档。 因此、这些函数存在于 R5F 或 M4F 端、但不一定存在于 Linux 用户空间端。

    这是我从与其他团队成员交谈中得到的信息。 请注意、我将讨论一些我对自己不太了解的事情:

    1) open ()函数可以用标志 O_NONBLOCK 或 O_NDELAY 调用,使其成为非阻塞函数。

    有关更多信息、请参阅文档: https://man7.org/linux/man-pages/man2/open.2.html

    我仍在与开发人员核实一下、我们是否特别需要在默认的阻止行为中打开 RPMsg 端点(作为文件处理)。

    2) poll()函数可能提供您正在寻找的功能  

    有关更多信息、请参阅文档: https://man7.org/linux/man-pages/man2/poll.2.html

    3)我与人交谈的习惯是,看到用户空间代码轮询  消息或阻止,直到收到消息,而不是被中断。  

    一般认为的过程似乎是创建多个用户空间任务(?) 与我们在 RTOS 系统上看到的情况类似。 这样、即使您的一个用户空间任务阻止了等待 RPMsg、其他任务也可以继续运行您的代码。 我不熟悉此时如何使用用户空间任务。

    目前唯一可用的非轮询选项、我能够找到任何有关 WAS 信号的信息。 但是、信号似乎比内核中断处理程序慢得多、我不确定它们有多广泛使用。 我在网上找到了一些有趣的文章(请注意、TI 不认可任何非 TI 网站、也不验证非 TI 网站上的任何信息是否正确、我只是将这些作为示例:
    https://man7.org/linux/man-pages/man7/signal.7.html 
    https://lwn.net/Articles/871113/
    https://embetronicx.com/tutorials/linux/device-drivers/sending-signal-from-linux-device-driver-to-user-space/

    此致、

    尼克

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Nick。 对、  我发布的 RPMessage_RecvCallback 的链接是针对 MCU 侧的、由于在两侧都进行了工作、我在脑海中混淆了这些内容。  

    我将浏览您共享的文档链接 、以便查看这些链接、直到收到更多问题。 非常感谢!

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick。

    感谢您的建议。 我尝试了你提到的2)和3),使用 poll ()重复超时,我认为这足以满足应用程序的需要。

    此致、

    魏   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Wei、您好!

    很高兴听到它听起来像 poll ()将适合你的用例! 如果您有后续问题、请随时在此处回答、如果将来有新问题、请创建新主题。

    继续执行 open()主题,开发人员在使用非阻塞 open()命令运行 rpmsg_char 时未对其进行测试。 但是、他希望它能够正常工作。

    此致、

    尼克