• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Использование rboot

Amusek

New member
Здравствуйте пытаюсь разобраться с rboot, но что то не получается. Я взял стандартный пример blinky, скопировал в его папку eagle.app.v6.ld и eagle.rom.addr.v6.ld после чего модифицировал строку на irom0_0_seg : org = 0x40202010, len = 0x5C000 как написано на гитхабе. Собрал и слинковал этот проект. для получения elf файла использовал команду esptool2 -bin -boot2 blinky blinky.bin .text .data .rodata. скопировал полученный файл в папку blinky и прошил как написано на том же гитхабе esptool.py write_flash -fs 4m 0x0000 rboot.bin 0x2000 blinky.bin.
Получил кирпич. Обновил ld файлы в папке rboot, но это не помогло. Поставил флаг создания бинарника в makefile rboot на -boot2 перестало собираться(вроде об этом написано на гитхабе, но все равно не понятно, ведь -boot2 нужен для создания прошивки которая работает с rboot).
Пример автора не собирается и пишет что не влазит.
xtensa-lx106-elf/bin/ld: build/rom0.elf section `.text' will not fit in region `iram1_0_seg'
Что делать дальше ума не приложу, заранее спасибо за помощь!
 

pvvx

Активный участник сообщества
Что делать дальше ума не приложу
Прежде всего подумать. Нужен ли вам этот дополнительный boot, замедляющий и так долгий старт-загрузку SDK.
Если это задача по сборке всего что найдено, в целях собственного обучения, то стоит заняться собственной разборкой причин, почему не собирается как надо.
Для любых других вариантов ответа предоставленной вами информации недостаточно.
 
Последнее редактирование:

Amusek

New member
Хочу сделать собственную OTA, потому что не могу найти внятной информации по "официальной", самой официальной в примерах и еще некоторым причинам. Из существующих альтернатив нашел только arduino и некоторые другие решения которые тоже сделаны на rboot. Если для решения моей проблемы не хватает какой то дополнительной информации, то пожалуйста скажите какой, я сразу же ее предоставлю.
 

pvvx

Активный участник сообщества
Ну пишите вы верно, но где-то допустили ошибки. Без наличия всех данных, чем собираете, кодов скриптов и прочего, сказать ничего не возможно.
Гадать в таких случаях бесполезно, т.к. ошибка/допущенное незнание наверняка простая/простое...
А так-же не указали цель - что хотите получить, т.к. есть масса альтернатив.
 

Amusek

New member
Возможно вы правы. Отлично было бы найти максимально простой способ OTA, без сервера, rtos, nodemcu, arduino и прочей фигни. Если такой есть в открытом доступе буду очень признателен за наводку. А пока имеем что имеем. Файлы приложил, но это по факту стандартные файлы, а изменил я только 1 строку в ld блинк, ну еще обновил лд файлы в папке rboot. версия sdk: ESP8266_NONOS_SDK-2.1.0-18-g61248df. Меня немного смущает что в rboot-sample надо скидывать файлы rboot в папку проекта, тут же я ничего подобного не делал.
 

Вложения

  • 24.8 KB Просмотры: 7

nikolz

Well-known member
Возможно вы правы. Отлично было бы найти максимально простой способ OTA, без сервера, rtos, nodemcu, arduino и прочей фигни. Если такой есть в открытом доступе буду очень признателен за наводку. А пока имеем что имеем. Файлы приложил, но это по факту стандартные файлы, а изменил я только 1 строку в ld блинк, ну еще обновил лд файлы в папке rboot. версия sdk: ESP8266_NONOS_SDK-2.1.0-18-g61248df. Меня немного смущает что в rboot-sample надо скидывать файлы rboot в папку проекта, тут же я ничего подобного не делал.
Выкладываю rboot для сборки в UDK
распакуйте папку в C:\Espressif\examples\ESP8266
импортируйте в Eclipse
all - собрать
flash - записать в ESP
После старта ESP в терминале будет

upload_2018-3-11_11-10-39.png
 

Вложения

Хочу сделать собственную OTA, потому что не могу найти внятной информации по "официальной", самой официальной в примерах и еще некоторым причинам. Из существующих альтернатив нашел только arduino и некоторые другие решения которые тоже сделаны на rboot. Если для решения моей проблемы не хватает какой то дополнительной информации, то пожалуйста скажите какой, я сразу же ее предоставлю.
С самой официальной SDK, и, практически, ничем больше у меня получился апдейт с Web сервера с бинарниками user1.bin и user2.bin. Вызывается или из встроенного примитивнейшего Web-setup, или командой по MQTT. В проект добавляется для этого только файл ota.c, не помню откуда взятый, и все.

Компилируется все батником
Код:
del bin\*.bin
@make BOOT=new APP=1 rebuild
copy firmware\upgrade\user?*.bin bin\user?.bin
@make BOOT=new APP=2 rebuild
copy firmware\upgrade\user?*.bin bin\user?.bin
copy bin\user?.bin \\192.168.0.2\WebUpdate\GW\user?.bin
в makefile я изменил
Код:
flashinit:
    $(vecho) "Flash init data default and blank data."
    $(ESPTOOL) -p $(ESPPORT) erase_flash
    $(ESPTOOL) -p $(ESPPORT) write_flash $(flashimageoptions) 0x7c000 $(SDK_BASE)/bin/esp_init_data_default.bin 0x7e000 $(SDK_BASE)/bin/blank.bin 0x3fc000 $(SDK_BASE)/bin/esp_init_data_default.bin
а в .cproject добавил
Код:
            <target name="all_user1" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
                <buildCommand>mingw32-make.exe</buildCommand>
                <buildArguments>-f ${ProjDirPath}/Makefile BOOT=new APP=1</buildArguments>
                <buildTarget>all</buildTarget>
                <stopOnError>true</stopOnError>
                <useDefaultCommand>false</useDefaultCommand>
                <runAllBuilders>true</runAllBuilders>
            </target>
            <target name="flashboot" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
                <buildCommand>mingw32-make.exe</buildCommand>
                <buildArguments>-f ${ProjDirPath}/Makefile BOOT=new APP=1</buildArguments>
                <buildTarget>flashboot</buildTarget>
                <stopOnError>true</stopOnError>
                <useDefaultCommand>false</useDefaultCommand>
                <runAllBuilders>true</runAllBuilders>
            </target>
            <target name="flash_user1" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
                <buildCommand>mingw32-make.exe</buildCommand>
                <buildArguments>-f ${ProjDirPath}/Makefile BOOT=new APP=1</buildArguments>
                <buildTarget>flash</buildTarget>
                <stopOnError>true</stopOnError>
                <useDefaultCommand>false</useDefaultCommand>
                <runAllBuilders>true</runAllBuilders>
            </target>
            <target name="all_user1" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
                <buildCommand>mingw32-make.exe</buildCommand>
                <buildArguments>-f ${ProjDirPath}/Makefile BOOT=new APP=1</buildArguments>
                <buildTarget>all</buildTarget>
                <stopOnError>true</stopOnError>
                <useDefaultCommand>false</useDefaultCommand>
                <runAllBuilders>true</runAllBuilders>
            </target>
            <target name="Bld" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
                <buildCommand>bld.bat</buildCommand>
                <buildArguments/>
                <buildTarget/>
                <stopOnError>true</stopOnError>
                <useDefaultCommand>false</useDefaultCommand>
                <runAllBuilders>true</runAllBuilders>
            </target>
Ну и собственно вызов OTA. Прекращаю всю прочую функциональность, формирую строку и запускаю апдейт. user1.bin на user2.bin оно меняет внутри себя само.
Код:
void ICACHE_FLASH_ATTR OTA(void)
{
  rx0_enable(false);
  clear_uart0();
  os_timer_disarm(&_10ms_timer);
  os_sprintf(str, "%s/user1.bin",sysCfg.otaUrl);
  os_printf("OTA: %s\r\n", str);
  start_ota(str);
}
//---------------------------------------------------------------------------
Использую UDK v2.2.2 (23.04.2017) и SDK V2.2.0 (последняя на сегодня). На локальном компе 192.168.0.2 поднят просто IIS, батник туда копирует файлы для апдейта, у меня это второй комп, там же MQTT брокер бежит, но нет проблем все это и на единственном поднять.

Да, первый раз надо сначала сделать модулю flashinit, потом flashboot, а потом flash_user1. Ну и перед этим сделать clean и all_user1. Потом можно или снова жечь по проводу flash_user1, или компилировать оба бинарника и жечь через OTA.
 

Вложения

  • 6.6 KB Просмотры: 8
  • 313 байт Просмотры: 5
Последнее редактирование:

pvvx

Активный участник сообщества
Отлично было бы найти максимально простой способ OTA, без сервера, rtos, nodemcu, arduino и прочей фигни.
Ещё раз - что вы хотите получить?
Возможность в flash на N МБайт иметь N разных прошивок (включая и OTA) и выбор между этими загрузками или одиночный OTA?
Функция OTA в SDK встроена, надо только к ней обратиться...
В вашем примере нет ничего по поводу OTA.
 

Amusek

New member
Выкладываю rboot для сборки в UDK
распакуйте папку в C:\Espressif\examples\ESP8266
импортируйте в Eclipse
all - собрать
flash - записать в ESP
После старта ESP в терминале будет

Посмотреть вложение 5963
Спасибо начал разбираться и смог запустить rboot. Но добавить свой ром не получилось. Вероятно ошибка в ld файле(но это не точно). Оригинальный файл лд выглядит так
irom0_0_seg : org = 0x40210000, len = 0x5C000, следуя инструкциям из гитхаба меняем на 0x40212010 получаю ошибку:

Booting rom 0.
Fatal exception (0):
epc1=0x402233ac, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

в примере с git адрес другой и надо изменить на 0x40202010
тогда в терминале появляется:
Booting rom 0.
Но ничего не работает в без опции -boot2, а с ней я получаю кирпич.

В лд скрипте самого rboot стоит адрес 0x40240000 добавляем по инструкции получаем 0x40242010
в этом случае тоже ошибка но другая:

Booting rom 0.
Fatal exception (28):
epc1=0x402533ac, epc2=0x00000000, epc3=0x00000000, excvaddr=0x0000000a, depc=0x00000000

Подготавалию бит файл и зашиваю его вот так:

xtensa-lx106-elf-gcc -c -I. -w -mlongcalls -o blinky.o blinky.c
xtensa-lx106-elf-gcc -nostdlib -Wl,--start-group -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lc -Wl,--end-group -lgcc -Trom1.ld blinky.o -o blinky
esptool2 -bin -boot2 blinky blinky.bin .text .data .rodata
esptool -p /dev/ttyUSB0 -b 115200 write_flash -fs 4m 0x00000 rboot.bin 0x2000 blinky.bin

P.S. в первом и втором случаях опция -boot2 ни на что не влияет.

С самой официальной SDK, и, практически, ничем больше у меня получился апдейт с Web сервера с бинарниками user1.bin и user2.bin. Вызывается или из встроенного примитивнейшего Web-setup, или командой по MQTT. В проект добавляется для этого только файл ota.c, не помню откуда взятый, и все.
Спасибо попробую этот способ тоже, но уже хотелось бы и rboot домучать. Плюс вариант с web сервером мне совсем не нравится и хотелось бы передавать прошивку по udp.
 

nikolz

Well-known member
Спасибо начал разбираться и смог запустить rboot. Но добавить свой ром не получилось. Вероятно ошибка в ld файле(но это не точно). Оригинальный файл лд выглядит так
irom0_0_seg : org = 0x40210000, len = 0x5C000, следуя инструкциям из гитхаба меняем на 0x40212010 получаю ошибку:

Booting rom 0.
Fatal exception (0):
epc1=0x402233ac, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

в примере с git адрес другой и надо изменить на 0x40202010
тогда в терминале появляется:
Booting rom 0.
Но ничего не работает в без опции -boot2, а с ней я получаю кирпич.

В лд скрипте самого rboot стоит адрес 0x40240000 добавляем по инструкции получаем 0x40242010
в этом случае тоже ошибка но другая:

Booting rom 0.
Fatal exception (28):
epc1=0x402533ac, epc2=0x00000000, epc3=0x00000000, excvaddr=0x0000000a, depc=0x00000000

Подготавалию бит файл и зашиваю его вот так:

xtensa-lx106-elf-gcc -c -I. -w -mlongcalls -o blinky.o blinky.c
xtensa-lx106-elf-gcc -nostdlib -Wl,--start-group -lmain -lnet80211 -lwpa -llwip -lpp -lphy -lc -Wl,--end-group -lgcc -Trom1.ld blinky.o -o blinky
esptool2 -bin -boot2 blinky blinky.bin .text .data .rodata
esptool -p /dev/ttyUSB0 -b 115200 write_flash -fs 4m 0x00000 rboot.bin 0x2000 blinky.bin

P.S. в первом и втором случаях опция -boot2 ни на что не влияет.


Спасибо попробую этот способ тоже, но уже хотелось бы и rboot домучать. Плюс вариант с web сервером мне совсем не нравится и хотелось бы передавать прошивку по udp.
Я применяю rboot для других целей.
Я на его основе сделал nboot - это загрузчик который позволяет при старте работать с датчиками и делать вычисления без WIFI и если надо то запустить стандартную сборку на SDK с WIFI.
На мой взгляд это единственное преимущество использование rboot
Кратко что в результате получаем.
1) быстрая загрузка и работа с током потребления 15 ма вместо 70 ма в стандартном варианте.
2) запуск WIFI если надо быстрее чем обычно на 120 мс.
------------------------------------
Для загрузки по воздуху нет надобности в rboot, как указано выше.
===========================================
Поэтому могу пояснить некоторые моменты для запуска своего приложения.
Сначала собираем rboot.bin
потом собираем в один фАЙЛ СВОЕ ПРИЛОЖЕНИЕ
грузим во флешь с 0x0000 rboot.bin и c 0x02000 свое приложение.
После старта получаем это:
upload_2018-3-11_19-30-8.png

еще замечу, что rboot не работает c SDK 2.2.0 от 8 февраля 2018 г.
 

pvvx

Активный участник сообщества
Я применяю rboot для других целей.
Я на его основе сделал nboot - это загрузчик который позволяет при старте работать с датчиками и делать вычисления без WIFI и если надо то запустить стандартную сборку на SDK с WIFI.
На мой взгляд это единственное преимущество использование rboot
Кратко что в результате получаем.
1) быстрая загрузка и работа с током потребления 15 ма вместо 70 ма в стандартном варианте.
2) запуск WIFI если надо быстрее чем обычно на 120 мс.
Что-то вы опять выдумали. :(
В rboot нет отключения блока RF по старту и жрет он аналогично всему остальному...
Ускорения старта загрузки второй части (SDK) он так-же не дает - пока он там выведет свои сообщения в UART об ней, проходит ещё полчаса...
Тем более грузит он её по SPI на аналогичной скорости, как и ROM, да и той-же функцией. В итоге уходит больше времени и потребления, чем при старте напрямую из ROM стандартной SDK.
Не очищает bss. Так-же не отключает WDT, если была перезагрузка из SDK с включенным WDT. И не делает ничего полезного, кроме вывода в UART информации по известным заранее заголовкам пользователю. Всё это и многое другое что он не делает, грозит сложно уловимыми ошибками при вставки в него процедур с датчиками... В таком случае проще написать всё своё, немного поглядев код rboot, если в первой с ESP8266...

Зачем вы всё время обманываете?
 
Последнее редактирование:

nikolz

Well-known member
Что-то вы опять выдумали. :(
В rboot нет отключения блока RF по старту и жрет он аналогично всему остальному...
Ускорения старта загрузки второй части (SDK) он так-же не дает - пока он там выведет свои сообщения в UART об ней, проходит ещё полчаса...
Тем более грузит он её по SPI на аналогичной скорости, как и ROM, да и той-же функцией. В итоге уходит больше времени и потребления, чем при старте напрямую из ROM стандартной SDK.
Не очищает bss. Так-же не отключает WDT, если была перезагрузка из SDK с включенным WDT. И не делает ничего полезного, кроме вывода в UART информации по известным заранее заголовкам пользователю. Всё это и многое другое что он не делает, грозит сложно уловимыми ошибками при вставки в него процедур с датчиками... В таком случае проще написать всё своё, немного поглядев код rboot, если в первой с ESP8266...

Зачем вы всё время обманываете?
Пререкаться не буду, уже даже не смешно.
У меня работает. См картинки на форуме.
могу Вам пояснить если не поняли.
В обычном режиме имеем старт с током до 45 ма максимум и среднем примерно 30 ма после этого включается WIFI и начинается выполнение программы с током 70 ма . При этом в обычном режиме в начальной загрузке грузится 30 Кбайт, а у nboot в начальной загрузке грузится 1 Кбайт В результате в стандартной загрузке получаем 120 мс а в nboot 80 мс
Причем, как показали эксперименты, ваше декларирование возможности уменьшить начальную загрузку до 30 мс - это вранье, тем более никто это не смог подтвердить , у меня тоже ваш rapid Показал 80 мс.
--------------------------
WIFI я сразу отключаю. Таким образом, внутри nboot я получаю работу CPU и ток от до 15 ма. Если использую режим внешних прерываний то ток снижается до 3-5 ма.
--------------------------------------------------
Этот режим у меня основной для работы с датчиками.
Чем дольше работа с датчиками тем больше выигрыш по энергетики.
Данные либо накапливаю в памяти RTC либо обрабатываю и выдаю управляющие сигналы (например управление нагревом объекта по температуре) В результате экономим примерно в 4 раза.
----------------------------
Если надо WIFI то работает продолжение загрузки т е WIFI как обычно остается включенным и выполняется запуск стандартного приложения.
Сколько времени проходит 120 мс (как обычно ) или меньше , это не имеет значение, так как время работы приложения с WIFI по той причине что нет надобности что-либо ждать от датчиков или чем- либо управлять всегда одно и тоже и существенно меньше чем в стандартном. Составляет от 0.3 с если связь нормальная и 1-3 при плохой связи.
Замеры среднего тока в этом режиме показали, что при интервале связи 60 сек по WIFI средний ток составляет 300 мка .
Таким образом, при активации ESP без WIFI каждую минуту и активации WIFI каждые десять минут средний ток составляет примерно 40-50 мка, ток ESP в режиме deep-sleep 18 мка, а у Вас 22 мка, потому что Вы deep-sleep написали коряво (проверял).
Меня все устраивает.
Более того, я никому ничего не навязываю и не призываю мне верить . Мне даже наплевать верите вы или нет.
Единственный бесспорный факт моих исследований, в том что реализация такого режима позволяет на порядок снизить потребление ESP при автономном питании. В сочетании со схемой управляемого заряда суперкондера получаем WIFI Модуль с питанием от батарейки или даже солнечной панельки без аккумулятора вообще.
Кому это будет интересно - пусть повторит и получит свои результаты Возможно лучше чем мои а может быть и нет.
Но существенно лучше, чем рассказанным на этом форуме и показанные в интернете.
Причем я использую SDK rboot, т е ничего не ломаю в отличии от ВАс. Поэтому желающий должен лишь изучить этот софт.
Ваши поделки практически вещь в себе и Ваше творчество в виде noWIFI и miniSDK так и осталось на свалке.
Теперь Вы тоже самое делаете на RTL.
А я буду тоже самое делать наRTL но позже.
 

nikolz

Well-known member
Измерил точное время начала работы в rboot и cо стандартным boot:
это фрагмент протокола сервера:
03/12/18 10:48:34 test;3186;59;71;2/82;0/215_3
03/12/18 10:49:06 test;3186;50;62;2/73;0/1208_3
03/12/18 10:49:30 test;3186;50;62;2/76;0/211_3
---------------------------
Время работы отсчитывается от момента включения системных часов
от старта до этого момента проходит примерно 50 мс
--------------------------
Работа с датчиками в rboot начинается через 30 мс
работа в user_rf_pre_init с rboot через 50 мс со стандартным через 59 мс
-----------------------
если не считать контрольную сумму при загрузке приложения то время начала исполнения можно уменьшить до 42 мс
03/12/18 12:51:26 test;3187;42;54;2/69;0/203_3
----------------------------------------
Резюме:
Работая с датчиками в rboot получаем
время задержки от старта 80 мс
если надо загрузить WIFI то еще 12 мс до user_rf_pre_init
и еще 27 мс на установку соединения.
Меня это вполне устраивает, пока не достигну лучшего.
 
Последнее редактирование:

Urbas81

Member
@pvvx Вопрос к Вам, как разработчику Web Server, можно ли там организовать прошивку через OTA так же как и WebFS, потребление тока, и все остальные тонкости не имеют значения, если да то что для этого надо сделать. Памяти 4 Mb, если мало, то сколько необходимо? После компиляции, картина такая:
------------------------------------------------------------------------------
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE83A8| 936
rodata| ReadOnly Data (RAM)| 3FFE83A8| 3FFE9108| 3424
bss| Uninitialized Data (RAM)| 3FFE9108| 3FFF1448| 33600
lit4| Uninitialized Data (IRAM)| 401059E8| 401063F8| 2576
text| Uncached Code (IRAM)| 40100000| 401059E8| 23016
irom0_text| Cached Code (SPI)| 40207000| 402452AC| 254636
------------------------------------------------------------------------------
Entry Point : 4010016C call_user_start()
Total Used RAM : 63552
Free IRam : 7176 or 23560 (option 48k IRAM)
Free Heap : 43960
Total Free RAM : 67520
 
Сверху Снизу