시리얼 통신 버퍼링에 관한 질문입니다.

cococo의 이미지

집에 가기 전에 잠깐 생각을 정리해보다가, 아무래도 이해가 안 되는 게 있어 질문 올립니다.
아시는 분 조언 부탁드립니다.

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번 같은데, 순 느낌이고, 답을 모르니... 혹 아시는 분 있으시면, 답변해 주시면 대단히 감사하겠습니다.

그리고 혹.... 이런것도 구글 검색하면 나오나요? 당최 검색어를 뭘로 해야 할지... -_-;;

ydongyol의 이미지

pc입장에서는 시리얼 속도가 무지 느려서

하드웨어 버퍼에 다 차기도 전에 os가 다 가져 가겠죠..

--
Linux강국 KOREA
http://ydongyol.tistory.com/

cococo의 이미지

처리되는 게 정상이겠네요.
답변 감사합니다.

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

ohhara의 이미지


만약에 중간에 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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.