问题定义:
我们正在为运行 Linux 的工业嵌入式系统设计一个应用程序。
该系统由来自外部世界的事件驱动。系统的输入可以是以下任何一种:
- 很少以数字 IO 线的形式向系统输入(连接到处理器的 GPIO,如急停)。
- 该系统运行一个网络服务器,允许通过网络浏览器控制系统。
- 系统运行 TCP 服务器。任何 PC 或 HMI 设备都可以通过 TCP/IP 发送命令。
系统需要使用 Modbus 通过 UART 驱动或控制 RS485 从设备。系统还需要控制少量的 IO 线,如 Cooler ON/OFF 等。我们认为状态机对于定义此应用程序至关重要。核心应用程序应该是一个多线程应用程序,它应该具有以下线程......
- 主线程
- 控制 RS485 从站的线程。
- 用于处理来自 Web 界面的事件的线程。
- 处理数字 I/O 事件的线程。
- 通过 TCP/IP(套接字)处理命令的线程
对于线程间通信,我们使用 Pthread 条件信号和等待。根据我们最初的设计方法(主线程中的一个状态机),系统的任何输入事件(web 或 tcp/ip 或数字 I/O)都应中继到主线程,并应与相应的线程通信事件是注定的。一个典型的场景是通过 Web 界面获取 RS485 从站的状态。在这种情况下,Web 界面线程应将事件中继到应更改状态的主线程,然后将事件传达给控制 RS485 从站的线程并做出响应。主线程应将响应发送回 Web 界面线程。
问题:
- 每个线程是否应该有自己的状态机,从而降低主线程的复杂性?在这种情况下,我们是否还需要在主线程中有一个状态机?
- 任何处理输入事件的线程都可以绕过主线程直接与处理事件的线程通信?例如,Web 界面线程可以直接与控制 RS485 从站的线程通信吗?
- 使用 pthread 条件信号并等待线程间通信是否可以,还是有更好的方法?
- 我们如何让一个线程等待来自外部的事件和来自其他线程的响应?例如,Web 界面线程通常等待 POSIX 消息队列上的事件,以便从 Web 服务器 CGI 箱进行进程间通信。CGI bin 的发送事件通过这个消息队列发送到 web 界面线程。在处理此事件时,Web 界面线程将等待其他线程的响应。在这种情况下,它无法处理来自 Web 界面的任何新事件,直到它完成对前一个事件的处理并返回到 POSIX 消息队列上的等待状态。
抱歉解释太大了……我希望我以最好的方式提出我的解释,以便其他人理解和帮助我。
如果需要,我可以提供更多输入。