【发布时间】:2013-08-23 19:26:45
【问题描述】:
问题定义:
我们正在为运行 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 消息队列上的事件 来自网络服务器 CGI 箱。 CGI bin 向网络发送事件 接口线程通过这个消息队列。处理这个时 事件,Web界面线程将等待来自其他的响应 线程。在这种情况下,它无法处理来自 Web 界面,直到它完成对上一个的处理 事件并返回等待 POSIX 消息队列。
抱歉解释过大...我希望我以最好的方式提出我的解释,以便其他人理解和帮助我。
如果需要,我可以提供更多意见。
【问题讨论】:
-
似乎原始问题中描述的方法重新发明了活动对象(参与者)设计模式。我建议看一下开源 QP 活动对象框架 (state-machine.com/qp)。在state-machine.com/linux 有一个带有 p 线程的 POSIX 框架的端口。
-
当然,Miro 先生,我会考虑这个选项...非常感谢
标签: c linux embedded embedded-linux