Arduino에서 SD 카드 쓰기 속도를 높이는 방법


12

SD 카드에 초당 약 20000-30000 바이트의 고속으로 데이터를 기록하는 데이터 로거 시스템을 만들고 있습니다. 그러나 arduino의 SD 라이브러리는 현재 초당 약 4500-5000 바이트의 데이터를 기록하므로 너무 느립니다.

쓰기 속도를 높이기 위해이 핵을 읽었 지만 SPISettings 를 조정하여 더 직접적인 접근 방식이 가능한지 궁금합니다 .


1
SdFat 라이브러리를 사용해보십시오 . 기본 SD 라이브러리보다 훨씬 효율적입니다.
Majenko

모든 종류의 SD 카드에는 5000 바이트가 너무 낮은 것처럼 보이지만 SD 카드의 품질이 좋은지 확인하고 싶을 수도 있습니다.
Len

답변:


11

확인. 그래서 SDFat lib를 사용해 보았습니다. 이 라이브러리는 adruino와 함께 제공되는 기본 SD 라이브러리보다 확실히 좋습니다. 그러나 이것이 저 데이터 전송률 문제를 해결하는 방법은 아닙니다.

이 게시물 에서 SDFat 라이브러리 작성자의 지시를 따랐 습니다 .

fat16lib 에 따르면 데이터 속도를 높이려면 flush ()를 현명하게 사용해야합니다. 우리는 각주기에서 데이터를 쓰려고하지만 100주기마다 한 번 정도 flush ()를 주기만하면됩니다. 또한 SD.open ()에 플래그를 'O_WRITE | 'FILE_WRITE'대신 O_CREAT '.

이로써 속도가 크게 향상되었습니다. 그러나 나는 더 필요했다!

바이너리로 데이터를 저장하면 ( 이 블로그를 확인 ) 성능이 훨씬 향상되었습니다.

내 현재 속도는 클래스 4 SD 카드에서 약 100-120KBps (킬로바이트)입니다!

마지막으로 여러분의 도움에 감사드립니다.


4

원하는 속도에 도달 할 수 있는지 여부는 여러 가지 요인으로 결정됩니다. 이 중 일부만


1. 귀하의 소프트웨어

SdFat 도서관은 빠르게 아두 이노 IDE의 표준 SD 라이브러리보다. 또한 표준 SD 라이브러리와의 호환성 기능을 쉽게 사용할 수 있습니다. 사용해보십시오.

2. 하드웨어

고급 SD 카드를 사용해야합니다. 아시다시피 SD 카드는 성능 등급으로 분류됩니다. 인터넷에있는 대부분의 사람들은 SanDisk SD 카드를 권장합니다.


나는 며칠 안에 이것을 시도하고 결과를 알려줄 것입니다. 감사.
Ashish Ranjan

4

악수가 버퍼를 얻는 것을 피하십시오!

SD.write (buf, size)를 사용하십시오 .

모두 안녕, 나는 같은 문제가있는 프로젝트에서 일하고 있습니다. 나는 당신의 같은 단계를 따르고 정확히 같은 숫자를 얻었다. 방금 해결했습니다. 문제는을 호출 할 때의 악수 SD.write()입니다.

대신 :

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

하다:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

내 프로젝트에서 첫 번째는 4100 바이트를 얻었고 두 번째는 128 (buf [128]) 버퍼를 사용하여 내 프로젝트에서 145408 바이트를 얻었 습니다 . 충분하다.


1
어쨌든 AFAIK SD는 내부적으로 (512 kB) 버퍼를 사용하기 때문에 핸드 셰이크의 의미를 모릅니다. 그러나 File.write를 사용하여 개별 바이트를 작성하는 것이 매우 느리고 컴파일러가 최적화 할 수없는 것으로 나타났습니다 (결국 내부 버퍼에 1 바이트를 복사하고 버퍼가 가득 찼는 지 확인하고 SPI 전송을 수행해야합니다) 스타트). 내 외부 버퍼와 File.write (buffer, size)를 사용하면 응용 프로그램에서도 성능이 크게 향상되었습니다.
oliver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.