2013-08-15 3 views
0

현재 사용자 정의 하드웨어를 제어하기 위해 GPIO 핀을 토글하는 내장 Linux 장치 (버전 2.6.28.10)에 사용자 공간 응용 프로그램이 있습니다. GPIO 레지스터에 대한 쓰기는 모두 장치에 액세스해야하는 별도의 pthreads에서 발생합니다. semaphore은 GPIO에서 동시에 쓰는 섹션에 여러 스레드가 액세스하지 못하도록하기 때문에 대부분 잘 작동합니다.임베디드 리눅스 원자 블록으로 코드 블록 실행

문제는 이들 GPIO 레지스터 (약 24 8 비트 쓰기)을 중단 스레드로 인해 세마포어에 레지스터를 수정할 수 있지만 will interrupt가 현재의 thread와, 컨트롤이 반환되지 않습니다 다른 스레드에 쓰기의 중간에 GPIO에 몇 밀리 초 동안 쓰고있는 스레드는 물론 외부 장치로 전송 된 데이터를 무효화합니다.

리눅스에서이 GPIO 쓰기 세트 (총 약 50 usecs)가 다른 스레드에 의해 중단되지 않도록하는 방법이 있습니까?

+2

커널 드라이버를 필요로하는 완벽한 예입니다.이 기능을 보장 할 수있는 것은 아무것도 없습니다. 범용 스레드 우선 순위가 도움이되지만 보증은 아닙니다. – Joe

+0

그래도 커널 드라이버에서 보증 할 수 있습니까? 커널 드라이버의 코드 섹션도 중단 될 수 있다고 생각했습니다. –

+1

커널 드라이버에서 스위치되는 다른 스레드에 대해 잠글 수 있습니다 (예). –

답변

0

이 스레드가 작업 스레드를 어떻게 방해하는지, 스레드의 종류 (사용자 공간, 커널 공간 또는 실제 인터럽트)는 분명하지 않습니다.

인터럽트 스레드가 사용자 공간 스레드 인 경우 상호 제외 세마포를 존중하도록 설정할 수 있습니다. 또 다른 옵션은 작업 스레드의 우선 순위를 일시적으로 높여서 CPU를 사용할 수없는 경우 (그러한 기능을 사용할 수있는 경우) 수행 할 수 없도록하는 것입니다.

인터럽트 스레드가 커널 공간 스레드 인 경우 커널에서 호출 할 수있는 세마포어 구현을 시도하고 사용할 수 있습니다 (System V 세마포어). 이것들은 더 무겁다.

인터럽트 스레드가 실제로 인터럽트 인 경우 사용자 공간 스레드에 의해 호출되는 커널 구성 요소를 빌드해야합니다. 그러면 커 널 섹션에서 인터럽트가 비활성화됩니다. 이는 성능에 부정적인 영향을 미칩니다.

+0

이 스레드는 현재 사용자 공간'pthreads '이고 다른 스레드가 실행될 수 있도록 스케줄러에 의해 중단됩니다. 문제는 다른 스레드가 세마포어를 존중하지 않고 스케줄러가 원자 적으로 실행해야하는 코드 섹션에서 다른 스레드에 시간을 할당하고 있다는 것입니다. GPIO 쓰는 데 50 usec 걸리고 50 usec는 프로세서에서 연속적이어야합니다. 25 usec가 아니라 25 usec가 필요합니다. –

+1

알겠습니다. 이 경우 커널이 가지고있는 실시간 지원의 종류 (https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO)를 조사해야합니다. 또는 호출하는 커널 공간 구성 요소를 구현할 수 있습니다 (무거운). – Ziffusion