나는 두 가지 정보원을 안내 할 수 있습니다. UART 데이터 시트 및 Linux 직렬 드라이버 (Linux 커널 소스 트리 내의 드라이버/tty/serial/8250/디렉토리 및 주로 8250.c 소스 파일 내).
그러한 UART 데이터 시트는 9 장에서 http://www.ti.com/lit/gpn/ns16c552
에서 텍사스 인스트루먼트에서 제공 그것을 가지고, 내 의견, FIFO 모드 동작의 꽤 좋은 설명한다. 기본적으로 수신 된 데이터에는 두 가지 유형의 인터럽트가 있습니다. 하나는 수신 FIFO에있는 읽지 않은 데이터의 양이 설정된 임계 값에 도달했을 때 (더 많은 데이터가 도착하기 전에 OS가 수신 된 문자를 읽는 데 약간의 시간을 허용하기 위해 일반적으로 FIFO 크기보다 작아야 함) 어떤 데이터가 있지만 FIFO에 "버퍼 가득 참"경보를 올리기에는 충분하지 않습니다. 후자는 합리적인 시간에받은 단일 문자를 OS가 받도록하는 것입니다.
OS가 이러한 인터럽트를 수신하면 일반적으로 FIFO에서 가능한 한 많은 문자를 읽어야합니다 (상태 레지스터 비트를 사용하여 더 많은 데이터를 읽을 수 있는지 여부를 나타냄).
마찬가지로 전송할 때 OS는 FIFO가 가득 찼다는 표시를 수신 할 때까지 전송 FIFO에 쓸 수 있습니다. UART는 나중에 전송 FIFO가 사용할 수있는 여유 공간 (다시 구성 가능)을 가지고 있음을 알리기 위해 인터럽트를 생성합니다.
Linux에서 코드를 Linux (즉, 일반 응용 프로그램)로 작성하는 경우 인터럽트를 수신 할 수 없습니다. 반면에, 자신의 드라이버를 작성하는 경우에는 기본 8250.c UART 드라이버 대신 상호 작용하는 UART를 요구하는 드라이버인지 확인해야합니다.
* "while ((inb (UART_LSR_DR)) == 0)"* 다른 질문에 댓글을 달았 기 때문에 * 작동하지 않습니다. 이 코드는 UART 레지스터가없는 I/O 주소 0x0001에서 가비지를 테스트하고 있습니다 (UART_LSR_DR은 아마도 0x01이지만 비트 마스크이며 레지스터 오프셋이나 포트 주소가 아닙니다). – sawdust
코드를 편집했는데 잘 작동하는 것 같습니다. – user2170647
FIFO가 아닌 while 명령문과 관련이 있습니다. – user2170647