시리얼 통신 버퍼링에 관한 질문입니다.
집에 가기 전에 잠깐 생각을 정리해보다가, 아무래도 이해가 안 되는 게 있어 질문 올립니다.
아시는 분 조언 부탁드립니다.
Com port를 이용해 데이터를 주고 받을 때, 그 데이터가 대충
max232(1 or 2 byte) -> 16650A( 8 - 64 byte )(정확한 이름은 잘.. -_-;)
-> OS의 버퍼 (1k?) -> App
이런식으로 전달되잖아요?
그럼, 만일 70 byte가 전송된다고 하면, 이때 OS는 context switching 을 하나요?
뭔소리냐면...
아래 질문 올린게 있는데요.
아무리 생각해도 ACK(1byte) 는 받는데 ACK이후의 DATA부분(10-40 byte정도)을 못 받는 게 이상해서, 원래 2개의 read 문장이었던 부분( ACK수신->에러체크->DATA수신) 을 1개의 문장( ACK + DATA수신 ) 으로 바꿨습니다. 최소한 이렇게 하면 context switing은 안 일어나지 않을까 해서요.
근데, 그래도 에러가 나길래 곰곰히 생각해 보니, 리눅스 시리얼 드라이버 자체가 64바이트인가 16바이트인가...하여튼 16650A 칩 버퍼 이상 데이터는 일단 context switching 하는 코드를 본 기억이 나더라구요.
물론, 이게 말이 안 되는게, 물리적 버퍼 크기 넘어갔다고 스위칭해 버리면 계속 들어오는 데이터는 못 받게 되버리는 거니깐, 뭔가 있겠죠.
즉, 예를들어 70바이트를 수신한다 하면, 이건 이미 물리적으로 이미 칩에 존재하는 16byte혹은 64byte라는 버퍼 크기를 넘어선 거잖아요? 그렇다면, 이때 리눅스는 (혹은 시리얼 디바이스 드라이버 는 ) 어떻게 이 이상의 바이트를 수신하죠?
1. 스위칭 아웃 해 버려도 처리속도 자체가 CPU랑 메모리가 시리얼 통신보다 훨씬 빠르기 때문에
시리얼 장비에서 오는 데이터를 못 받는 일은 없다. 알아서 OS레벨에 버퍼링되고 알아서 context switching 된다.
2. 시리얼 장비에서 데이터가 더 이상 수신 안 될때까지 무조건 context switching 안하고 시리얼 디바이스 드라이버가 전부 처리한다.
인가요?
느낌으로는 1번 같은데, 순 느낌이고, 답을 모르니... 혹 아시는 분 있으시면, 답변해 주시면 대단히 감사하겠습니다.
그리고 혹.... 이런것도 구글 검색하면 나오나요? 당최 검색어를 뭘로 해야 할지... -_-;;
pc입장에서는 시리얼
pc입장에서는 시리얼 속도가 무지 느려서
하드웨어 버퍼에 다 차기도 전에 os가 다 가져 가겠죠..
--
Linux강국 KOREA
http://ydongyol.tistory.com/
아. 그렇군요.
처리되는 게 정상이겠네요.
답변 감사합니다.
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
RTS, CTS
만약에 중간에 buffer가 넘치는게 걱정된다면 RS232C의 RXD, TXD와 함께 RTS, CTS pin도 사용하면 문제를 해결할 수 있습니다. buffer가 꽉 찼을 때 buffer가 꽉 찼으니 더 이상 보내지 마라 라는 신호를 보낼 때 RTS와 CTS를 사용합니다.
Taeho Oh ( ohhara@postech.edu, ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
PLUS ( Postech Laboratory for Unix Security ) http://www.plus.or.kr
Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com
댓글 달기