c - 多个无关进程同步UART

标签 c linux uart synchronization

我想使用一个同时运行多个进程的共享库。我的库包含 UART 打开/写入/读取/关闭,每个进程写入特定的 UART 命令并期望相关响应。应用程序调用 LIB 中的 API,Inside API 打开 UART 端口,向 UART 写入命令并从 UART 读取响应,处理响应缓冲区并发送回用户[API 执行需要 2 到 3 秒]。

我有 30 个这样的 API 和 5 个使用这些 API 同时运行的进程。

我如何才能在所有这些进程之间提供同步,以便一次只有一个进程使用 UART,而 UART 上的所有其他 block 。

问候和感谢, 阿尼尔。

最佳答案

您问的是一个关于如何协调多个流程的非常笼统的问题。这是一个广阔而深刻的主题,您可以采取很多途径。以下是一些想法:

1) create a lock file in /var/lock .这将与其他使用串口的程序一起工作。当一个程序完成后,其他程序将竞相创建锁,随机的一个将获胜。

2) 让您的图书馆创建一个 shared memory segment .在共享内存段中,记下谁拥有“锁”。与锁定文件一样,您需要记下 PID,以便其他人可以在所有者死亡时窃取锁定。这具有最少的开销。

3) 将您的串行代码拆分为“UART 控制守护进程”和调用该守护进程的客户端库。守护进程监听 unix 套接字(或 TCP/UDP 或其他 IPC)并专门处理串行端口。 (您可以轻松找到用任何语言编写的“聊天服务器”代码)。这有几个优点:

  • 守护进程可以告诉调用者有多少请求“在队列中”
  • 守护进程可以尝试维护 FIFO 顺序,或者根据需要处理优先级请求。
  • 当多个客户端同时询问同一个问题时,守护进程可以缓存响应。
  • 如果你不想让守护进程一直运行,你可以让 xinetd 启动它。 (确保它处于单服务器模式。)
  • 它使用更简单的标准 unix 套接字(或 TCP),而不是每个进程都必须链接到串行库。
  • 您的 API 调用程序变得更容易测试(不需要硬件,您可以模拟响应)
  • 如果 API 调用程序挂掉,UART 不会处于不良状态

关于c - 多个无关进程同步UART,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17858494/

相关文章:

Linux 服务器密码已过期。修改密码时,不重播

php - CentOS 不支持阿拉伯语

linux - checkin 时,git-tf 在 linux 上告诉我 “Could not lock”;我该如何解决?

linux - 发送低于 0.25 秒的中断

c - 为什么我的 HAL_UART IT 捕获回调例程不会触发?

c++ - getopt_long 行为怪异

c - 延迟如何在stm32l152RC上工作?

c - 使用 Postgres 测试文件是否存在

c - 避免我的应用程序将 Return 读取为字符

c - 对于可以在编译时允许的可变大小的通用队列实现有什么想法吗?