c-多个不相关的进程同步UART



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

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

如何在所有这些进程之间提供同步,以便一次只有一个进程使用UART,而所有其他块都使用UART。

问候&谢谢阿尼尔。

您正在问一个关于如何协调多个流程的非常一般的问题。这是一个广泛而深入的主题,你可以走很多路。以下是一些想法:

1) 在/var/lock中创建一个锁定文件。这将适用于其他使用串行端口的程序。当一个程序完成时,其他程序将竞相创建锁,随机一个程序将获胜。

2) 让您的库创建一个共享内存段。在共享内存段中,记下谁拥有"锁"。与锁文件一样,您需要写下PID,这样,如果所有者死亡,其他人就可以窃取锁。这是开销最少的。

3) 将串行代码拆分为一个"UART控制守护程序"和一个调用该守护程序的客户端库。守护进程侦听unix套接字(或TCP/UDP或其他IPC),并以独占方式处理串行端口。(你可以很容易地找到用任何语言编写的"聊天服务器"代码)。这有几个优点:

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

最新更新