Я использую микроконтроллер STM32F4 с картой microSD. Я захватываю аналоговые данные через DMA.
Я использую двойной буфер, беру по 1280 (10 * 128 - 10 БПФ) выборок за раз. Когда один буфер заполнен, я устанавливаю флаг, а затем просматриваю 128 выборок за раз и выполняю для них вычисление БПФ. Все это работает хорошо.
Данные собираются с нужной скоростью, и расчет БПФ происходит так, как я ожидал. Если я просто позволю программе работать в течение одной секунды, я вижу, что она выполняет БПФ примерно 343 раза (44000/128).
Но проблема в том, что я хотел бы сохранить 64 значения из этого БПФ на SD-карту.
- Я использую библиотеку толстой файловой системы HCC.
- В каждом цикле вычисления БПФ я копирую 64 значения в массив.
- После каждых 10 вычислений я записываю содержимое этого массива в файл и начинаю заново.
- В массиве хранится 640 значений float_32 (10 * 64).
Это отлично работает для односекундного тестового прогона. Я получаю 22 000 значений, хранящихся на SD-карте.
Но по мере того, как я увеличиваю время, я начинаю терять сэмплы, поскольку для записи на SD-карту требуется больше времени. Мне нужна SD-карта для постоянного хранения более 87 кбит / с (4 байта * 64 * 343 = 87808). Я попытался увеличить размер выборки буфера DMA, а затем количество раз, которое он записывает, но не нашел, что это помогло.
Я использую карту microSD 8 ГБ, класс 4. Я отформатировал SD-карту в соответствии с размером блока распределения FAT32 по умолчанию 2048.
Как мне организовать буферизацию данных, чтобы это учесть? Я подумал, что использование меньшего количества операций записи может помочь. Помогла бы очередь? Как бы это реализовать и есть ли у кого-нибудь пример?
Я видел, что у Клиффорда была похожая проблема, и он использовал очередь, Как использовать SD-карту для записи 16-битных данных со скоростью 48 ksamples / s?.