• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Простейшая прошивка с OTA

CHERTS

Moderator
Команда форума
Коллеги добрый вечер,

решил я добавить в DevKit простецкий пример с OTA, а заодно и разобраться хоть немного как оно работает, пример естественно основан на библиотеке upgrade.a от Espressif

Использую SDK 1.3 ибо в 1.4 куча глюков.

Но вот беда, даже такой простецкий пример с ОТА и то не работает, как правило все заканчивается либо недокачкой файла прошивки, то есть закачка обрывается на половине, а то и раньше, либо файл прошивки скачивается, но ничего не обновляется.

Во вложение пример над которым я бьюсь, в ota-test\include\user_config.h пишем к какой AP подцепиться ESP и адрес сервера OTA, в качестве простецкого http сервера выступает miniweb, запускается из одноименной папки файлом start.cmd
Файл build.cmd предназначен для сборки прошивки и перекладывания файлов в папку miniweb
Файл flash.cmd - прошивка ESP
Все опции сборки прошивки задаются в этих файлах. Для сборки нужен мой DevKit, собирается все без Eclipse.
Пример (файл ota.c) основан на файле C:\Espressif\ESP8266_SDK\examples\at\user\at_upgrade.c почти один в один, исправлены только названия всех функций и еще мелкие фиксы.

К слову сказать открытый загрузчик rBoot и его пример OTA так же не работаю у меня, с такими же симптомами обрыва закачки файла прошивки на середине. Возможно это у меня какие-то проблема с платой или еще что, может кто то опровергнет это или подтвердит. Проект rBoot для Eclipse во вложении.

У кого будет какие идеи? Работает ли вообще у кого то OTA?
 

Вложения

pvvx

Активный участник сообщества
Использую SDK 1.3 ибо в 1.4 куча глюков.
В 1.4.0 меньше глюков чем в 1.3.0. И далее в 1.3.0 меньше глюков чем в 1.2.0...
В 1.4.0 основные глюки в тех частях, которые не используется у обычных пользователей и в ваших примерах к UDK.
простецкий пример с ОТА и то не работает
А разве должно?
К слову сказать открытый загрузчик rBoot
А rBoot зачем? Просто для галочки или в "дань моде спортивного интереса"?
Во первых он не описан на данном сайте, во вторых он ужасен (но это многим нравится), в третьих он создает тормоз загрузки и доп.потребление для автономных вариантов, в четвертых у него нет цели, в пятых он не имеет описания на русском языке...
У кого будет какие идеи? Работает ли вообще у кого то OTA?
Исходники OTA (examples\IoT_Demo\upgrade) были ещё в esp_iot_sdk v 0.9.4.
Система upgrade была глючной и такой и осталась. Хорошо, что она теперь отдельной либой и просто удаляется из системы.

1) Как это возможно: "Accept-Encoding: gzip,deflate\r\n\"
ESP8266 уже поддерживает разжатие gzip данных?
2) Где espconn_recv_hold() и espconn_recv_unhold() ?
miniweb.exe имеет функцию отсылки каждого пакета TCP с паузой ожидания или он имеет телепатическую связь c ESP8266 и знает когда лить дальше файл в зависимости от её скорости стирания/записи китайским кодом?
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
В 1.4.0 меньше глюков чем в 1.3.0. И далее в 1.3.0 меньше глюков чем в 1.2.0...
В 1.4.0 основные глюки в тех частях, которые не используется у обычных пользователей и в ваших примерах к UDK.
У меня на простецком примере с реализацией UDP сервера код на SDK 1.3.0 работает, на 1.4.0 уже не работает, причем не работает именно отправка данных. (P.S. Использую глючный espconn уж простите). По моему это реально баг в SDK и такие приколы не только у меня, что код на 1.3.0 нормально работает, а на 1.4.0 по странным обстоятельствам перестал работать.

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

А rBoot зачем? Просто для галочки или в "дань моде спортивного интереса"?
Во первых он не описан на данном сайте, во вторых он ужасен (но это многим нравится), в третьих он создает тормоз загрузки и доп.потребление для автономных вариантов, в четвертых у него нет цели, в пятых он не имеет описания на русском языке...
Просто другой альтернативы с OTA я не вижу, либо китайский закрытый загрузчик и закрытая библиотека, либо rBoot и то и то судя по всему далеки от совершенства. А по поводу русского языка, блин ну простите, в доках по Espressif SDK тоже ни строчки по-русски. И rBoot на данном форуме не обсуждают ибо никто его не осилил или не щупал и не тестировал, я решил потестировать.

1) Как это возможно: "Accept-Encoding: gzip,deflate\r\n\"
ESP8266 уже поддерживает разжатие gzip данных?
Это может показаться странным, но код взять из SDK китайцев, Вы абсолютно правы, что "Accept-Encoding: gzip,deflate" в случае ESP бесполезен, но так написали китайцы. На самом деле эта строка никак не влияет на факт разрыва связи при скачке файла прошивки.

2) Где espconn_recv_hold() и espconn_recv_unhold() ?
Интересные функции, попробую с ними пошаманить, спасибо.

miniweb.exe имеет функцию отсылки каждого пакета TCP с паузой ожидания или он имеет телепатическую связь c ESP8266 и знает когда лить дальше файл в зависимости от её скорости стирания/записи китайским кодом?
Использование miniweb.exe никак не влияет на факт разрыва связи при скачке файла прошивки, я пробовал использовать nginx на своем хостинговом сервере, пробовал использовать реализацию простейшего web-сервера на nodejs - толку нуль, все равно связь рвется.

Вот я и интересуюсь, получилось ли у кого-то реализовать OTA? Я точно знаю у кого получилось с OTA, но у этого человека исходники прошивки закрыты, так что код OTA он не даст, остается только грызть гранит самостоятельно.
 

pvvx

Активный участник сообщества
Это может показаться странным, но код взять из SDK китайцев, Вы абсолютно правы, что "Accept-Encoding: gzip,deflate" в случае ESP бесполезен, но так написали китайцы. На самом деле эта строка никак не влияет на факт разрыва связи при скачке файла прошивки.
Почему не влияет? Любой web увидев разрешение сожмет передаваемые данные и так и пошлет в gzip.

Код китайцев из esp_iot_sdk_v094\examples\IoT_Demo\upgrade\upgrade_lib.c и вставлен в rBoot. Изменений там мало, только из -за обрастания новыми функциями в новых SDK - может функции название сменилось и т.д..

И на счет SDK 1.4.0 и 1.3.0 - исходники espconn от них обоих находятся в открытом доступе. Написали бы конкретнее что у вас не работает в SDK 1.4.0. Наверняка просто надо использовать какую новую функцию или новый параметр описанный в их доке (pdf к SDK).
Посмотрел различия espconn 1.3.0 c 1.4.0 - у UDP функций изменилось кол-во параметров и появились новые функции типа espconn_sendto()
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
Почему не влияет? Любой web увидев разрешение сожмет передаваемые данные и так и пошлет в gzip.
Сожмет если умеет это делать, в моем случае miniweb.exe не умеет это делать, поэтому заголовок не важен,
что Accept-Encoding: gzip,deflate\r\n\", что мы его не укажем, эффект один. В случае nginx если на нем есть gzip сжатие, то да он отправит данные в сжатом виде, хотя это можно запретить для определенных типов файлов.

Написали бы конкретнее что у вас не работает в SDK 1.4.0. Наверняка просто надо использовать какую новую функцию или новый параметр описанный в их доке (pdf к SDK).
Не работает простейший код:
Код:
        os_sprintf(payload, "ESP v%d.%d", FW_VER_MAJOR, FW_VER_MINOR);
        espconn_sent(pCon, payload, os_strlen(payload));
Количество параметров в espconn_sent не изменилось, было 3 в SDK 1.3.0 и осталось 3 в 1.4.0
Другое дело, что у espconn_sent написано This API is deprecated, please use espconn_send instead.

В changelog к 1.4.0 написано:
Код:
8. Espconn APIs
   espconn_sendto: send UDP data.
Зачем сделили 2 функции espconn_send и espconn_sendto? Вообще не понимаю китайцев.
 

pvvx

Активный участник сообщества
А почему нет? Пример в SDK и библиотека upgrade не от фонаря сделаны и хоть как-то да должны работать. Просто возможно есть какой-то секрет, почему у китайцев оно работает, а у меня в простом примере нет.
От фонаря сделаны и не работают. Иногда, при определенных условиях, со специальным сервером, когда погода в инете хорошая то может и сработает. Но это не есть "работает". По тому все и пытаются использовать свой код для OTA, но пока не видел нормальной рабочей реализации. А мне ОТА пока не требуется - это зло, связанное с выпуском производителями кривого ПО и сваливания исправления ошибок за счет ОТА. Т.е. по сути это лишний код и дыра в уязвимости.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Не работает простейший код:
Код:
        os_sprintf(payload, "ESP v%d.%d", FW_VER_MAJOR, FW_VER_MINOR);
        espconn_sent(pCon, payload, os_strlen(payload));
.
Для UDP?
udp_sendto(struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip, u16_t dst_port)
Для TCP?
tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)
Что ещё надо?
Зачем сделили 2 функции espconn_send и espconn_sendto? Вообще не понимаю китайцев.
По тому, что бывают разные методы. Разные host и remote, разные методы отсылки - частями, стеком TCP, набором в буфер, без буферизации и т.д.

Вы же наверно понимаете, что Espressif хочет дублировать все функции LwIP, но ещё занимая дополнительную RAM + FLASH и создавая кучу ненужного кода с багами и ограничениями. Это не реально и в итоге при добавке любой новой функциональности в SDK у них каждый раз меняется espconn, обрастая разными флагами и обходами для старой совместимости, что иногда просто невозможно.
Объем кода, багов и используемых ресурсов работающего прямо с LwIP всегда меньше, чем если использовать espconn.

Мне совсем не понятно зачем делают простые вещи через … Ну как говорят “Гланды через …”

К примеру, зачем нужна загрузка через rBoot? Сложно описать ветку в своем загрузчике? Необходимо обязательно прикрутить какую фигню (типа внешнего облака и т.д.) и потом пытаться через неё что-то сделать, когда это всё работает напрямую и давно поддерживается без глюков в прошивке?
 
Последнее редактирование:

iLexey

New member
@CHERTS У меня в проекте работает код rBoot, а со стандартным OTA так и не получилось (судя по всему моя программа не влезает в память ESP-07, а с rBoot такой проблемы нет). SDK версии 1.3. Могу скинуть свой пример в личку, чтобы не засорять данную ветку говнокодом, который некоторых тут так сильно раздражает.
 

pvvx

Активный участник сообщества
@CHERTS У меня в проекте работает код rBoot, а со стандартным OTA так и не получилось (судя по всему моя программа не влезает в память ESP-07, а с rBoot такой проблемы нет). SDK версии 1.3. Могу скинуть свой пример в личку, чтобы не засорять данную ветку говнокодом, который некоторых тут так сильно раздражает.
Никого тут ничего не раздражет. Чем больше кривого кода - тем веселее :) Я вообще не программист... Так что кидайте - пусть народ мучается c rBoot :)
 

iLexey

New member
Да, собственно, ничего хитрого я и не сделал. Взял стандартный rBoot и собрал его стандартным esp-open-sdk (у меня MacOS, поэтому все утилиты из набора пришлось самостоятельно компилировать, но это уже другая история). Так же я использую и esptool2 (тоже из rBoot, позволяет просто и быстро скопировать нужные секции из ELF-файла в файл готовой прошивки, с другими утилитами не очень сложилось - всякие objcpy как-то косячно это делают или руки мои не оттудова растутъ).

Из проекта rBoot в свой проект я скопировал файлы rboot-api.c/h rboot-ota.c/h rboot.h немного их подкрутив, чтобы конфигурация сервера обновлений и имена файлов задавались через центральный конфиг всей прошивки (в rBoot оно жёстко прибито define'ами);

Дальше у меня есть файл fota_rboot.c (тоже из примера rBoot) такого содержания:
Код:
#include <c_types.h>
#include "comm_proto.h"
#include "my_debug.h"
#include "rboot-ota.h"
#include "fota_rboot.h"

LOCAL void ICACHE_FLASH_ATTR
ota_cb(bool result, uint8 rom_slot)
{
    LOG("FOTA Callback");
    if (result == TRUE) {
        // update succeeded
        if (rom_slot == FLASH_BY_ADDR) {
            LOG("FOTA ROM write successful");
        }
        else {
            // set to boot new rom and then reboot
            LOG("FOTA Firmware updated, rebooting to ROM %d...", rom_slot);
            rboot_set_current_rom(rom_slot);
            Proto_SendMessage(MSG_SERVICE, NULL, "rebooting");
            system_restart();
        }
    }
    else {
        // update failed
        LOG("FOTA Firmware update failed!");
    }
}

void ICACHE_FLASH_ATTR
Init_Update()
{
    LOG("FOTA Init update...");
    Proto_SendMessage(MSG_SERVICE, NULL, "upgrading");

    // start the upgrade process
    //if ( rboot_ota_start((ota_callback)ota_cb) )
    if ( rboot_ota_start(ota_cb) ) LOG("FOTA Updating...");
    else LOG("FOTA Updating failed!");
}
Собирается прошивка OTA у меня вот так (строки из Makefile, надеюсь по названиям переменных все понятно):
Код:
ADDR_BOOTLDR    = 0x00000
ADDR_OTA_ROM0   = 0x02000
ADDR_OTA_ROM1   = 0x42000
FW_OTA_ROM0     := $(addprefix $(OTAFW_DIR)/,$(FW_PREFIX)_$(ADDR_OTA_ROM0).bin)
FW_OTA_ROM1     := $(addprefix $(OTAFW_DIR)/,$(FW_PREFIX)_$(ADDR_OTA_ROM1).bin)

ota_firmware: target_out $(FW_BOOTLDR)
    $(vecho) "FW $(FW_OTA_ROM0) (ota, rom0)"
    @$(ESPTOOL2) -quiet -bin -boot2 $(TARGET_OUT_ROM0) $(FW_OTA_ROM0) .text .data .rodata
    $(vecho) "B64 $(FW_OTA_ROM0) (ota, rom0)"
    @base64 -i $(FW_OTA_ROM0) -o $(FW_OTA_ROM0).b64
    $(vecho) "FW $(FW_OTA_ROM1) (ota, rom1)"
    @$(ESPTOOL2) -quiet -bin -boot2 $(TARGET_OUT_ROM1) $(FW_OTA_ROM1) .text .data .rodata
    $(vecho) "B64 $(FW_OTA_ROM1) (ota, rom1)"
    @base64 -i $(FW_OTA_ROM1) -o $(FW_OTA_ROM1).b64

target_out: $(APP_AR)
    $(vecho) "LD $(TARGET_OUT_STD)"
    $(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $(TARGET_OUT_STD)
    $(vecho) "LD $(TARGET_OUT_ROM0)"
    $(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT1) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $(TARGET_OUT_ROM0)
    $(vecho) "LD $(TARGET_OUT_ROM1)"
    $(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT2) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $(TARGET_OUT_ROM1)

flashota_rboot:
    $(ESPTOOL) -p $(ESPPORT) -b 230400 write_flash -fs 4m $(ADDR_BOOTLDR) $(FW_BOOTLDR) $(ADDR_OTA_ROM0) $(FW_OTA_ROM0)
Здесь только отмечу, что одновременно создаются 3 версии ELF-файлов: соответственно для ROM0, ROM1 и стандартной прошивки без OTA, соответственно при помощи скриптов LD_SCRIPT0, LD_SCRIPT1 и LD_SCRIPT. Так что получается, что щапустив просто make - происходит сборка прошивки в двух вариантах - для OTA и обычной. При запуске make flashota_rboot в девайс прошивается только bootloader (rboot) и ROM0, когда нужно - я даю команду UPGRADE и девайс уже сам скачивает и прошивает ROM1.
Да, чуть было не забыл, LD_SCRIPT0 - это стандартный скрипт линковщика из SDK с изменённой строкой 8:
Код:
  irom0_0_seg :                         org = 0x40202010, len = 0x3A000
LD_SCRIPT1, соответственно с такой строкой 8:
Код:
  irom0_0_seg :                         org = 0x40242010, len = 0x3A000
Вроде бы все.

@pvvx, а перед вами я на самом деле преклоняюсь - реально многое почерпнул из ваших постов, спасибо!
 

pvvx

Активный участник сообщества
Да, но как все либы SDK1.4.0 два раза залезят в одну 512 кило flash?
Для примера возьмем IoT_Demo SDK 1.4.1 + для уменьшения размера либу microc:
Первый бинарник для загрузки выходит 0x070E0 -> для округления к сектору flash = 32768 байт
Второй бинарник = 0x34D58, сравняв к сектору = 217088 байт
217088+32768 = 249856 = 244 килобайта, а имеем всего 512 - 16 = 496 килобайт (-16 на системные сохранения конфигурации) из чего половина = 248.
rBoot практически не лезет.
 
Последнее редактирование:

iLexey

New member
Да, но как все либы SDK1.4.0 два раза залезят в одну 512 кило flash?
Для примера возьмем IoT_Demo SDK 1.4.1 + для уменьшения размера либу microc:
Первый бинарник для загрузки выходит 0x070E0 -> для округления к сектору flash = 32768 байт
Второй бинарник = 0x34D58, сравняв к сектору = 217088 байт
217088+32768 = 249856 = 244 килобайта, а имеем всего 512 - 16 = 496 килобайт (-16 на системные сохранения конфигурации) из чего половина = 248.
rBoot практически не лезет.
Вот честно, я не знаю как все влезает, долго пытался посчитать - не складывается =) Вообще из библиотек и SDK (пока на 1.4 не перешел, говорю про 1.3) я использую только "c gcc hal pp phy net80211 lwip wpa main pwm" (вот это прямо строка из Makefile). Уменьшитель microc пока не использую, стоит в планах. В такой конфигурации на данный момент моя OTA прошивка имеет следующие размеры: файл bootloader'а 0x00000.bin = 2224 Б. файлы ROM0 и ROM1 со включенной отладочной информацией (у меня это функция LOG(...)) 0x02000.bin и 0x42000.bin = 228928 Б. Без отладочной информации, 0x02000.bin и 0x42000.bin = 216992 Б. Обычная прошивка (как я говорил - у меня собирается сразу 2 варианта на всякий случай), размер 0x00000.bin = 32000 Б, размер 0x40000.bin = 184964 Б (без отладки). И 0x00000.bin = 38928 Б, 0x40000.bin = 189972 Б с отладкой. При этом я не использую SSL (занимает много места), но оно мне и не надо - все устройства живут в отдельной WiFi-сети, доступ в интернет имеет только роутер через другой роутер на котором всякие фаерволлы и прочее :). Но я использую MQTT который занимает довольно много места. Как я уже говорил - с rBoot все работает и обновляется по воздуху одной командой в MQTT (интерфейсная часть - это уже отдельная история). Со стандартной библиотекой upgrade из SDK - прошивка загружается в девайс, но при обновлении вылезает ошибка.
Ну и еще пару цифр девайс пишет, что SPI Flash Size: 524288 а при обновлении rBoot говорит что ROM[0] addr = 8192, ROM[1] addr = 270336 из чего я заключаю, что пока еще места на мой код хватает :) Как-то так.
 

iLexey

New member
rBoot практически не лезет.
Да и почему он не лезет? Ведь правильно я понимаю, что стандартная библиотека upgrade = 24КБ, мы убираем ее, а добавляем 3КБ кода rBoot? У автора этого загрузчика его пример прошивки вообще занимает 200912 Б.
 

pvvx

Активный участник сообщества
Да и почему он не лезет? Ведь правильно я понимаю, что стандартная библиотека upgrade = 24КБ, мы убираем ее, а добавляем 3КБ кода rBoot? У автора этого загрузчика его пример прошивки вообще занимает 200912 Б.
Если rBoot тратит хоть пол кило, то это 1 сектор. На запись конфигурации он тратит ещё 1 сектор. Второй этап загрузчика ещё 1 сектор? Итого 3 сектора? (12 килобайт?)
Код прошивки esp_ptintf("Hello!") не требует ни каких библиотек, а так-же есть и SDK 0.9.1 - она ещё меньше :)
 

iLexey

New member
Если rBoot тратит хоть пол кило, то это 1 сектор. На запись конфигурации он тратит ещё 1 сектор. Второй этап загрузчика ещё 1 сектор? Итого 3 сектора? (12 килобайт?)
Код прошивки esp_ptintf("Hello!") не требует ни каких библиотек, а так-же есть и SDK 0.9.1 - она ещё меньше :)
Сам rBoot - это чуть более 2КБ = 1 сектор, конфиг у него один и он общий для всех загрузчиков - еще один сектор. Собственно, да - занимает все это дело 2 сектора (что-то я об этом не задумывался), поэтому код прошивки записывается начиная с адреса 0x02000, а вторая часть с адреса 0x42000 (он объяснил это тем, что никто не мешает и с 0x40000, но для симметричности - 0x02000 + 0x40000 = 0x42000). 2 сектора - это 8КБ, вместо 24КБ у libupgrade, я считаю, неплохая замена :) Пример в 200К - это да, почти "hello world" - простая прошивка с пятком команд через UART. Компилил я ее SDK1.3, может с 0.9.1 будет еще меньше. А еще у rBoot есть немаловажное преимущество - этот загрузчик работает с моим кодом, в отличие от SDK'шного (хотя изначально я не хотел его использовать) :)
Других же альтернатив OTA я, к сожалению, не нашел.
 

pvvx

Активный участник сообщества
Минусы rBoot:
1) Ужасно долгое время старта прошивки с увеличением потребления (не годится для автономной версии).
2) Вывод большой кучи символов на оба UART на кривой скорости.
3) Лишнее потребление flash
Функция OTA плюсом в ней не является, т.к. может быть реализована и самими в любой прошивке.
Во время его работы включен WiFi на неверной частоте и просто жрет, CPU работает на пониженной частоте 52 MHz, шина SPI для чтения flash работает по одной линии (не QIO или DIO) и на очень низкой частоте, вывод символов сообщений в UART идет с ожиданием вывода каждого символа и других задач не выполняется (fifo UART не используется) во время этих выводов символов на кривом baud.
Пример - ROM-BIOS загружает 104 байта одиночный блок при тех-же условиях 23 ms. При включенной QIO и нормальной установке QSPI 23 килобайта 3 сегмента грузятся 3.2 ms.
(https://raw.githubusercontent.com/pvvx/Rapid_Loader/master/ESP-01-StartSignals.gif)
Как итого - rBoot это система замедления загрузки ESP8266 примерно в 200 раз. Это его основная функция. Но можно было бы написать и правильно, чтобы через 43..45 ms после старта уже выполнялась инициализация SDK. Но автор решил представить всем самый максимальный тормоз и самый жручий вариант загрузчика из возможных (на момент выхода его rBoot всё это уже было описано и сказано как сделать правильно) :) Первые варианты rBoot имели ещё встроенную задержку на 1 сек :) Это всё очень смахивает на специальное вредительство, чтобы люди использовали худший вариант. :)
 
Последнее редактирование:

iLexey

New member
Ну не знаю, согласен - есть минусы, однако стартует прошивка достаточно быстро, ну да не за миллисекунды, а за пару секунд (до полной функциональности), насколько это страшно - каждый решает сам, меня пока устраивает (хотя, конечно, хочется большего). UART я отключаю за не надобностью (все общение через MQTT) так что при загрузке выводится всего пару строк.
Пока чтобы самому реализовать OTA мозгов у меня не хватает, про ROM-BIOS читал, но пока ничего не понял. Не уверен, что тот Ричард который написал rBoot специально решил сделать тормознутую систему и специально вредить, скорее просто сам не знает, как можно сделать лучше.
В любом случае, других альтернатив просто нет (ну кроме написать все самому). Если вы подскажете как сделать я, может, и справлюсь, но скорее всего это будет очередной говнокод, вносящий кучу задержек и тормозов и ваще не по фен-шую деланный.
 

Br.Misha

New member
Товарищи, разрабатываю бутлоадер, появилось несколько вопросов. Делаю на базе rBoot.
Правильно ли я понимаю, что в результате флеш разделяется на 2 части, в которой находятся 2 прошивки (плюс ещё части для бутлоадера и резервные)? Если, к примеру, запущена прошивка 1, тогда она скачает прошивку 2 и загрузит её в область второй прошивки, после чего модуль перезагрузится и бутлоадер, который в самом начале, запустит прошивку 2. Когда появится следующая версия прошивки, модуль скачает (по определенному триггеру) уже прошивку 1 и зальет в область прошивки 1, после чего она будет запущена. При этом, на сервере, откуда берется прошивка, должно быть размещено 2 версии прошивки, для первой области и для второй.
Если всё выше правильно, тогда какой размер одной области в случае в 512 кб флеш? Если посмотреть на мейкфайл, то видно, что первая прошивка записывается по адресу 0x2000, получается, что на бутлоадер и все его плюшки уходит 4к, значит, максимальный размер области для одной прошивки (512-4)/2 = 254К?
Прошу дать ответы на мои вопросы)))
Спасибо!
 

Br.Misha

New member
я уже с родным загрузчиком разобрался, но спасибо за наводку, так как в родном много косяков)))
 
Сверху Снизу