데이터 수집 시스템 용 장치 드라이버에서 작업 중입니다. 일정한 간격으로 동시에 입력 및 출력 데이터를 제공하는 pci 장치가 있습니다. 그리고 나서 linux mod는 파일 조작을 통해 읽고 쓰여지는 순환 버퍼의 데이터를 관리합니다.외부 이벤트까지 읽기 작업을 차단하는 올바른 방법은 무엇입니까?
시스템의 데이터 처리량은 상대적으로 낮으며 750,000 바이트/초를 조금 넘게 받고 초당 150,000 바이트 이상을 전송합니다.
테스트 목적으로 루프에서 데이터를 쓰고 읽는 작은 사용자 공간 유틸리티가 있습니다. 여기
드라이버 코드의 섹션 (간략화를 위해 생략 된 원형 버퍼에 관련된 모든 코드를 포함 할 수있다. PCI 디바이스 초기화 다른 알아서 인터럽트 핸들러 실제 엔트리 포인트를하지 pci_interupt된다)위의 코드는 오랜 기간 동안 잘 작동하지만 12-18 시간마다 데이터 언더 플로 오류가 발생합니다. 결과가 0으로 기록됩니다.
내 첫 번째 생각은 userspace 응용 프로그램이 실제로 실시간이 아니기 때문에 읽기 및 쓰기 작업 간의 시간 지연이 가끔 너무 커서 오류가 발생하는 것입니다. 그러나 나는 사용자 공간에서 읽기 및 쓰기 크기를 변경하고 사용자 공간 응용 프로그램의 멋짐을 변경하여 오류 빈도에 영향을주지 않았습니다.
오류의 성격에 위의 세 가지 방법 중 일부 경쟁 조건이 있다고 생각합니다. 리눅스 커널 대기열이 어떻게 작동하는지 모르겠습니다.
위의 읽는 방법에 대한 대체 방법이 있습니까? 아니면이 동작을 일으킬 수있는 다른 뭔가가 있습니다.
시스템 정보 :
Linux 버전 : 우분투 16.10
리눅스 커널 : 리눅스 4.8.0 - lowlatency
칩셋 : 인텔 셀러론 N3150/N3160 쿼드 코어 2.08 GHz의 SoC를
TL : DR : 위의 코드는 12-18 시간마다 언더 플로 오류가 발생하므로 코드에서 IO 또는 일부 경쟁 조건을 차단하는 더 좋은 방법이 있습니다.