문제 정의 :멀티 스레드 임베디드 리눅스 어플리케이션 상태 머신 디자인
우리는 Linux를 실행하는 산업용 임베디드 시스템 용 애플리케이션을 설계하고 있습니다.
시스템은 외부 세계의 이벤트에 의해 구동됩니다. 시스템에 대한 입력은 다음과 같을 수있다 : (즉 스톱 같은 프로세서의 GPIO로 연결 ) 디지털 IO 라인 형태의 시스템에
- 몇 입력한다.
- 시스템은 웹 브라우저를 통해 시스템을 제어 할 수있는 웹 서버를 실행합니다.
- 시스템이 TCP 서버를 실행합니다. 모든 PC 또는 HMI 디바이스는 TCP/IP를 통해 명령을 보낼 수 있습니다.
시스템은 Modbus를 사용하여 UART를 통해 RS485 슬레이브 장치를 구동하거나 제어해야합니다. 시스템은 또한 Cooler ON/OFF 등과 같이 거의 IO 라인을 제어 할 필요가 없습니다. 우리는 상태 시스템이이 어플리케이션을 정의하는 데 필수적이라고 믿습니다. 핵심 응용 프로그램은 RS485 노예를 제어 할 수있는 다음 스레드를 가진다 멀티 스레드 응용 프로그램 ...
- 메인 스레드
- 스레드를해야한다.
- 웹 인터페이스에서 이벤트를 처리하는 스레드.
- 디지털 I/O 이벤트를 처리하는 스레드.
- 스레드 우리는 P 스레드 상태 신호를 & 대기를 사용하는 TCP/IP (소켓) 스레드 간 통신
통해 명령을 처리한다. 초기 설계 접근법 (메인 쓰레드에서 하나의 상태 머신)에 따라, 시스템 (웹 또는 TCP/IP 또는 디지털 I/O)에 대한 모든 입력 이벤트는 메인 쓰레드로 릴레이되어야하며, 해당 쓰레드와 통신해야한다. 그 사건은 예정되어있다. 전형적인 시나리오는 웹 인터페이스를 통해 RS485 슬레이브의 상태를 얻는 것입니다. 이 경우, 웹 인터페이스 스레드는 이벤트를 주 스레드로 중계해야하며 주 스레드는 상태를 변경 한 다음 해당 제어 장치가 RS485 슬레이브 &이 응답하는 스레드에 이벤트를 전달합니다. 메인 쓰레드는 응답을 웹 인터페이스 쓰레드로 되돌려 보내야한다.
질문 :
- 각 스레드가함으로써 메인 쓰레드의 복잡성을 줄여 자신의 상태 머신을해야 하는가? 그런 경우에도 주 스레드에 상태 시스템을 보유하려면 여전히 이 필요합니까?
- 모든 스레드 처리 입력 이벤트는 주 스레드를 우회하는 이벤트를 처리하는 스레드로 직접 통신 할 수 있습니까? 예를 들어 웹 인터페이스 스레드는 RS485 슬레이브를 제어하는 스레드와 직접 통신 할 수 있습니까?
- pthread 조건 신호를 사용하는 것이 좋습니다 & 스레드 간 통신을 기다리거나 더 나은 방법이 있습니까?
- 외부에서 이벤트가 하나의 스레드에서 대기 할 수있는 방법 & 다른 스레드에서 응답 하시겠습니까? 예 :웹 인터페이스 스레드는 일반적으로 웹 서버 CGI 저장소의 프로세스 간 통신 인 프로세스 간 통신을위한 POSIX 메시지 대기열의 이벤트에 대해 을 대기합니다. CGI bin은이 메시지 큐를 통해 웹 인터페이스 스레드에 이벤트를 보냅니다. 이 이벤트를 처리 할 때 웹 인터페이스 스레드는 다른 스레드의 응답을 기다립니다. 이 경우 이전 이벤트 처리를 완료하고 POSIX 메시지 대기열에서 다시 대기 상태가 될 때까지 웹 인터페이스의 새 이벤트를 처리 할 수 없습니다.
너무 큰 설명을 드려 죄송합니다 ... 다른 사람들이 이해하고 도와 줄 수있는 최선의 방법으로 설명을 드렸기를 바랍니다.
필요한 경우 더 많은 입력을 제공 할 수 있습니다.
원본 질문에 설명 된 접근법이 활성 객체 (액터) 디자인 패턴을 다시 고안 한 것처럼 보입니다. 나는 오픈 소스 QP 활성 객체 프레임 워크 (http://www.state-machine.com/qp)를 살펴볼 것을 권한다. http://www.state-machine.com/linux에는 p-threads가있는 POSIX에이 프레임 워크의 포트가 있습니다. –
물론 Mr.Miro, 나는 그 옵션을 살펴볼 것이다 ... 덕분에 톤 – hprasath