2014-04-29 2 views
2

USB 직렬을 통해 하드웨어 장치로 데이터를 전송하는 OSX 응용 프로그램에서 작업하고 있습니다. 하드웨어에는 가변 속도로 소모되는 작은 직렬 버퍼가 있으며 항상 비어 있지 않아야합니다.OSX에서 실시간 스레드 만들기

우리는 하드웨어 버퍼가 꽉 찼는지를 검사하는 쓰기 루프를 자체 NSThread에 가지고 있으며 그렇지 않은 경우 데이터를 쓸 때까지 씁니다. 대다수의 루프 반복은 아무 것도 쓰지 않고 거의 시간이 걸리지 않지만 때로는 몇 밀리 초 (CACurrentMediaTime으로 시간 측정)까지 소요될 수 있습니다. 스레드는 각 반복 후에 100ns 동안 잠자 게됩니다. (나는 잠자기 시간이 현저하게 짧다는 것을 알고 있지만, 하드웨어를 부딪치게되면 하드웨어가 데이터가 부족해지기 시작합니다.)

이것은 잘 작동합니다. 그러나 주 스레드 또는 다른 응용 프로그램에서 프로세서 집중적 인 작업을 시작하면 쓰기 스레드가 느려지고 장치 큐가 비워지지 않을 정도로 데이터를 빠르게 스트리밍 할 수 없습니다.

그래서 직렬 쓰기 스레드를 실시간으로 만들고 싶습니다. 나는 Mach API를 통해 실시간 스케쥴링 요청시 the Apple docs을 읽은 다음 Chromium source에있는 SetPriorityRealtimeAudio (mach_port_t mach_thread_id)에서 코드 스 니펫을 적용하려고했습니다.

그러나 이것은 작동하지 않습니다. 응용 프로그램은 직렬 통신 속도 저하의 영향을 받기 쉽습니다. 어떤 아이디어? 쓰기 스레드의 동작을 변경해야하는지, 아니면 잘못된 스레드 정책 매개 변수를 전달하는지, 또는 둘 다에 대해 잘 모르겠습니다. 저는 다양한 기간/계산/제약 값을 실험하고 더 일관된 듀티 사이클 (최대 100ns 쓰기 후 100ns 동안 잠자기)을 강요하면서 운을 시험했습니다.

관련 질문 : 스레드의 우선 순위를 직접 확인하거나 실시간으로 시작한 다음 수준을 올리려는 것으로부터 승격되지 않는다는 것을 어떻게 알 수 있습니까? 지금은 하드웨어 성능에 대한 추측을하고 있습니다. 따라서 정확히 무슨 일이 일어나는지 정확하게 말하기는 어렵습니다.

+0

는 'USB 시리얼'드라이버 'TxEmpty'에 방해하지 않습니다 그래서 비 폴링 인터페이스를 허용합니까? 그렇지 않다면, 그것은 빤다. –

+0

이 작업을 수행해야하는 스케줄러가있는 멀티 스레드 OS입니다. 왜 이것이 왜 그런 문제 (당신이 생명에 중 요한 의료 기기를 사용하고 있습니까?)에 대해 더 설명하고, 경험하고있는 몇 가지 속도 범위와 환경에 대한 세부 사항을 제공 할 수 있습니까 (다른 기계에서 실행되는 것들)? 변동성의 원인을 해결 했습니까? 아니면 실시간/우선 순위가 높은 스레드를 강제 실행하려고 시도하고 있습니까?멀티 스레드 OS의 앱은 일반적으로 훌륭하게 작동해야하며 운영 체제를 스케줄링의 중재자로 간주해야합니다. – jefflunt

+1

@jefflunt yeah - 현대적이고 선제적인 멀티 태스커가 피하도록 고안된 바로 그 일로, 불쾌한 I/O 폴링처럼 들립니다. –

답변

0

내 제안은 최고 우선 순위가 필요한 실행 스레드를 별도의 프로세스로 이동시키는 것입니다. Apple은 종종 내장 카메라를 구동하는 것과 같은 실시간 프로세스를 위해이 작업을 수행합니다. 대상 OS의 버전에 따라 분산 객체 (이전의 XPC) 또는 XPC를 사용할 수 있습니다.

RPC 메커니즘을 롤업하고 표준 Unix 포크 기술을 사용하여 별도의 하위 프로세스를 만들 수도 있습니다. 주 앱이 하위 프로세스의 소유자이기 때문에 프로세스 내의 개별 스레드 우선 순위 외에 프로세스의 일정 우선 순위를 설정할 수 있어야합니다.

이 게시물을 편집하면서 백그라운드에서 재생되는 WWDC 비디오가 있고 QuickTime 동영상 레코딩 작업도 시작되었습니다. 당신이 볼 수 있듯이, 모두 그 애플리케이션의 실시간 측면은 별도의 XPC 프로세스에서 실행됩니다

ps -ax | grep Video 
1933 ??   0:00.08 /System/Library/Frameworks/VideoToolbox.framework/Versions/A/XPCServices/VTDecoderXPCService.xpc/Contents/MacOS/VTDecoderXPCService 
2332 ??   0:08.94 /System/Library/Frameworks/VideoToolbox.framework/Versions/A/XPCServices/VTDecoderXPCService.xpc/Contents/MacOS/VTDecoderXPCService 

XPC Services at developer.apple.com

Distributed Objects at developer.apple.com