• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, он слинковать не смог!
 
Сверху Снизу