Вадим Дерябкин @Vadimatorikda
Инженер-программист
Information
- Rating
- Does not participate
- Location
- Красноярск, Красноярский край, Россия
- Date of birth
- Registered
- Activity
Specialization
Software Developer, Embedded Software Engineer
Lead
From 250,000 ₽
C++
STM32
Linux
Circuitry
Python
Assembler
Programming microcontrollers
Embedded system
Software development
Object-oriented design
Заинтересовали! Попробую изучить. Может свяжусь и получится получить образец. Очень не хотелось бы лезть в ПЛИС, если есть готовые процессоры/микроконтроллеры (ничего против ПЛИС не имею, просто для меня пока сложно).
1. Невозможность воткнуть «нормальный процессор с MMU». Особенно стало остро с появление STM32H7. Встречал несколько проектов, где из-за требований к мелким габаритам ставили BGA минимального размера. И еще более мелкую DRAM к нему. RTOS там необходима была. По сути, там была часть для обычного МК +«тяжелые вычисления», которые гонялись на M7. Тут логичнее бы поставить просто одноплатник на QNX (есть требования к реальному времени) + МК, со своим ETH и все на прерываниях. Но увы. Габариты. В итоге все +- норм.
2. Конечные автоматы бывают порой настолько адовыми, что лучше не надо. И в таких случаях я склоняюсь к внедрению вообще виртуальной машины + скриптовые языки.
Сам в принципе против РТОС в МК, но порой это позволяет сделать проект читаемым и легко поддерживаемым. Порой даже приходится дописывать ту или иную РТОС (не ядро, а дополнительные меанизмы), чтобы снизить издержки, но все таки. Ясное дело, что ставить в STM32F030 РТОС не надо)))
С этим уже были проблемы, да. Когда новая прошивка думала, что хранятся валидные значения. Решили созданием утилиты, которая вычитывает старые параметры предварительно запросив у устройства текущую структуру, а потом шьет после перепрошивки в совпадающие по названиям поля обратно после перепрошивки. Во время прошивки новой версии все конфиги сбрасываются (страницы по просту чистятся и при первом старте CRC не совпадает и все затирается начальными значениями из новой прошивки). Вообще вся эта система рассчитана на то, что сама прошивка не меняется. Порой нет права сменить ее, даже если найдены ошибки. Пример… Есть устройство, которое уже 4 года как имеет неактуальный софт. С кучей известных багов. Но обновить ничего нельзя. Потому что уполномоченные люди уже тогда давно приняли устройство с той прошивкой. И ответственность за обновление никто брать не хочет.
Про запись. Вообще, правильно было бы иметь внешнюю флешку. Вернее, 2 модуля. На 2-х разных интерфейсах. В виде 2-х разных микросхем. Но тут были 2 блока. Изменяются они крайне редко. Предполагается, что близко к «никогда». На практике раз 5-10 все таки перетерают при интеграции устройства. Ну и далее просто задача иметь валидные даннные для старта. Вот и все.
Это что? Имеется ввиду flash внутри микроконтроллера или одноразовая память внутри МК?
Ну оно так и сделано. А при обнаружении проблем еще и можно восстановить поврежденный экземпляр по живому.
Ну так тут так и сделано. Линкер сам собирает все сущности (переменные, структуры, массивы...), помеченные как настройки — в одну секцию. И создаются еще их копии в других блоках.
Вы используете только то имя, которое написали в макросе. Остальные использовать по внутреннему соглашению нельзя. О них заботится модуль резервирования.
К любой, в любой момент времени. До выполнения вашего кода модуль позаботится о том, чтобы там находились валидные данные. Во время сохранения в память позаботится о том, чтобы данные не менялись.
Описал выше. Вы используете только то имя, что указали в макросе.
Возможно, я неточно описал задачу. Через интерфейсы можно менять только данные в RAM или отдать команду модулю о том, что настало время сделать текущие данные — актуальными при запуске устройства. Если пользователь понаставил данных при конфигурации и понял, что «раньше было лучше», то он просто перезагружает устройство по питанию или отдает команду на восстановление настроек (в этом случа в RAM попадают значения, которые там были при включении и вызываются методы-обработчики разных объектов, которые работают с этими данными, чтобы сделать какие-то действия после обновления в них значений). И все становится как было.
Тут скорее защита от случая, когда началась перезапись настроек и пропало питание. В таком случае, часть настроек запишется, а часть нет. Контрольная сумма не совпадет и будет считаться, что данные не валидны. Тут произойдет восстановление старой конфигурации из соседнего блока.
Так-то да. Вообще, можно делать по примеру HAL-а и создать .h с переопределениями под каждый компилятор.
Уже не помню, какие были нюансы с kail, но вроде да. Но вам в любом случае нужно в линкере секции описать. Без этого никак.
Первое, чему меня учили, когда я только начинал свой путь инженера — не использовать никаких pragma, кроме как pragma once. Причина — непереносимость кода, в случае надобности.
Приходится… Ибо не знаю, где можно было бы этому профессионально обучится. Я тут говорил, что почти уже не студент. Но, честно, толку от учебы не было вообще (в плане технического развития). Мы на предмете «микроконтроллеры» 2 семестра смотрели на видео с ютуба по программированию ПЛК на языке графическом LD (нет, не язык скриптов линкера… Погуглите. Эта интересный на вид конструктор. Но никак не программирование).
Тестами и внимательным отсмотром кода, когда есть время.
Конечно самостоятельно. Смотреть как делают другие и учиться на примере этого. Набивать свои шишки и продолжать искать нужный путь. Читать литературу, что есть. Не видел у нас мест. где бы этому реально учили.
В защиту некоторых контор в которых работал скажу, что они хотя бы обеспечивают поддержку и идут на встречу заказчиком. Когда что-то деделывается по месту. Приходилось работать и с теми, что просто клали на все и говорили что-то типа «устройство готово. Доработки — другое устройство. Заказывайте заново».
Ну так… Да)… А что еще остается? Как правило, чем дольше контора живет, тем лучше у нее все с продуманностью. Обычно когда контора закрывается, ее опыт неудач и наоборот успехов уходит вместе с ней. Ну и в опыте сотрудников остается. Которые на новом месте уже пытаются не совершать определенных ошибок, с которыми столкнулись на прошлом месте работы.
Интересно. Я просто всегда был уверен, что MMU реально нужен только чтобы QNX/Linux запустить.
Обычно можно сказать спасибо за то, что оно вообще есть)
Тут как раз идет упрощение, а не усложнение. Конечный программист просто указывает, где хочет, чтобы его данные были. Просто в RAM/FLASH, или же в той области, которая может изменяться с помощью модуля взаимодействия с пользователем с функциями резервирования.
А ему не нужно думать об этом. Он просто ставит макрос, если хочет, чтобы модуль заботился о том, чтобы эти данные резервировались.
Ну есть порт этого метода и на C++. Просто объект, который при инициализации получает данные из переменных LD и далее работает с ними.
Собственно, именно это и было сделано раньше. От меня лишь было дополнения, чтобы не пришлось пихать все в одну структуру. А чтобы можно было в любом месте объявить сущность (переменную/структуру...) и она бы обрабатывалась как раз объектом класса, отвечающего за старт и резервирование.
Правильно понимаю, что у вас лежит во flash по сути std::map? И вы прошивали arduino разными прошивками и просто получали по ключу из памяти (полагаю, внешней), свои данные? А данные общие для всех 100500 прошивкок? У меня просто не было такой задачи. Просто нужен был способ красиво сказать. что сущность должна резервироваться. Все.