问题定义:多线程嵌入式linux应用程序状态机设计
我们正在为运行Linux的工业嵌入式系统设计一个应用程序。
该系统由外部事件驱动。到系统的输入可以是任何以下的:
- 很少输入到系统中的数字IO线的形式(连接 像急停处理器的的GPIO)。
- 该系统运行一个网络服务器,允许通过网络浏览器控制系统为 。
- 系统运行TCP服务器。任何PC或HMI设备都可以通过TCP/IP发送命令。
系统需要使用Modbus通过UART驱动或控制RS485从站设备。该系统还需要控制少数IO线路,如冷却器开/关等。我们认为,状态机对于定义此应用程序至关重要。核心应用程序应是一个多线程应用程序,它应具备以下线程...
- 主线程
- 线程控制RS485奴隶。
- 线程处理来自Web界面的事件。
- 处理数字I/O事件的线程。
- 线程来处理的,我们使用的Pthread条件信号&等待通过TCP/IP(套接字)
对于线程间通信的命令。按照我们的初始设计方法(主线程中的一个状态机),任何到系统的输入事件(web或tcp/ip或数字I/O)都应该传递给主线程,并且应该与相应的线程进行通信该事件是注定的。典型的情况是通过Web界面获取RS485从站的状态。在这种情况下,Web界面线程应该将事件中继给主线程,主线程将改变状态,然后将事件传送到控制RS485从站回应的线程&。主线程应将响应发送回Web界面线程。
问题:
- 如果每个线程都有自己的状态机,从而减少主线程的 复杂性?在这种情况下,我们是否仍然需要 在主线程中拥有状态机?
- 任何线程处理输入事件可以直接与 线程通信,该线程处理绕过主线程的事件?例如 网络接口线程可以直接与线程 控制RS485从站通信?
- 使用pthread状态信号是否正常&等待线程间 通信还是有更好的方法吗?
- 如何让一个线程等待来自外部的事件&响应 来自其他线程?对于例如Web界面线程通常会等待 处理POSIX消息队列上的事件,以便进行来自Web服务器CGI bin的进程间通信 。 CGI bin通过这个消息队列将接口线程发送到web 。处理此事件时,Web界面线程将等待来自其他线程的响应。在这种情况下,它无法处理来自网络界面的任何新事件,直到它完成处理之前的 事件并返回到POSIX消息队列的等待状态。
抱歉太大的解释......我希望我已经以最好的方式提出了我的解释,让别人理解和帮助我。
如果需要,我可以提供更多输入。
似乎原始问题中描述的方法重新发明活动对象(actor)设计模式。我建议看一下开源QP主动对象框架(http://www.state-machine.com/qp)。在http://www.state-machine.com/linux上有一个POS机的端口,带有p-threads。 –
当然,Mr.Miro先生,我会考虑这个选项......感谢一大堆 – hprasath