Журнал событий во Flash памяти микроконтроллера STM32.
HTML-код
- Опубликовано: 21 окт 2024
- Одна из возможностей ведения внутрипроцессорного журнала событий во Flash памяти микроконтроллеров STM32. В ролике рассказывается о реализации одной из идей ведения такого журнала.
Канал в телеграмм - t.me/vladimir_...
Канал Яндекс.Дзен - zen.yandex.ru/...
Канал на RuTube - rutube.ru/chan...
Канал на RUclips - / vladimirmedintsev
------------------------------------------
Если вы хотите поддержать автора канала номер карты Сбер:
2202-2023-2480-4008
------------------------------------------
УРААААААААААААААААА !!! Владимир, Вы как будто мой план-график читаете. Уже в который раз нужная темя в нужное время.
Очень рад.
Мысли носятся в округе. :)
Неплохо. Есть ещё одна идейка - реализация лога через круговой буфер. Это автоматом обеспечит ротацию лога. Под круговым буфером подразумевается паттерн проектирования в программировании.
Это у нас уде много лет как организовано. Оно даже само ищет последнюю запись.
Помнится, я только три раза делал лог на МК. Первый раз был в EEPROM Atmega32, второй раз был на внешней FRAM микросхеме и третий раз на STM32F407 в BKPSRAM. Журнал не содержал строковых описаний событий, там были только коды событий и аргументы в зависимости от кода. А вот их расшифровкой занимался либо код на МК, либо внешний софт. А признаком последней записи у меня был старший бит кода события. При записи следующего события изменялся бит предыдущей записи. Этот подход на флеш памяти даже быстрее будет работать, чем на других видах памяти, так как при работе с флеш, страницу один черт нужно считать, изменить, стереть и записать целиком. Ну и при моем подходе используется циклическая запись, что позволяет держать как можно больше событий в памяти.
Спасибо за отличное видео. Тупые байты в конце можно заполнить CRC-32, аппаратная реализация есть на борту. Для живучести я предпочитаю ставить Fram память, можно не переживать что ресурс исчерпается.
Да, можно и fram. Мне она очень нравится. Но энергопотребление.... Как говорится лишний рот в семье...
@@VladimirMedintsev че это? Не кушает она ничего, fm24cl64 например. Только место на плате занимает и лишние пины-дорожки.
@@SevenNightdreemVeryPavlovny по характеристикам она на порядок лучше EEPROM, при такой же цене. Это вообще законно?
CRC нужно использовать всегда и везде, особенно во всякой кетайской дичи. Сколько раз такое было что вроде во флеш записывается без ошибок, а считывается всякая ересь.
@@rabbitchocolate2599 А с каких пор STM32 стали вдруг китайской дичью?
Спасибо ! По вам тут соскучились)
И вам спасибо, что не забываете.
У ST есть готовая реализация эмуляции eeprom-ки. Со сменой ячейки на большом боке памяти. Гуглить по "EEPROM emulation ST"
Да сейчас много где подобный механизм имеется. На той же esp32 я пользовал
STM наконец-то переписали свое прошлое безобразие по эмуляции eeprom. Ужаснее кода старой версии я, наверное, ничего не видел
Вот он волшебный атрибут gcc на размешенное по адресу. Спасибо)
видимо это только для кейла, для gcc либо приводить абсолютный адрес к типу указателя на структуру для чтения, а для "записи", чтобы структура была проинициализирована, нужно в файл линкера лезть (хотя и для кейла наверное тоже, если нужна инициализация структуры, нужно лезть в линкер)
@@stm32msk48 у GCC есть подобный атрибут. Но можно было просто привести указатель к адресу и не морочиться с атрибутами и все работало бы со всеми компиляторами.
@@stm32msk48
.ld
.mySegment 0x800FC00 : {KEEP(*(.mySection))} >FLASH
.c
uint64_t myvar __attribute__((section(".mySection"))) = 0x9ABCDEF0;
Похоже только так на gcc (. Если хочешь условную компиляцию итд делай надстройку типа make(((
Я эту идею применял на EEPROM AVR. Прикольно, ищешь байт 0xFF, следом за ним проверяешь наличие еще N+CRC байт с 0xFF. Это при старте. Для чтения - адрес найденного начала чистого блока минус N+CRC, для записи проще.
Если память заканчивается (не хватает байт), запускаем процесс стирания блока (в AVR с EEPROM пропускаем данный пункт), а адрес делаем равным начальному.
Хм. А почему не писать линейно? У вас всего 22 байта в структуре, а если передвинуть мелочь в конец и сделать align 1, то вообще 19. В 32-байтовой последовательности неиспользуемые байты нужно установить в 0xff, тогда они не изменятся при записи. Так можно записать в 1.5 раза больше. Как и поиск последний записи можно индексировать (используя первые 768 байт сектора): изначально все байты установлены в 0xff, обнуляя по одному биту можно, как зарубками, отметить зянятые позиции. Ресурс флеша рсходуется воздействием высокого напряжения, т.е. в момент стирания. Если очень захотеть и использовать битовые упаковки, запись можно сократить до 8 байт, это уже 16к записей на сектор. Извиняюсь за занудство, моя сфера - программирование для high load, электроника - хоббии, к которому вернулся много лет спустя. По этому очень удивляюсь подходам электронщиков.
Очень рад Вашему возвращению и тому что Вы снова хотите что бы на Ваш канал подписывались) Информация как всегда очень ценная и дает пищу для размышления и развития.
Собственно про подписку было сказано на автомате, по инерции последних лет.
Там где объявление ReadArray с атрибутом не мешало бы volatile поставить, иначе в конфигурации Release будет работать не так, как ожидалось после оптимизаций компилятора.
Отлично
Добрый день! Расскажите пожалуйста про архитектуру кода. Другими словами, как писать код без операционной системы? Про варианты FSM, какие используете подходы в разработке скелета программы. Спасибо.
Я новичек в STM32. Подписался на Ваш канал. Посмотрел это видео, и пришел в голову вопрос. Будет ли стерт такой журнал при очередном (пере)программировании STM32 ? Это актуально при отладке.
Настраивается. В настройках задается либо стирать сектора с данными, либо весь чип.
Владимир, прошу прощения за оффтоп. Как я понял из ваших видео, вьі делали печку для запекания плат. Я тоже решил себе сделать такое. Скорость нарастания температурьі у меня около 0.7°C/s и єто в основном обусловлено отсутствием теплоизоляции камерьі. Даташитьі дают скорость нарастания до 3-4°C/s и общее время вьіхода на температуру плавления до 480s. И я вроде укладьіваюсь в єти границьі. Со сбросом температурьі проблем не вижу - можно приоткрьіть печь. Вопрос: на Ваш взгляд, есть ли смьісл утеплять камеру, чтобьі увеличить скорость нарастания температурьі и тем самьім уменьшить время нахождения в печке? В первую очередь меня интересует не производительность, а качество.
В принципе я бы утеплил. Печка понятие очень универсальное и я предпочитаю иметь мощность и для быстрого набора температуры.
@@VladimirMedintsev Спасибо. Я тоже склонен к такому решению, но решил подтведить и у Вас. Еще раз спасибо.
Спасибо! Как всегда, интересные идеи!
Владимир, спасибо за ваши видео! Подскажите , а возможно будет в будущем рассказать про Cache 1L и настройки MPU ?)
Надеюсь руки дойдут. Ну а если честно там особо то и рассказывать не о чем.
Эта штука называется кольцевой буфер, и стирать его нужно только один раз. А вместо магии с атрибутами можно использовать что-то вроде Log_t *ReadArray = (Log_t*) 0x08080000; :)
Конечно можно.
Хотел сказать спасибо, очень много полезной информации у Вас подчерпнул.
В какой программе начерчены Ваши схемы? Не знакомый мне интерфейс, любопытно просто.
Это DipTrace
@@VladimirMedintsev Спасибо. А использутся ли в Ваших устройствах микросхемы программироемой логики CLPD или FPGA?
Вы с какой целью интересуетесь? Когда в этом есть необходимость эти компоненты используются.
@@VladimirMedintsev Я был бы очень рад увидеть тут видео на эту тему. Когда целесообразно использование? Как организовано питание и т.д. Я сам достаточно давно в Embedded (а последние 3 года это основная моя работа), но постоянно нахожу на Вашем канале новую и очень полезную для себя информацию.
Дело в том, что этот канал как блог, я знаю только то, о чем будет видео в ближайшую субботу. У меня нет какого-либо плана. Но больше мешает то, что я не показываю реальную работу и реальные заказы других людей. По этой причине пока рассказывать не на чем.
Использую внешний чип FRAM памяти. Никаких заморочек с секторами. Циклов 10 в 13 степени, хранение - годы. Посмотрите в эту сторону.
Мне казалось, что я пояснил в ролике, по какой причине внешние чипы это не всегда оправдано. Дмитрий, ваш чип внешней памяти сколько миллиампер потребляет? Не в режиме сна, а к примеру в режиме записи - стирания? Сколько? И к примеру с питанием от одной батарейки CR1632 с ее максимальным током в 7 миллиампер сильно внешняя fram будет совместима? Это просто к совету посмотреть в эту сторону.
@@VladimirMedintsev Погуглите MB85RC256V. Ссылку не даёт вставить. Даташит от fujitsu, страница 13.
@@ДмитрийКудинкин-л2ъ 25uA standby очень много против 1uA EEPROM (вот он подвох!)
Вы, вроде, как в одном из видео делились тем, что соскочили с Keil...
Я говорил несколько другое. Но... люди слышат то, что хотят услышать.
Спасибо за ролик. А если необходимо вести журнал порядка нескольких Мб, причем одновременно должно сохраняется порядка 300-350 байт, что посоветуете? Внешняя влеш? Причем желательно, чтобы была возможность эти данные как-то просмотреть на компьютере в простом виде типа текстового файла.
В виде текстового файла легко. Я же не случайно в начале ролика давал отсылку на два ранее опубликованных ролика где как раз эти темы и поднимались. Ведь файл не обязательно иметь как файл, его же можно генерировать на лету. С другой стороны журнал в несколько мб держать в памяти микроконтроллера я вам точно не посоветую. Для вас придумали sd карточки.
Спасибо! Можете сделать видео по режимам энергосбережения. Никак не могу на STM32L152 получить потребление как в DataSheet.
По потреблению рано или поздно будет видео. В L152 я тоже долго не мог нормального потребления получить. Там все заморочено. В этом плане L4 гораздо удобнее серия.
Не задействованные ноги притянуты к земле?
@@Diamond8822 STM рекомендует делать их аналоговыми.
@@vadimvarlamov7907 это понятно, что бы триггер не срабатывал
Иногда лучше поступиться размерами платы и установить SPI flash-чип типа W25Q64FVSIG, чем купить по бОльшей цене МК с гораздо меньшим объемом EEPROM. Всё зависит от решаемой задачи.
Как правило дело не в размерах, а в прожорливости памяти такого типа.
Про эти "свои идеи" ST лет десять назад рассказывали))) Почитайте AN2594, чтоб велосипед не изобретать.
Как бы вас насильно эти "идеи" смотреть никто не заставляет.
@@VladimirMedintsev Понятно... Больше подсказывать не буду, раз такая реакция.
@@AxGxP А вы какую реакцию ожидали после "ваши идеи" и "велосипед не изобретать".
Как бы подсказка выглядит несколько по другому. Ну в моем каком-то понимании.
@@VladimirMedintsev Неточно процитировал, исправил. Но сути это не меняет. Удачи!...
Владимир, не потеме видео. Но не могу справиться с ошибкой l6236e в keil5 Может сможете подсказать как избавиться? Осваиваю stm32
У вас проект создан с ошибкой.
Просто пересоздайте его в кубе.
@@VladimirMedintsev планировал без Куба обойтись, на голом кейле. А он даже самый простой проект не даёт собрать. После atmel studio не ожидал такого) Пойду куб качать и за бубном) Спасибо за уроки
С непривычки всякое бывает. Данная ошибка говорит о том, что либо отсутствует, либо неправильно создан .S - файл. По этой причине я и рекомендовал пересобрать проект. У каждой среды программирования есть свои странности. Лично мне для освоения проще использовать больше автоматизации а уже потом я учился как собирать проекты с чистого листа.
@@VladimirMedintsev в кубике все мигает) но с кейлом тоже хочется подружиться.
Все, подружился с кейлом и cmsis) Разобрался) необычно после авр с 32 битными регистрами работать
С _attribute_ section будьте акуратны! Компилятор Keil их поддерживает, а вот arm_none_aebi нужно читать !
Прикольно, спасибо
Вариант с указанием секции для линкера как-то уж слишком заморочен :) Массив это же указатель на его первый элемент. Присвойте ему адрес начала вашего банка и всё, дефайны с адресом и с количеством элементов у вас уже есть.
Ой, извините, я думал это будет интересно. Тем более, что без такой конструкции компилятор попытается разместить этот массив в RAM памяти и выделить там место под него и лишь потом пройдет переопределение указателя, но то ладно.
что-то не сходится у вас размер структуры с тем, что написано в коментарии
И?
@@VladimirMedintsev и у ва баг, говорю
И что? Это как-то негативно отражается на самой идее? Это же не готовый код для повторения. Я вам секрет открою это не единственный там баг.
"Износилуется" - это очень точное высказывание. И тут для владельца девайса есть два варианта: починить, купить новое.
Покупать новое оправдано в случае очень малой цены, ну допустим двести рублей. А где навар ?
Починить - когда выходит из строя внешняя память, которую клиент может заменить сам, и повысить свой чсв на одну ступеньку.
Однако если используется не журнал событий, а логгер ошибок (которые просто накапливаются и блокируются) - то можно извращаться до упора.
Вместо магических констант вроде 32 лучше использовать sizeof StructName. Понятно, что мелочь, но все же
Хотелось бы узнать как сделать отправку обновлений прошивки клиенту так чтоб ее скопировать не смогли
Кто же вам свои наработки так вот просто вылодит. Если просто то шифруйте.
@@VladimirMedintsev реализация обмена данными, даже сохранения логов в флеш памяти-это тоже наработка и потраченное время, про это все же рассказываете. Если все ученые держали свои идеи реализаций в секрете не было бы ютуба😔
Так себе сравнение. Тут разные вещи. Сохранение лога не влияет на безопасность моих проектов, а рассказ о используемых методах передачи прошивки - влияет. И что я получу за этот рассказ? Пару десятков баксов с рекламы в ютубе? Не смешите, никто такие видео не снимает и я их снимать не буду. На самом деле тема не такая сложная, у тех же STM на сайте она детально освещена. Но людям лень идти и разбираться. Что касается так некстати упомянутых вами учёных, то им платят за проводимую научную работу и исследования. Эти исследования выполняются в интересах тех или иных организаций. Мне же в отличии от ученых никто ничего не платит.
Привет из Казахстана! Салам, так сказать :) Не подскажите, у вас были проекты с LTDC+FMC+ SDMMC, устройство делаю сложное, GUI мощный должен быть, и хочется без куба обойтись, всегда без него обхожусь и не изменяю принципам создания кода только на кмсис:) Если таковые имеются, можете, пожалуйста, поделиться опытом их создания. GUI лучше на си писать или с ООП писать на с++?
GUI есть и готовые STEMWin и прочие. Вы можете их использовать.
На самом деле проблема в другом. Вы взваливаете на себя сложный проект, но судя по всему к этому не готовы. В этом случае начинайте решать проблемы по частям.
А если надо логировать систему в течении 2 месяцев, каждые 10 минут, то что было бы предпочтительнее? SD-карта или просто дополнительная микросхема FLASH?
В вашем случае думаю SD карта более предпочтительна. Тем более что про питание вы ничего не сказали. Вот и будем считать его бесконечным.
@@VladimirMedintsev Спасибо.
Цікаво, дякую!
В будущем а бабушках можно будет майнить :-)
Владимир, здравствуйте! Очень интересно ваше мнение о том, что происходит с МК stm32, и в общем с STM, мои самые любимые камни stm32f030k6t6 столили еще два месяца назад 35 рублей в компеле, сейчас они стоят 600 рублей и поставка 35 дней или около того! я не параноик, но невольно появляются мысли о каком-то заговоре мировом.
А с какой ide работаете? У меня с keilом дружба не складывается
толково.Я когда тоже писал во флеш я делал "тысячу" проверок чтобы не было случайных частых стираний записей
Существует информация как это сделать без hal
Это вопрос или утверждение?
@@VladimirMedintsev вопрос.
Один раз попал в такую ситуацию, если исправить ошибку в хале влияющей на один участок моего кода то это делать нерабочим другой участок моего кода
Есть сразу три варианта: 1. При генерации кода указать, что используется LL. 2. Вникнуть в концепцию HAL и не ломать ее при внесении исправлений в код. 3. Написать свои функции на CMSIS информация для этого есть в Reference Manual.
В reference manual есть подробное описание, прямо по шагам.
Извиняюсь за глупый вопрос, как 256 бит получилось(32+32+8+8+32+24+32+64 = 232)
Бит? 256 бит или байт?
@@VladimirMedintsev flash memory prorgamming by 256 bits , я про это спрашивал , не могу просто 24 бита найти в структуре
Я не понимаю что вы пытаетесь найти.
@@VladimirMedintsev структура Log_t должна иметь 32 байта (256 бит) , вот поэтому и задаю глупый вопрос , я нашел там только 232 бита сложив все элементы структуры
@@VladimirMedintsev аа понял, это как журнал радио, чтоб все кто детально изучал напряглись немного ))
Да как бы не желательно большое количество циклов. Не шибко живучая структура
Вы про какую структуру?
флеш память
Дык у флеши сколько 10.000 циклов? Вот и получается, что в каждую ячейку на 1/4096 раз реже писаться - стираться будет.
@@VladimirMedintsev ну это смотря как писать) Журналы, знаете ли, разные бывают. Вдруг вы там туда каждую секунду писать задумали, кто знает?
Согласен.
открываешь файл на флешке и пишешь в него строки
Можно без окей мы в России ,а так всё хорошо. Отличный канал.
Предупрежу сразу, нравится вам это или нет, но этот канал это мой блог в котором я буду говорить так как я привык и так как мне нравится. ОК?