問題定義:多線程嵌入式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