• Система автоматизации с открытым исходным кодом на базе 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 Просмотры: 6

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
 
Сверху Снизу