Перейти к содержанию
    

Запись потока на SD-карту в SPI-режиме

Приветствую коллег по цеху. Столкнулся с некоторыми проблемами при работе с SD-картой, буду рад помощи.

Дано: ущербная 8-битная AVR по SPI шине пишет на карту поток аудио-данных. Скорость потока всего лишь 250-450 кбит/с (0.03-0.05 МБ/с). Данные буферизируются по 2 кБайт и командой мульти-блочной записи отправляются на карту (по 512 байт согласно спецификации SD HC).

Проблема: На тестовых картах 4 класса (класс 10 почти никогда) наблюдаются сильные провалы производительности на 2-3 порядка через равные промежутки времени (период зависит от карты). По спецификации карты кл4  должны обеспечивать скорость записи до 4 МБ/с. Неоднократно обсуждали, что это операции внутреннего контроллера SD-карты: очистка страниц и выравнивание износа. Также нашёл недавнюю похожую тему (только про чтение с карты), где упоминалось, что в SPI-режиме SD-контроллер по-другому (более медленно) работает с массивом flash-памяти 

 

Может-быть кто-то реализовывал подобные схемы обмена и поделится опытом? Меня интересует скорость потока данных который удалось без потерь записать на карту в SPI режиме и объём буфера. Мои 2 кБайт явно недостаточно, хотя и скорости на 2 порядка ниже предельных (пусть и заявленных для SDIO).

PS На одной из конфигураций дарйвер FatFS (последняя версия v14) забирает управление на 2 секунды - срабатывает аппаратный watchdog. Потеря фреймов аудио - очень неприятно, но отказ системы - это уже через чур.

Toshiba (MAIN).png

Toshiba (zoom1).png

Toshiba (zoom2).png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

7 hours ago, Sergey_Aleksandrovi4 said:

Приветствую коллег по цеху. Столкнулся с некоторыми проблемами при работе с SD-картой, буду рад помощи.

 

 

Есть такая особенность у SD карт. Они при записи периодически как бы подвисает. На форуме уже встречались подобные сообщения.

Я так же замечал такую особенность. Но у меня было не по 2 секунды, а чуть меньше одной секунды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Sergey_Aleksandrovi4 сказал:

Может-быть кто-то реализовывал подобные схемы обмена и поделится опытом? Меня интересует скорость потока данных который удалось без потерь записать на карту в SPI режиме и объём буфера. Мои 2 кБайт явно недостаточно, хотя и скорости на 2 порядка ниже предельных (пусть и заявленных для SDIO).

ИМХО, тут только увеличение памяти буфера поможет. 2кБ слишком мало.

7 часов назад, Sergey_Aleksandrovi4 сказал:

PS На одной из конфигураций дарйвер FatFS (последняя версия v14) забирает управление на 2 секунды - срабатывает аппаратный watchdog. Потеря фреймов аудио - очень неприятно, но отказ системы - это уже через чур.

FatFS штука открытая, поэтому можно посмотреть, чем же он занят на эти 2 секунды и в его недрах сбрасывать WDT.
Ну или сбрасывать WDT в неком периодическом прерывании по отсутствию флагов "я жив" отдельных процессов.
Грубо говоря, разбиваете программу на некие процессы, один из которого, как раз, работа с SD-картой.
Зная, что FatFS может забрать управление на <= 2с, перед вызовом "тяжелой" функции ставите некий флаг Flg.StartFatFS в 1.
Периодическое прерывание видит установленный флаг и отсчитывает 2с. В течение этого времени FatFS должен отработать.
При выходе из функции ставим флаг Flg.FatFSAlive в 1. В прерывании видим этот флаг и сбрасываем оба. Система работает штатно.
Если же Flg.FatFSAlive не установлен, то перестаем формировать WDI. Собственно, так для всех задач.

P.S. Ну или закладывайте использование карт только 10 класса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за советы, Все мои догадки и мысли подтвердили, значит двигался в верном направлении.

Размер буфера могу максимум до 3 кБ увеличить, нет больше ОЗУ в этом контроллере. Ну и как-то размер не кратный двум меня смущает. Ещё могу битрейт аудио данных снизить чтобы бОльшие по времени объёмы информации буферизировать (чтение аудио данных я сделал асинхронным относительно записи на карту).

Программный ватчдог - первое что написал когда обнаружилась проблема. Однако когда понял что локализована она внутри библиотеки FatFS - отказался. Хоть её код и открыт, я придерживаюсь правила не лезть внутрь сторонних библиотек. При необходимости обновления помимо банальной замены файлов придётся ещё и собственные костыли переносить. И не факт, что этим придётся занимать мне, а не другому бедолаге-программисту. Изоляция кода, вроде бы так это называется. Возможно, что и заблуждаюсь...

Воспользуюсь самым простым советом к чему и склонялся, пропишу в инструкции использование карт 10 класса и переложу ответственность на конечного пользователя. У этих карт тоже производительность падает при случайно записи (как там конвейр и буферизация внутри устроены), но не так катастрофически.

 

Sandisk MAIN.png

Sandisk (zoom).png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Sergey_Aleksandrovi4 сказал:

Размер буфера могу максимум до 3 кБ увеличить, нет больше ОЗУ в этом контроллере. Ну и как-то размер не кратный двум меня смущает. Ещё могу битрейт аудио данных снизить чтобы бОльшие по времени объёмы информации буферизировать

Так 3кБ/2сек - вроде как очень далеко до ваших исходных 30-50КБ/сек. Мало что останется от звука.

Если МК нельзя поменять, то может к нему внешнюю RAM/FRAM прикрутить?

Или ещё можно - поставить две SD-карты параллельно, и пока одна занята - писать во 2-ю. Если допустимы два набора файлов....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, Sergey_Aleksandrovi4 said:

Дано: ущербная 8-битная AVR по SPI шине пишет на карту поток аудио-данных. Скорость потока всего лишь 250-450 кбит/с (0.03-0.05 МБ/с). Данные буферизируются по 2 кБайт и командой мульти-блочной записи отправляются на карту (по 512 байт согласно спецификации SD HC).

 

Карта имеет право завершать запись блока в течении 250мС. За это время вы потеряете 14кБайт...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2jcxz Устройство серийное, уже давно в производстве, поэтому в схемотехнику вмешиваться нельзя. Так бы поставил stm32, задействовал SDIO и не морочил себе голову)

На плате есть неиспользуемая микросхема dataflash (NOR SPI), можно на худой конец её под буфер попробовать приспособить. Там хотя бы все задержки детерминированы.

Случай с зависанием на 2 секунды - предельный. Мне только на одной из карт по счастливой (не счастливой) случайности удалось это получить: наложились скоростные характеристика карты, размер кластера ФС, размер внутренних секторов/страниц самой карты. На других образцах повторить не смог. 

Уже решили с руководством использовать карты исключительно 10-го класса. Если у кого-то из пользователей получится вогнать карту в ступор на время превышающее период WDT, тогда и продолжу изыскания. И так уже этот кейс съел уйму времени.

  

2 minutes ago, _4afc_ said:

Карта имеет право завершать запись блока в течении 250мС.

Это справедливо только для SPI режима? От класса карты время как-либо зависит?  Коль так, то этот факт много объясняет из моих вопросов. Полезу мануал на физический уровень почитаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, Sergey_Aleksandrovi4 said:

Это справедливо только для SPI режима? От класса карты время как-либо зависит?  Коль так, то этот факт много объясняет из моих вопросов. Полезу мануал на физический уровень почитаю.

Не указывается для какого режима.

Я использую SanDisk более 13 лет и во всех поколениях карт этот параметр в pdf неизменен. Возможно он дублируется в CSD.

 

 

 

SanDisk.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, Sergey_Aleksandrovi4 said:

На тестовых картах 4 класса (класс 10 почти никогда) наблюдаются сильные провалы производительности на 2-3 порядка через равные промежутки времени (период зависит от карты).

Я бы не сказал.
Время от времени занимаюсь тестированием SD карт и не замечал никогда строгой периодичности.
Вот график задержек (в миллисекундах)  при записи тысячи 32Кб файлов на SD карту ADATA 4-го класса через SDIO
image.thumb.png.948f6373a531a88455da3d6450c7b9a3.png 

Как видно из графика скорость меньше 1 Мегабита в сек не проседала.
Советую поиграться с размером кластера и размером записываемых блоков.
Сильно помогает.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, AlexandrY said:

миллисекундах

Может, микро?

 

8 minutes ago, AlexandrY said:

Советую поиграться с размером кластера и размером записываемых блоков.

А смысл, если первая 250мс задержка все равно все сломает, буфера-то нет?

 

47 minutes ago, Sergey_Aleksandrovi4 said:

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

Снять с производства по причине наличия неустранимой ошибки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 minutes ago, aaarrr said:

Может, микро?

А смысл, если первая 250мс задержка все равно все сломает, буфера-то нет?

На графике миллисекунды.

Не надо сразу искать смысла.  Танцы с бубном нужны для приобретения эвристик. 


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, aaarrr said:

200000-250000 мс?

Упс, да меня замкнуло. 
Конец рабочего дня, понимаете. :dance:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, _4afc_ said:

Карта имеет право завершать запись блока в течении 250мС. За это время вы потеряете 14кБайт...

Нашёл в документе "Physical Layer Simplified Specification Version 6.00"

Quote

 

4.6 Error Conditions

4.6.2 Read, Write and Erase Timeout Conditions

4.6.2.2 Write

High Capacity SD Memory Card and Extended Capacity SD Memory Card indicate
R2W_FACTOR as a fixed value.
In case of High Capacity SD Memory Card, maximum length of busy is defined as 250ms for all write
operation.

 

Задержка завершения любой операции записи на SD HC может составить 250 мс вне зависимости от режима и скоростной характеристики карты (а для SD XC может быть увеличен до 500 мс). Т.е. у меня даже не предельный случай, всё согласно спецификации.

2AlexandrY, Вы задержки измеряли используя SDIO интерфейс, с ним контроллер карты быстрее работает, чем при использовании SPI. Размер блока для SD HC всегда жёстко задан размером 512 байт. Размер кластера наверное побольше надо сделать, чтобы драйвер Fat пореже move_window() вызывал?

Без буфера адекватного размера, как выяснилось коллективным разумом, весь мой проект - балансирование на шесте: ветер дунул и акробат свалился. Концептуальный просчёт на этапе проектирования. Поискал бегло последовательную RAM в SOIC8 корпусе взамен имеющейся dataflash, по цоколёвке ничего совместимого не нашёл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, Sergey_Aleksandrovi4 said:

Без буфера адекватного размера, как выяснилось коллективным разумом, весь мой проект - балансирование на шесте: ветер дунул и акробат свалился. Концептуальный просчёт на этапе проектирования.

Здесь уже несколько лет назад одна московская фирма "теле*" искала программиста для своего диктофона, вроде с видео. Платы разведены, смонтированы и даже есть корпуса...

Всё в количестве более 1000штук.

 

Тока пишет с затыками - тоже буфер был маленький.

 

Потом через несколько месяцев - уже пытались (тут же) продать этот конструктор без софта...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...