Вопрос Помогите с выбором платформы разработки

UnDetected

New member
Добрый день.

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

Задача такова: Писать на SD-карту данные, летящие по UART на скороти 115200. При этом параллельно следить за нажатием единственной кнопки, светить или мигать единственным же диодом и крутить шаговиком через STEP-DIR контроллер (1 шаг в секунду).

Раньше писал на чистых С-ях под AVR. К ардуино отношусь с брезгливостью, уж очень там все не оптимально на выходе получается. Видел ESPRuino / MicroPython / NodeMCU на LUA / родную SDK и вообще FreeRTOS (к чему склоняюсь в принципе).

Поскольку в перспективе, если проект пойдет, планируется сделать управление через браузер со страницы, выводимой железкой - выбор пал на ESP8266 / ESP32 (благо и та и та в наличии давно имеются). Опыта кодинга под Espressif-ские железки нет, увы.

Вот и вопрошаю к Вам. На чем сесть писать из перечисленного выше? Возможно что-то еще существует, а я не знаю опять же. Скриптовые языки пишутся быстро, но пашут медленно. Заманчивы тем, что я представляю как на них в перспективе сделать веб.морду, что пока не знаю как реализовать на родном SDK например. Ну и т.д.

Основной проблемой для себя, при использовании скрптовых языков, считаю скорость работы реализуемого UART-SD моста. Потому, как если данные хоть на байт побьются - это полная жэ.
 
Добрый, если данные так важны то может пусть отдельный микроконтроллер их логирует, есть готовые решения на подобии такого. Что касается языка, то полагаю на ардуино быстрее всего будет, т.к. очень много библиотек для разных задач...
upload_2020-1-17_17-6-22.png
 

UnDetected

New member
Добрый, если данные так важны то может пусть отдельный микроконтроллер их логирует, есть готовые решения на подобии такого. Что касается языка, то полагаю на ардуино быстрее всего будет, т.к. очень много библиотек для разных задач...
Посмотреть вложение 8662
Такая фиговина уже больше месяца где-то едет или ползет, но пока глухо. Фишка в том, что в поток с UART-а нужно дописывать количество шагов, сделанных двигателем. Так что полюбому пропускать поток через контроллер.
 
@UnDetected так 1 юарт могут слушать 2 контроллера... а если RX и TX соединить(у слушающего), то слушающий контроллер может дописать в поток UART. А принимающий все это запишет.
 

pvvx

Активный участник сообщества
@UnDetected - Задача "Писать на SD-карту данные" и "если данные хоть на байт побьются" подразумевает аппаратную поддержку резервного питания или использование специфических SD карт. Более новые варианты SD карт (на eMMC и типа) вроде уже адаптировали от сбоев при отключении питания во время операций с ними, но старые такого не имеет - у них слетает вся структура и карту придется переформатировать. Так-же влияет и сам тип файловой структуры на карте. ATmega может не справиться с журналируемыми файловыми системами.
 

pvvx

Активный участник сообщества
SD карта работает с виртуальными номерами секторов. Внутри SD карты есть разметка соответствия текущим назначенным секторам и реальным адресам в её Flash.

Запись в SD организуется посекторно. Записать один байт не выйдет. При записи сектора SD находит свободный сектор в блоке, пишет его и отмечает в таблице виртуализации переписывая её (часто вызывая стирание целого сегмента). Стирание и перезапись осуществляется только большими блоками содержащими десятки секторов когда будет исчерпан объем старых использованных областей.

Т.е. если вы будете дописывать побайтно, то каждая операция будет вызывать стирание и перезапись десятков или сотен килобайт в реальной flash у SD. Размер сегмента зависит от общего объема flash в SD.
В итоге, при дозаписи с указанной вами скоростью поступления данных, через месяц она выйдет из строя.

Методом увеличить ресурс является буферизирование данных для записи на размер внутреннего сегмента стирания у SD. Это от 16 килобайт для самых первых SD (1..16 MGb). В новых - сотни килобайт.

От этого и будет зависеть выбор платформы и операционной системы, если вам так необходимо работать с SD.
 

pvvx

Активный участник сообщества
Вашу проблему с ресурсом SD можно решить, купив специально адаптированную SD карту для промышленных устройств. В них программа встроенного контроллера адаптирована на запись лога.
Пример: КАРТА ПАМЯТИ SIMATIC HMI SD КАРТА 2 ГБ ДЛЯ ПАНЕЛЕЙ SIMATIC HMI СЕРИИ COMFORT SIEMENS купить цена
Но это не избавляет от необходимости реализации резервного питания. Его можно заменить на такой аппаратный костыль:
Ставите повышающий DC-DC и большой электролит (тысячи мкФ). Повышающий DC-DC нужен если нет напряжений от 20 В.
С этого электролита понижающий DC-DC питающий схему работающую с SD.
Перед каждой операцией обращения к SD проверяете уровень заряда этого электролита - хватит ли его времени разрядки на обработку операции в SD.
Ну и/или прочие прерывания по уровням питания сигнализирующие о отключении внешнего...
АКБ тоже решает эти проблемс.
 

pvvx

Активный участник сообщества
Все эти проблемс с SD и MMC произошли от начального стандарта на них, написанного ардуинщиками. И только в новых SD с объемами от 1 TB это было пересмотрено уже другими специалистами.
 

pvvx

Активный участник сообщества
@UnDetected Рекомендую поставить обычную SPI Flash на 128 Мбайт со своей системой кольцевого буфера записей и не париться. Советующих всякие ардуино-SPIFS посылайте подальше, т.к. это сократит ресурс в сотни раз и создаст сбои всей логгируемой информации при каждом отключении питания…
 

exeland

Member
Т.е. если вы будете дописывать побайтно, то каждая операция будет вызывать стирание и перезапись десятков или сотен килобайт в реальной flash у SD.
Если используется файловой системой, то такого не происходит. Обычно файловая система кладёт записываемые данные в буфер и записывает буфер на карту по команде или по факту заполнения этого буфера. Ну я думаю вы и сами знаете это...
 

pvvx

Активный участник сообщества
Если используется файловой системой, то такого не происходит. Обычно файловая система кладёт записываемые данные в буфер и записывает буфер на карту по команде или по факту заполнения этого буфера. Ну я думаю вы и сами знаете это...
Буфер вы и заполняете побайтно. А запись всё равно сектором, с перезаписью разметки файловой системы. Это только верхний уровень. В SD каждое обращение записи в неё вызовет ещё перезапись таблицы виртуализации номеров секторов в реальные номера секторов Flash и стирание сегментов с перезаписью многих секторов если старые сегменты уже заполнены пусть и удаленной информацией...
 

pvvx

Активный участник сообщества
Думаете современного проца в компе не достаточно для записи на максимальной скорости в SD кучи мелких файлов? Но почему-то запись на SD в таком режиме идет в тысячи раз медленнее, чем большой последовательной пачкой секторов кол-вом от размера блока стирания в Flash SD.
Вам может даже не хватить производительности современной SD при дозаписи с UART 115200 :)
При кривом неоптимизированном алго и файловой системе средней SD придется стирать и переписывать от 2..3*N килобайт данных на каждую вашу отправку в неё дополнения байта с UART.
N- размер внутренних блоков стирания.

PS: О ресурсе SD в таких случаях можно вообще забыть - неделя? день? :)
 

pvvx

Активный участник сообщества
А любая буферизация приведет к несовместимости с вашим "Потому, как если данные хоть на байт побьются - это полная жэ." при любом отключении питания.
 

pvvx

Активный участник сообщества
Если вам критична потеря последнего значения степа мотора, то хранение на SD этой информации на время отключения питания не представляется возможным без учета всех описанных ранее необходимых костылей.
Есть и промежуточные решения – буферизация данных для дозаписи блоками в SD в FRAM микросхеме...
 

vad7

Active member
Интересно в каком виде лежат очищенные данные в карте.
Как во флеше - FF?
А так, можно писать подряд секторами (CMD24), предварительно их очистив, если конечно разработчик программы в чипе карты, на это расчитывал.
Инфы бы где нарыть по этому поводу...
 

exeland

Member
Всё что вы описываете делает внутренний контроллер карты. И как именно он взаимодействует с NAND флеш, ведёт учёт старения блоков NAND флеш, метит BAD блоки, производит их подмену - это уж секрет фирмы производителя карт. Нам же предоставляется упрощённый протокол - работа с секторами по 512 байт - чтение, запись, стирание. А с этими секторами уже работает файловая система. С файловой системой работать удобнее, чем с табличным распределением файлов в памяти, особенно если файлов много и их кол-во динамично.

SPI flash надёжнее спору нет - NOR память как никак. Но не так много файловых систем для них.
 

pvvx

Активный участник сообщества
Интересно в каком виде лежат очищенные данные в карте.
Как во флеше - FF?
А так, можно писать подряд секторами (CMD24), предварительно их очистив, если конечно разработчик программы в чипе карты, на это расчитывал.
Инфы бы где нарыть по этому поводу...
У SD и MMC карты сектора имеют виртуальный номер. Встроенный микро-контроллер имеет таблицу перевода виртуальных номеров секторов в реальные в Flash.
Это сделано для уменьшения износа. Если вы будете писать одни сектор, то физически это будет записью каждый раз нового нового сектора в Flash и сменой значений в таблице перевода виртуальных номеров секторов в реальные в Flash.
Т.е. минимум две записи секторов при внешней команде записи одного сектора. Максимум при переполнениях таблиц и прочего - от 2..3*сегмента стирания + перезапись туда старых задейстованных секторов. От этого SD и тормоз при малых файлах.
 
  • Like
Реакции: vad7

pvvx

Активный участник сообщества
Инфы бы где нарыть по этому поводу...
Внутренняя программа микроконтроллера SD является сИкретной.
Найти можно только раскопки продвинутых потрошителей, типа меня.
Смотрите стандарты на SD/MMC - там есть описание ардуино алгоритма из-за которого и имеем все беды.
----
Но может вас устраивает концепция Arduino: та пофиг – для вечернего блога и так сойдет.

Что касается языка, то полагаю на ардуино быстрее всего будет, т.к. очень много библиотек для разных задач...” совершенно недотягивающих в реализации минимально необходимого уровня в любой функции, т.к. ограничено уровнем познаний писавших их.

Да и язык у Arduino – это C++. Для начинающих в Arduino предусмотрено:
1) Полное отсутствие контекстной справки.
2) Полное отсутствие списка функций применимых к используемой плате.
3) Полное отсутствие описание специфики имеющихся функций к используемой плате.
4) Невозможность просмотра реализаций функций для уточнения какие имеется параметры и какие подставляются по умолчанию.
5) ….
Т.е. вновь подсаживающемуся на Arduino придется принять концепцию, что если ему надо что-то написать на Arduino, то следует обратиться на форум с просьбой предоставить готовый скетч или ссылку на таковой готовый в инет. - Преобразование общества в попрошаек.
 

UnDetected

New member
Ух сколько понаписали. Попробую ответить и уточнить пару моментов.

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

Что же касается питания, то устройство мобильно. Запитывается от сборки 3 * 18650 с двумя DC-DC на 5 и 12 вольт по выходу (для шаговика и логики). Тут тоже перебоев не будет. Во время включения устройства будет проверяться уровень заряда акб и приниматься дальнейшее решение о запуске работы или блокировке запуска с сигнализацией о низком заряде (как раз тот самый светодиод, про который я говорил).

В целом как-то так.

Пока решил пошаманить с MicroPython-ом на 32-й ESP-шке. Дико мне, конечно, на интерпретируемом языке писать под железо ограниченное ресурсами, но видимо таковы реалии нынешнего времени. Да и не будем развивать эту тему, слишком уж она холиварная.

Всем участникам - спасибо за участие =)))
 
.....
Что касается языка, то полагаю на ардуино быстрее всего будет, т.к. очень много библиотек для разных задач...” совершенно недотягивающих в реализации минимально необходимого уровня в любой функции, т.к. ограничено уровнем познаний писавших их.
....
Если в библиотеке нет нужной функции, то что мешает её дописать? Полагаю это проще и быстрее чем изучать другой язык и писать все с нуля, особенно ели нужен один скетч ...
 
Сверху Снизу