Как увеличить скорость записи SD-карты в Arduino

12

Я создаю систему регистрации данных, которая регистрирует данные на SD-карте с высокой скоростью, около 20000-30000 байт в секунду. Но библиотека SD в Arduino в настоящее время записывает данные со скоростью около 4500-5000 байт в секунду, что слишком медленно.

Я прочитал этот хак, чтобы улучшить скорость записи , но мне интересно, возможен ли более прямой подход, возможно, путем настройки SPISettings .

Ашиш Ранджан
источник
1
Вы можете попробовать библиотеку SdFat - она ​​намного эффективнее, чем библиотека SD по умолчанию.
Майенко
Возможно, вы также захотите убедиться, что ваша SD-карта хорошего качества, хотя 5000 байт кажется слишком низким для любого типа SD-карты.
Лен

Ответы:

11

OK. Итак, я попробовал SDFat lib. Эта библиотека определенно лучше стандартной библиотеки SD, которая поставляется с adruino. Но это не то, как я решил свою проблему низкой скорости передачи данных.

Я следовал указаниям автора библиотеки SDFat из этого поста .

Согласно fat16lib , чтобы увеличить скорость передачи данных, мы должны использовать flush () с умом. Мы хотели бы записывать () данные в каждом цикле, но нам нужно только сбрасывать () один раз каждые 100 циклов или около того, в зависимости от того, сколько данных записывается в каждом цикле. Кроме того, обязательно сохраните флаг в SD.open () как «O_WRITE | O_CREAT 'вместо' FILE_WRITE '.

Это, безусловно, увеличило скорость. Но мне нужно больше!

Хранение данных в двоичном формате ( см. Этот блог ) еще больше повысило производительность.

Моя текущая скорость составляет примерно 100-120 Кбит / с (это килобайт) с SD-картой класса 4!

Наконец, я хочу поблагодарить вас, ребята, за вашу помощь.

Ашиш Ранджан
источник
4

Многие факторы будут определять, сможете ли вы достичь желаемой скорости. Только некоторые из них.


1. Ваше программное обеспечение

SdFat библиотека быстрее , чем стандартный SD библиотеки Arduino IDE. Он также имеет простую в использовании функцию совместимости со стандартной библиотекой SD. Попробуйте это.

2. Ваше оборудование

Вы должны использовать SD-карту высокого класса. Как вы, наверное, знаете, SD-карты сортируются по классам производительности. Большинство людей в Интернете рекомендуют SD-карту SanDisk.

Уильям Рой
источник
Я попробую это через несколько дней и сообщу вам результаты. Благодарю.
Ашиш Ранджан
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 байт. Достаточно хорошо.

Pinipa
источник
1
Я не знаю, что вы подразумеваете под рукопожатием, потому что AFAIK SD использует (512 КБ) буфер внутри все равно. Но я также заметил, что запись отдельных байтов с помощью File.write является чрезвычайно медленной, и компилятор, похоже, не в состоянии оптимизировать его (в конце концов, он просто копирует один байт во внутренний буфер и проверяет, заполнен ли буфер и должна ли передаваться SPI). Начало). Использование моего собственного внешнего буфера и File.write (buffer, size) также привело к значительному улучшению производительности в моем приложении.
Оливер