多个不相关的进程同步UART

时间:2013-07-25 12:48:56

标签: c linux uart synchronisation

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

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

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

问候&谢谢, 阿尼尔。

1 个答案:

答案 0 :(得分:1)

您提出了一个关于如何协调多个流程的非常笼统的问题。这是一个广泛而深刻的主题,你可以采取很多路线。以下是一些想法:

1)create a lock file in /var/lock。这适用于使用串行端口的其他程序。当一个程序完成后,其他程序将竞争创建锁定,随机的程序将获胜。

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

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

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