2017-11-17 17 views
0

데이터 수집 시스템 용 장치 드라이버에서 작업 중입니다. 일정한 간격으로 동시에 입력 및 출력 데이터를 제공하는 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 또는 일부 경쟁 조건을 차단하는 더 좋은 방법이 있습니다.

답변

0

리눅스에서 사용되는 하나의 표준 방법을 사용하실 수도 있습니다.

사용자 공간 테스트 프로그램 : 파일 기술자에 차단하기 위해 선택 2.()를 호출 (당신이 NONBLOCK 플래그를 지정할 때까지 리눅스에 기본) 모드를 차단하는 1. 파일 열기.

커널 드라이버 : 처리기/읽기 쓰기 및 데이터의 전송이 소스에 대한 이러한 링크를 살펴 보자 사이에 공통의 버퍼를 보호하기 위해 잠금을 2. 사용 가능한 데이터가있을 때마다 호출됩니다 1. 등록 인터럽트 핸들러 ldd3 책 testdriver의 코드