순수 Linux 응용 프로그램을 OS X Snow Leopard (10.6.4)로 이식하려고합니다. 직렬 포트를 통해 대상 하드웨어에 바이너리를 보내는 응용 프로그램입니다. 응용 프로그램이 거의 실행되고 있지만 직렬 포트 쓰기와 함께 흥미로운 문제가 발생했습니다.OS X Vs Linux - 직렬 포트 처리
Linux (115.2k는 전송 속도)와 동일한 설정으로 OS X 직렬 데이터 전송은 Linux에 비해 약 10 배 이상 느린 것으로 보입니다. 리눅스에서 3 초가 걸리면 30-40 초가 걸리며 수신 측의 대상 펌웨어가 시간 초과됩니다. :)
직렬 포트 쓰기 기능을 파헤쳐 보면 장치 (또는 파일 설명자)에 데이터를 쓸 준비가되었는지 찾기 위해 select() 시스템 호출을 사용하고 있습니다. 각각의 write 시스템 호출은 OS X에서 1,024 바이트의 데이터와 Linux에서 1087 바이트의 데이터를 씁니다 (쓰기의 반환 값은 무엇인지). 내 데이터 크기는 첫 번째 레벨 바이너리의 경우 약 50KB이며 다음 레벨에서 더 큰 바이너리를로드 할 수있는 작은 부트 로더입니다.
의사 코드
내가 리눅스에서, 모든 시간을 잇달아 발생 쓰는 관찰select() configuration with 1s time out and observing the serial port file descriptor for write ready.
while(true)
{
rc=select(...)
if(rc>0){write(...) and other logic to get out of while if done}
if(rc==0){//try again}
if(rc<0){//error}
}
. 일련의 쓰기 및 그것은 jiffy의 함수에서 나온 것입니다. 그러나 OS X에서는 3 회 쓰기와 같아서 다시 0을 두 번 (2 초 간 사라짐) 다시 읽습니다. 몇 번의 쓰기 및 시간 초과 선택 등은 기능을 훨씬 느리게 만듭니다.
실마리가 있습니까?
Notes : 응용 프로그램은 termios lib API를 사용하여 직렬 포트를 제어합니다.