마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 - 시리얼통신 - 스레드 문제 ???

0 추천
몇일을 들여다봐도 뚜렷한 이유를 찾지못해 여러분들의 도움을 구합니다.

만들고있는 프로그램은

UART통신 ==> JNI ==> View 의 계층으로된 프로그램입니다.

프로그램이 시작되면 native 에서 pthread로 UART read용 thread를 생성 후 포트에서 데이터를 읽은 후 Java위로 전달하고 자바단에서는 WindowsManager를 통해 등록한 view를 통해 수신된 데이터를 출력합니다.

이 view는 창모드로 동작하는 view 입니다.

이 로직이 평상시에는 잘 동작하는데 동영상을 재생하면서 그 위에 view가 올라오도록 한 후 동작시키면 문제가 발생합니다.

로그로 확인해본 바로는 native thread에서 수신 데이터를 잃어버리는 것이 문제입니다. 중간 중간에 데이터를 놓쳐서 CRC 오류로 인해 버려버리므로 출력을 못하게 됩니다.
즉, read를 충분히 빠르게 호출하지 못해서 드라이버 버퍼를 빨리빨리 비우지 못해서 덮어써진 것으로 추정하고 있습니다.

흐름제어를 할 수 있는 상황이 아니고 재전송 메커니즘도 넣을 수 없는 상황이므로 이 부분은 논외로 하고...

일차적으로 드는 생각은 thread priority로 인해 cpu time 많이 받지 못해 잃어버리는걸로 예상하고 있습니다만.. 잃어버릴때난 정상적일 때나 read 함수 한번 호출 시 반환되는 바이트가 4byte ~ 200byte 정도로 두 가지 case를 확인해봐도 별 다른 이상징후는 보여지지 않았습니다.

즉 정상적일 때, 4,4,4,4,4,4,4,4,4,4,20,4,4,4,30,4,4,4,4,160,4,4,10 이런식으로 read 된다면 문제가 될 때도 비슷한 패턴으로 읽혀지고 있습니다.  예상으로는 잃어버릴 때는 300, 200, 60,.... 과 같은 식으로 read 함수의 호출 빈도가 줄면서 한번에 읽는 사이즈가 커지지 않을까 싶었는데 정상적인 경우와 차이가 없더군요.

또 이해하기 어려운 현상은 packet을 잃어버리는 현상이 발생 될 때, 화면상에 view를 터치한 후 이리저리 계속 드래그 시키면 이 때는 또 정상적으로 packet loss 없이 잘 동작합니다.

이런걸 보면 제가 모르는 어떤 기능이 있을 것 같다는 생각도 드는데요

native에서 직접 생성된 thread 인데도 사용자 입력에 따라 priority가 변경되는걸까요? 아니면 전혀 다른 원인에 의해서 일까요?

안드로이드의 스레드 관리 등등 어떠한 단서라도 좋으니 관련된 정보가 있다면 도움 부탁드립니다.

좋은 주말 되세요~
난드로이드 (140 포인트) 님이 2013년 12월 20일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...