2012-12-10 3 views
2

카메라에 연결된 Linux를 실행하는 ARM 기반 장치가 있는데 캡처 한 프레임을 효율적으로 HD에 저장하려고합니다.인접한 실제 메모리에서 하드 디스크에 쓰기

  • 나는 사용자 공간에서 개발하고 있어요,하지만 난 DMA를 사용하여 메모리에 기록되는 C
  • 프레임에서 코딩있어 뜻
  • 에서 드라이버를 수정할 수 있습니다, 나는 물리적 메모리 포인터를 가지고있다.
  • 나는 모든 프레임 캡처 흐름을 제어 할 수 있어요, 프레임 버퍼가 안정 때 나는
  • 리눅스 버전이 나는 커널 소스와 잘 알고 3.0.35
  • 입니다합니다 (하는 video4linux 드라이버에서 dqueued) 말할 수

      : 코드가 아닌 전문가,하지만 난 생각 나는 ... 한 나는 몇 가지 힌트를 얻을, 그것은 내 방법을 찾아 일을 알아낼 수있어

나는이 개 대안이

  • 최적의 구성 찾기 파일 시스템을 열고, 파일을 열고, 파일 시스템에 쓰기위한 것입니다. 나는 ext4와 표준 fopen() fwrite() 함수를 사용하고있다. 나는 또한 mmap을 사용하거나 open()을 호출 할 때 O_DIRECT 플래그를 추가 할 수 있다는 것을 알고 있지만 아직 시도하지는 않았다.

  • 가 버퍼의 실제 주소를 전달할 수있는 방법을 찾기 파일 시스템/하드 드라이브 드라이버에 직접 (나는 그것을 내 Video4Linux 및 드라이버에서 를 얻을 수 있습니다), 때문에 데이터가 직접 옮겨진됩니다.
  • 나는에 fwrite는 DMA에게 다음 공간을 커널 사용자 공간에서 복사 된 데이터를 포함하고 다시 캐시의 일종으로하고 있기 때문에 방법 1, 내 병목 현상으로 메모리 트랜잭션을 가진 느린 것으로 판명. 간단한 상점을위한 메모리 트랜잭션이 너무 많습니다 ...

    방법 2와 관련해서는 가능한지는 모르겠지만,이 시스템을 처음부터 설계하는 경우라면,이 작업을 수행 할 것입니다.

    의견이 있으십니까?

    • 에 관한 방법 1 (mmap를 오픈()와 쓰기()() 사용 및/또는 O_DIRECT) 당신은 나의 목적을 위해 최적의 설정을 추천 할 수 있습니까?
    • 방법 2 (기존 DMA 버퍼에서 HD로 직접 저장)가 가능합니까? 그렇다면 예를 들어 설명해 주시겠습니까?
    +0

    제발, 친절하게도 프로세스의 코드 스 니펫을 게시 할 수 있습니까? 나는 정확히 같은 문제가있다. 나는 mmap이 해결책이라는 것을 알았지 만 그것을 사용하는 방법을 이해할 수는 없다. 미리 감사드립니다. – leonp

    답변

    0

    UNIXs에 mmap를 통해 파일에 기록을 가진 유일한 문제는, 당신은 디스크 공간 부족 의 경우 신호 처리해야 그 중 하나 또는 파일이 스파 스 아니라고 당신이 특정하게이 이므로 필요한 모든 디스크 공간이 이미 할당되어 있습니다. 저는 uptodate G ++가 신호를 C++ 예외 처리로 변환하는 방법을 제공한다고 생각합니다. 그러나 이것이 Mac-OS보다 다른 시스템에서 어떻게 지원되는지는 확실하지 않습니다.