2012-11-13 3 views
2

매 5ms마다 (정확하게) 웨이크 업하고 작업을 수행하는 데 필요한 스레드가 필요합니다.
나는 POSIX 타이머를 사용했다. 정확한 90 % 인 것처럼 보였고 CPU가 다소로드되었을 때 정확도는 더 떨어졌다.
나는 posix 타이머가 모든 만료마다 새로운 스레드를 포크해야하기 때문에 그것이라고 생각합니다.
리눅스에서 고해상도 타이머를 구현할 수있는 신뢰할 수있는 방법이 있습니까?
CentOS 5.6입니다.리눅스 사용자 공간의 고해상도 타이머

+3

리눅스는 실시간 커널이 아닙니다. 그리고 아니, 사용자 공간이 이것을 할 수 없습니다. –

+0

이것을 위해서는 실시간 OS (RTOS)가 필요합니다. –

+0

왜 필요한지 설명하면 대안을 제안 할 수 있습니다. – Thomas

답변

5

POSIX 타이머 (timer_create()으로 생성)는 이미 고해상도입니다. 귀하의 문제는 배송 방법에 있습니다. 정확한 타이밍을 원하면 SIGEV_THREAD은 좋지 않습니다.

대신 SIGEV_SIGNAL을 사용하여 신호를 통해 타이머 만료 사실을 알리고 sigwaitinfo()을 사용하여 만료 될 때까지 기다릴 수 있습니다. 또는 POSIX 타이머 (timerfd_create()으로 생성) 대신 timerfd를 사용할 수 있습니다.

또한 스레드가 타이머가 만료 될 때 다른 실행중인 스레드를 선점하게하려면 sched_setscheduler()의 실시간 스케줄링 정책 (SCHED_FIFO 또는 SCHED_RR)을 제공해야합니다.

또한 대부분의 커널 코드를 선점 할 수 있도록 CONFIG_PREEMPT 옵션으로 커널을 컴파일해야합니다. 하드웨어 인터럽트 및 softirq와 같은 선점되지 않는 커널 작업으로 인해 지터가 어느 정도 발생합니다. 이를 더 줄이려면 CONFIG_PREEMPT_RT kernel patchset을 사용해보세요.

관련 문제