Fedora 16과 직렬 포트에 문제가 있습니다.
저는 제가 개발 중인 셋톱박스를 모니터링하기 위해 직렬 포트를 사용하고 있습니다. STB는 Linux에서 실행되며 시작 시 직렬 인터페이스를 통해 작업 중인 프로그램을 시작합니다.
이제 내 프로그램은 디버깅할 때 buffer overrun
그리고 dmesg
.
직렬 출력을 읽을 수 없게 되므로 애플리케이션 디버깅이 엉망이 됩니다.
그래서 나를 괴롭히는 것은 Fedora 15에서 실행할 때 버퍼 오버플로가 발생하지 않는다는 것입니다.별말씀을요!
내 설정에 대한 자세한 내용은 다음과 같습니다.
- Fedora Core 16은 Cinnamon/gnome-terminal에서 직렬로 사용됩니다. 이름:
3.2.6-3.fc16.x86_64
- 직렬 포트를 연결하려면 다음 명령을 사용합니다.
screen -R -d -t "Serial" /dev/ttyS0 115200
이 문제를 어떻게 해결할 수 있는지 아시나요?
(자세한 내용은:)
$ cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:3395 rx:11899157 fe:6 brk:4 oe:3496 RTS|DTR
### ^^^^^^^
### overflow errors
1: uart:16550A port:0000EC98 irq:17 tx:32 rx:0 CTS|DSR|CD
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
일반적인 dmegs 출력:
[370425.080452] ttyS0: 24 input overrun(s)
[370426.092382] ttyS0: 30 input overrun(s)
[370427.109291] ttyS0: 36 input overrun(s)
[370428.173344] ttyS0: 28 input overrun(s)
[370429.583198] ttyS0: 26 input overrun(s)
[370430.638700] ttyS0: 32 input overrun(s)
:( :( :(
출력 sudo setserial -v -a -g /dev/ttyS0
:
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal skip_test low_latency
답변1
Fedora 16 문서에 따르면/etc/rc.serial직렬 회선 설정을 담당합니다.
버전 15와 버전 16 설치 사이에 변경 사항이 있습니까?
"낮은 대기 시간" 및 "rx/tx_trigger"(가능한 경우)를 설정하는 것이 도움이 될 수 있습니다.
16550A에는 15바이트 입력 버퍼가 있었던 것으로 기억합니다. 인터럽트가 생성되는 패딩 수준을 어떻게든 설정할 수 있습니다. 저는 안정성과 속도를 절충하기 위해 7바이트를 사용했습니다(DOS 사용). 아마도 rx/tx-trigger도 비슷하게 조정될 것입니다.
2012년 3월 12일 업데이트됨:
방금 내 워크스테이션을 확인했습니다(CentOS5 - Fedora와 비슷해야 함).
rpm -qd setserial
사용 가능한 문서를 표시합니다. Readme 파일과 예제가 있습니다.rc.직렬설명서 - Readme 파일을 참조하세요.
그 외에는 - 귀하의 결과를 다시 살펴보았습니다.정상 속도나는 안 좋아 보인다. 115kb를 원하므로 설정해야 합니다.spd_vhi(man setserial 참조) 그 이유는 UART 표준이 그 이상을 허용하지 않기 때문에 요청한 크기가 38.4kb를 초과할 수 없기 때문입니다. 나중에는 57.6kb, 그 다음에는 115kb였습니다. 이러한 속도도 설정하려면 "트릭"이 있어야 합니다.
답변2
비슷한 문제가 발생했습니다. 가동 중단 시간을 두고 경쟁하는 다른 장치로부터 이를 격리할 수 있었습니다. 제 경우에는 노트북의 SD 카드 리더기가 직렬 장치와 시간을 놓고 경쟁하고 있었습니다. 카드 리더 드라이버(rmmod)를 비활성화했더니 오버런이 사라졌습니다. 다음을 사용하여 동일한 IRQ에 있는 장치를 볼 수 있습니다: cat /proc/interrupts