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

UDK: Общие баги/глюки/проблемы

pvvx

Активный участник сообщества
2. Использую 4 мегабайтную флеш c esp_mqqt, в makefile [inline]SPI_SIZE?=4096[/inline]
А 4M flash действительно "кешируется" или это никто так и не проверял?
Мои проверки показали лимит области "кеширования" кода в flash всего и всегда 1M, независимо от размера указанного в заголовке flash.
И зачем в FLASH DOWNLOAD TOOL v1.2 вложена прошивка MQTT?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Почему не туда? А куда нужно?
Файл 2A-ESP8266__IOT_SDK_User_Manual__EN_v1.1.0.pdf - последние страницы, там описано...
В прошивке (SDK Espressif) от указанного размера flash отнимается 0x4000 (4-ре сектора flash) и туда закатывается esp_init_data_default.bin. Далее (-3 сектора от конца) идут 2 сектора содержащие две записи с конфигурацией WiFi (установками имени AP/ST и т.д.), последний сектор содержит контрольку на предыдущие два и указатель какая из записей активна ныне. Последний сектор с контрольками стирается и пишется всегда при смене имен или соединений... В AT прошивке SDK 1.1.0 он стирается и пишется дважды при каждой команде связанной с изменением конфигурации. При старте он тоже переписывается. Всё это сделано чтобы быстрее протереть дырку во flash и вы купили новый модуль.
Размер flash кодируется номерком в начальной записи - заголовке flash, и декодировка конфигурации, сколько и какие flash прикручены к чипу ESP8266, указана в system_get_flash_size_map() стр.30 дока "2C-ESP8266__SDK__Programming Guide__EN_v1.1.0.pdf"
У AT прошивки существует ещё вторая конфигурация - берут половину flash и от неё отнимают 0x4000 (тоже четыре сектора) и её тоже надо затирать при новой прошивке.

Пример логирования обращений к flash в прошивке AT SDK1.1.0 при старте:
Код:
Отпускание reset и каляки от BIOS на другой скорости, далее:
frd:0x0007f000[28],0x3ffffee0
fes:0x0007d000
fwr:0x0007d000[880],0x3fff2a68
frd:0x0007d000[880],0x3fff6c20
fes:0x0007f000
fwr:0x0007f000[28],0x3ffffee0
frd:0x0007f000[28],0x3fff6c20
frd:0x0003f000[4],0x3fffff10
frd:0x0003d034[8],0x3fffff4c
frd:0x0003f000[4],0x3fffff10
frd:0x0003d020[12],0x3fffff54
frd:0x0003f000[4],0x3fffff10
frd:0x0003d02c[8],0x3fffff60
frd:0x0003f000[4],0x3fffff10
frd:0x0003d014[12],0x3fffff68
frd:0x0003f000[4],0x3fffff10
frd:0x0003d03c[4],0x3fffff74
frd:0x0007f000[28],0x3ffffee0
fes:0x0007e000
fwr:0x0007e000[880],0x3fff2a68
frd:0x0007e000[880],0x3fff6c20
fes:0x0007f000
fwr:0x0007f000[28],0x3ffffee0
frd:0x0007f000[28],0x3fff6c20
frd:0x0003f000[4],0x3fffff10
frd:0x0003d040[20],0x3fffff78
mode : sta(18:fe:34:99:ad:0e)
add if0
Далее вылезает надпись ready в другой UART
Где:
fes - erase sector, вызов spi_flash_erase_sector()
frd - read flash, вызов spi_flash_read()
fwr - write flash, вызов spi_flash_write()
 
Последнее редактирование:

pvvx

Активный участник сообщества
esptool.py и esptool.exe, входящие в UDK 2.0.5 уже имеют 2 ошибки:
1) Неправильный размер стирания области для записи
2) Создание лишних сегментов для загрузчика, если данные в rodata и т.д. отсутствуют. Т.е. создается всегда столько сегментов загрузки, сколько указано секций - что там нет данных не проверяется. Это сильно тормозит загрузку - на ещё не менее два десятка выводов символов в UART на скорости 7488 байт в секунду и разборки ROM-BIOS с загрузкой пустого сегмента.
Исправленная версия
+ отсутствует SDK 1.1.1 и GCC 5.1 :)
 

CHERTS

Moderator
Команда форума
esptool.py и esptool.exe, входящие в UDK 2.0.5 уже имеют 2 ошибки:
1) Неправильный размер стирания области для записи
2) Создание лишних сегментов для загрузчика, если данные в rodata и т.д. отсутствуют. Т.е. создается всегда столько сегментов загрузки, сколько указано секций - что там нет данных не проверяется. Это сильно тормозит загрузку - на ещё не менее два десятка выводов символов в UART на скорости 7488 байт в секунду и разборки ROM-BIOS с загрузкой пустого сегмента.
Исправленная версия
+ отсутствует SDK 1.1.1 и GCC 5.1
Оооо pvvx, у вас появился репозитарий, я очень рад этому. Вы молодец.

Патч для esptool.py было бы неплохо закинуть pull request в оффициальный репозитарий https://github.com/themadinventor/esptool
Если Вы не против, то я это сделаю.
 

CHERTS

Moderator
Команда форума
pvvx мне немного непонятна вот эта запись:

- if args.operation not in ('image_info','make_image','elf2image'):
+ if args.operation not in ('image_info','make_image','elf2image','elf2osl'):

Что за elf2osl ? В оригинальном esptool.py такого нет, и в вашей версии оно присутствует только в одном месте, 559 строка.
 

pvvx

Активный участник сообщества
Что за elf2osl ? В оригинальном esptool.py такого нет, и в вашей версии оно присутствует только в одном месте, 559 строка.
Это ошибка, я делал там вставку другой ветки для спец.проетка, а это забыл удалить для общей esptool.py при правке...
esptool.py я пользуюсь как makefile - меняю там всё под конкретные задачи... :)
Там нет опции создания загрузчика с одной секцией, для скоростной загрузки без вывода сообщений ROM-BIOS в UART (загрузки и запуска за менее 30ms). Для этого надо ещё обнулять в заголовке flash кол-во секций. Имеющиеся ветки по опциям в esptool.py такой возможности не дают. elf2osl и была ветка - One Segment Loader :)
 
Последнее редактирование:

Discriminator

New member
2.0.6 появилось:

Код:
c:/Espressif/ESP8266_SDK/lib\libmain.a(app_main.o): In function `user_uart_wait_tx_fifo_empty':
(.irom0.text+0x340): undefined reference to `user_rf_pre_init'
c:/Espressif/ESP8266_SDK/lib\libmain.a(app_main.o): In function `user_uart_wait_tx_fifo_empty':
(.irom0.text+0x45c): undefined reference to `user_rf_pre_init'
 

CHERTS

Moderator
Команда форума
2.0.6 появилось:

Код:
c:/Espressif/ESP8266_SDK/lib\libmain.a(app_main.o): In function `user_uart_wait_tx_fifo_empty':
(.irom0.text+0x340): undefined reference to `user_rf_pre_init'
c:/Espressif/ESP8266_SDK/lib\libmain.a(app_main.o): In function `user_uart_wait_tx_fifo_empty':
(.irom0.text+0x45c): undefined reference to `user_rf_pre_init'
В user_mail.c нужно писать пустой

Код:
void ICACHE_FLASH_ATTR user_rf_pre_init(void)
{
}
или как рекомендовал pvvx

Код:
void ICACHE_FLASH_ATTR user_rf_pre_init(void)
{
/* volatile */ uint32 * ptr_reg_rtc_ram = (/* volatile */ uint32 *)0x60001000;
if((ptr_reg_rtc_ram[24] >> 16) > 4) {
ptr_reg_rtc_ram[24] &= 0xFFFF;
ptr_reg_rtc_ram[30] = 0;
}
}
 

aloika

Active member
У меня закралось подозрение, что дома и на работе один и тот же исходник у меня компилируется по-разному. Судите сами - компилирую дома, заливаю в модуль - программа глючит (определенным образом). Приношу модуль на работу - глючит также.

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

Версия UDK формально та же (последняя) и там и там, но кроме UDK (то, что ставится инсталлятором) есть же еще скрипты, mingw и пр. Вообще может быть такое, что есть какая-то разница в этих компонентах, и от этого по-разному компилируется? И тогда вопрос - как снести вообще все и поставить потом все заново (ну хотя это я, наверное, и так разберусь)?

[off] Когда-то у меня такая история была с Atmel-студией. Версии 6.1. и 6.2 реально компилировали разный код из одного и того же исходника, один из этих скомпилированных кодов работал, один глючил. Я чуть с ума не сошел тогда :) [/off]
 

CHERTS

Moderator
Команда форума
В UDK врет программа расчета памяти :)
Включаю в своих прошивках опцию использовать 48 килобайт IRAM, а она думает что у меня всего 32k.
Могу включить и 64к IRAM, но уже без "кеша" Flash. Пока задействована общая память чипа 96+64к (!)...
Я подозреваю, что врет MemAnalyzer.exe, так?
 

pvvx

Активный участник сообщества
Я подозреваю, что врет MemAnalyzer.exe, так?
Да. Нет анализа размера IRAM.
Теперь у нас размер IRAM может принимать значения 32768, 49170, 65546 байт. Можно и другие, но ограничение в 64к байт как предела уже без "кэша" Flash и из неё на "кэш" отводится по 16 к произвольными блоками. В китай-стандарте на "кэш" отведено 32к, но 16к хватает даже на проигрыватель веб-радио с декодером MP3 (в имеющихся прошивках различия с 16к и 32к "кэш" обнаружить не удалось).
Пока итоговая RAM у чипа 96 + 64к. Из них, те кто умеет :), используют IRAM в режиме 49170 байт + 16к "кеш" и таких проблем, как у NodeMCU уже нет - там организуется буфер на 20к для работы Lua + полный heap...
Если проще - прибавили (надыбали из воздуха :) ) 16к к IRAM, да описано как это сделать...
 
Последнее редактирование:

glonium

New member
Подскажите что за проблема, создал новый проект на базе hello_world далее почистил его от ненужных мне функций до минимума оставил только include и user_init, и он перестал компилиться, выдаёт ошибку
Description Resource Path Location Type
recipe for target 'build/app.out' failed Makefile /http_server line 162 C/C++ Problem
Спасибо!
 

glonium

New member
Прошу прошения за невнимательность, удалил функцию user_rf_pre_init, он слинковать не смог!
 
Сверху Снизу