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