2012-10-06 2 views
3

직렬 포트를 통해 너무 많은 액추에이터 (또는 액추에이터 세트)를 처리해야하는 제어 시스템을 설계하고 있습니다. 새로운 디자인 (아직 구현되지 않음)은 여러 POSIX 스레드를 통해 액추에이터를 제어해야합니다.직렬 포트를 여러 번 열 수 있습니까?

여러 포트로 여러 번 직렬 포트를 열 수 있습니까? 그렇다면 동기 쓰기/비동기 읽기 메커니즘을 작성해 보겠습니다. 시리얼 포트에 직접 데이터를 쓸 수있는 스레드 M[0] ~ M[n-1]이 있습니다. 직렬 포트에서 직접 읽지 않아도됩니다. 대신 스레드 Rwhile(true) 루프의 포트에서 데이터를 읽고 대기중인 해당 스레드에 데이터를 제공합니다. (응답을 기다리는 M[i] 데이터가 준비되어 있고 스레드가 i 번째 스레드에 속할 때)

여러 스레드로 직렬 포트에 쓸 수 있는지 여부는 모두 질문에 달려 있습니다.

노트 : 현재 내 대학의 메카트로닉스 실험실에서 장치에 액세스 할 수 없기 때문에 나는, 내가 함께 패치 커널 2.6.38-8을 사용하고

을 시리얼 포트의 동작을 테스트 할 수 없습니다 Xenomai 실시간 하위 시스템 (중요하다면)

나는 직렬 포트와 통신하는 전통적인 리눅스 방식으로 코드를 이식하고있다. (Open /dev/ttyS0, baudrate 설정, read(), write() 등) 현재 타사 라이브러리가 직렬 포트와 통신하는 데 사용됩니다.

답변

4

동일한 직렬 포트를 한 번만 열 수 있습니다. 액세스가 거부되면 두 번째 평가판이 실패합니다. 포트가 열리면 포트 핸들을 사용하여 다른 스레드에서 작업 할 수 있습니다. 물론 이러한 스레드 간의 포트 액세스를 동기화해야합니다.

+0

저는 잠금없는 코드를 작성하려고합니다. 어떻게하면'mutex'로'wite()'시스템 호출을 포함하는 코드 섹션을 보호해야한다는 것을 의미합니까? 같은 시간에 포트에 쓰려고하는 두 개의 스레드가 잘못 되었습니까? –

+1

쓰기 조작은 원자가 아니므로 다른 쓰기 호출이 동기화되지 않으면 결과는 정의되지 않습니다. –

+1

당신이 lockless를 고집한다면 (그리고 그 직렬 호출에서 많은 부분을 볼 수는 없습니다), lock-free 큐를 사용하여 tx와 통신하십시오. 쓰기를 수행하는 하나의 스레드에 대한 버퍼/문자열 포인터. spining을 제거하기 위해 큐, 세마포어 또는 무언가에 대한 시그널링이 필요하지만 'lock-free'가됩니다. –

관련 문제