Atmega2560 (arduino) обновление прошивки, запись на flash

25 000 руб. за проект • безналичный расчёт, электронные деньги
23 апреля 2019, 16:38 • 5 откликов • 50 просмотров
Я имею на входе: Arduino IDE и atmega2560 и 256K flash на борту

апдейт сейчас происходит вот так:
avrdude -p atmega2560 -P /dev/ttyX -D -c stk500 -U flash:w:tx5.ino.with_bootloader.mega.hex

мне необходимо уйти полностью от avrdude и для этого я хочу сделать следующее:

в распоряжении у атмеги есть 256K флеша, где-то там в хвостике записан bootloader, который взаимодействует с avrdude и потом передает управление по 0 адресу (как я себе это представляю)

я хочу разбить эту память условно на две части (128K + 128K), во время работы МК прошивка загружается во вторую область (как попадет прошивка в МК не так важно) маленькими частями, после того как прошивка (все части) полностью загружена … проверяется контрольная сумма, и если она сошлась, то код прошивка из второй области копируется в первую (по нулевому адресу грубо говоря), вызывается перезапуск

для этого надо реализовать две функции

int updstore (size_t offset, size_t s, void *data);
-первый параметр, это смещение относительно начала прошивки (второй области), например 0 или 256 (байт)
-второй это размер данных, указатель на которые содержится в третьем параметре
-нулевой код возврата при успехе и 1 при ошибке

int updflash (size_t s, uint32_t crc32);
-аналогично размер (уже всей прошивки)
-и контрольная сумма в crc32
-завершается перезапуском при успехе, 1 при ошибке crc, 2 – любая другая ошибка

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

P.S. Я хочу добавить эти функции в скетч (он довольно большой и он уже существует и переписывать его нет возможности) в стандартный Arduino IDE и это все должно успешно собираться (без каких-то чрезвычайных хитростей)

Как я понимаю все это реализовано в коде загрузчиков, например https://github.com/Optiboot/optiboot или в стандартном