Пример скетча с самопрограммированием и записью во FLASH из основной программы

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

  https://github.com/majekw/optiboot/tree/supermaster/optiboot/examples/flash_program

Суть и как это возможно.

Суть в том  что теперь можно  просто из скетча   писать  djaktim и даже менять   программе  саму себя.

Это возможно благодяря вызову  функции  находящейсф в загрузчике, optiboot (модифицированном)

sadman41
Offline
Зарегистрирован: 19.10.2016

Штука интересная, но не совсем ясно как менять программе саму себя. Насколько я понимаю - МК пошагово читает с Progmem Space инструкции, выполняя их.

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

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Да , забыл упомянуть, в AVR вся  память поделена на две части условно; из первой половины нельзя   запускать  перезапись FLASH ,а из второй можно. Во второй половине находятся загрузчики которые этим занимаются.Теоритическиможно просто  программы сделать так  что часть куда  будет  находится в той половине  где   разрешена работа   команды SPM, биты размера  загрузчика не  влияют на работу этой   операции, она будет работать в любом месте входящем в максимальный размер, разрешенный для загрузчиков  в  МК  ну тоесть  бутлоанед   512байт и размер загрузочной секции 512 байт выставлен  предохранителями но  SPM   команду можно разместить и  в 4Кб верхнем блоке памяти   atmega328 

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Данный  пример больше показывает как   хранить данные во FLASH экономя EEPROM . 

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

 

И отсюда.... Загрузчики можно и нужно писать максимально полезными и они   будут не  мертвым грузом во  FLASH  памяти.

sadman41
Offline
Зарегистрирован: 19.10.2016

Окей, область памяти есть - как gcc из IDE скомандовать - функцию "обновлятор" всегда размещай в конце прошивки, по одному и тому же адресу? И что делать, если необходимо обновить обновлятор?

Я это к тому, что гораздо более простым решением видится модификация бутлодера (раз уж до этого дошло дело), который будет с внешней EEPROM или SPI flash шить на старте МК. А во внешнее хранилище обновленную прошивку уже и скетчем совать, без каких-либо плясок святого Витта.

sadman41
Offline
Зарегистрирован: 19.10.2016

yuhenotix@2p-mail.com пишет:

Данный  пример больше показывает как   хранить данные во FLASH экономя EEPROM . 


Согласен. Но тут мы вступаем на скользкий путь - ведь Arduino, концептуально, обеспечивает единый подход к программированию разных МК. Получается, что данный трик уже начинает ограничивать переносимость. Для конкретной задачи - ОК, для концепта - Fail.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Я  рассматривяю платформу как инструмент,а не как   среду с ограниченными возможностями и условностями. Стараться угодить всем и объять необъятное, в данном случае   не имеет никакого смысла.

Logik
Offline
Зарегистрирован: 05.08.2014

Там некоторые потуги поддержки разных МК наблюдаются.

/*
  * Devices with 64KB of flash or more have larger bootloader area (1KB) (they are BIGBOOT targets),
  * so entry address in these chips is different from smaller ones.
  */

Похоже основное требование - Optiboot. Если есть то работает.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В любом загрузчике есть подобные участки кода, просто надо знать точку входа.

-NMi-
Offline
Зарегистрирован: 20.08.2018

yuhenotix@2p-mail.com пишет:

Это возможно благодяря вызову  функции  находящейсф в загрузчике, optiboot (модифицированном)

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

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

НУ ДА, это ВОЗМОЖНО было уже когда ты под стол пешком ходил и об этом я тебе уже писал.

-NMi-
Offline
Зарегистрирован: 20.08.2018

yuhenotix@2p-mail.com пишет:

Теоритическиможно просто  программы сделать так  что часть куда  будет  находится в той половине  где   разрешена работа   команды SPM, биты размера  загрузчика не  влияют на работу этой   операции, она будет работать в любом месте входящем в максимальный размер, разрешенный для загрузчиков  в  МК  ну тоесть  бутлоанед   512байт и размер загрузочной секции 512 байт выставлен  предохранителями но  SPM   команду можно разместить и  в 4Кб верхнем блоке памяти   atmega328 

здаёцца мне, шо трусы ты под дождём сушишь а стираешь их сухими.

 

Кароче, праграмист-ниипаццо , пейши паэкт в протеусе, я посмотрю как это всё работает а там видно буит кто прав а кто нет!!!

Green
Offline
Зарегистрирован: 01.10.2015

-NMi- пишет:

здаёцца мне, шо трусы ты под дождём сушишь а стираешь их сухими.


Не обижай Серёжу. Он же из лучших побуждений "открывает Америку" и пытается донести это в массы.)