大家好、
我的问题来了、当 使用 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;
}