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

Разработка ‘библиотеки’ малого webсервера на esp8266.

Virtual

New member
а не пробовали "дифнуть" с lwip-2* там в этом месте очень сильно переработано.
 

relink

New member
2006 год... круто...
Это не ошибка программиста, стек универсален и действительно хорош. Это связано с архитектурой процессора при обращении к памяти, и на других процессорах корректировка программы может и не потребоваться. Это надо учитывать при разработке программ, как пишет автор обнаруживший это под нынешние (ARM, MIPS & like cores), чтобы не было неожиданности. Как например, придя обнаружить ворота гаража открытыми, потому что esp на миг сошел с ума, к чему мы все тут так или иначе стремимся, чтобы все было по уму.
 
Последнее редактирование:

Urbas81

Member
Такой вопрос: хочу в проект добавить блок переменных для сохранения, в файле flash_eep.h есть строки:
#define ID_CFG_WIFI 0x6977 // id для сохранения установок WiFi (wificonfig)
#define ID_CFG_UART1 0x3175 // id для сохранения установок UART1
#define ID_CFG_UART0 0x3075 // id для сохранения установок UART0
#define ID_CFG_SYS 0x7373 // id для сохранения ситемной конфигурации (syscfg)
#define ID_CFG_UURL 0x5552 // id для сохранения строки tcp_client_url
#define ID_CFG_KVDD 0x564B // id для сохранения калибровочных констант (делитель для VDD)
что обозначают числа после определений, и как мне вставить свой блок данных и какое число присвоить, чтоб не нарушить нормальную работу, проект esp8266web-0.6.2, желательно объяснить как для "чайника":)
 

vad7

Active member
Похоже подстройка частоты [112] в каком-то виде нужна.
При -30 модуль отвалился с концами.
 

pvvx

Активный участник сообщества
что обозначают числа после определений, и как мне вставить свой блок данных и какое число присвоить, чтоб не нарушить нормальную работу, проект esp8266web-0.6.2, желательно объяснить как для "чайника":)
Используйте любое число, не совпадающее с имеющимися. Это ID номер, по которому ищется блок в записях.
Это не ошибка программиста, стек универсален и действительно хорош. Это связано с архитектурой процессора при обращении к памяти, и на других процессорах корректировка программы может и не потребоваться. Это надо учитывать при разработке программ, как пишет автор обнаруживший это под нынешние (ARM, MIPS & like cores), чтобы не было неожиданности.
Операнд там байтовый и с данным процессором там не должно быть проблем - тип памяти, где находится блок позволяет байтовое обращение, что для ARM, что для L106...
Похоже подстройка частоты [112] в каком-то виде нужна.
При -30 модуль отвалился с концами.
При включенной подстройке модуль отваливается и при +25. Достаточно рядом включиться другому устройству c WiFi...
Нет исходников для возможности исправить ситуацию - все вопросы к Espressif.
 
Последнее редактирование:

Urbas81

Member
В принципе данный ID и размер блока является полным идентификатором сохраненного объекта...
Не знаю с чем связано, чекбокс по сбросу параметров по пину убираю при настройке, но уже второй раз с утра слетают настройки, точнее не понятно или настройки или программа, приходится перепрошивать и настраивать пароли и все настройки wi-fi, есть ли возможность выгрузить из esp блок с уже настроенными параметрами и потом загрузить отдельно?
 

pvvx

Активный участник сообщества
Не знаю, правильно-ли я понимаю из исправления эту ситуацию. Обращение производится к 16 битным данным. И если первый пакет был нечетным, то возникает отказ выравнивания (исключение доступа к памяти). В моем случае возвращался вдвое меньший буфер.
Если "(исключение доступа к памяти)" то это перезагрука модуля.
Бегло прочитав про данную правку - вроде это связанно с расчетом контрольной суммы или ещё чего-то. Т.е. исправляется не в данном месте.
 

Urbas81

Member
@Urbas81, сохранение/восстановление настроек у меня тут сделано: WirelessCO2_esp8266/web_srv.c at master · vad7/WirelessCO2_esp8266 · GitHub

Добавляется в htm такое: WirelessCO2_esp8266/setmeter.htm at master · vad7/WirelessCO2_esp8266 · GitHub
Все добавил, но что-то у меня не сохраняет, и загрузка успешная, а на деле ничего не меняется. При сохранении настроек создался файл 4 Mb, правда перед этим я его добавил, переименовав один из существующих bin файлов, так и должно быть, или я где-то накосячил?
 

vad7

Active member
Последнее редактирование:

relink

New member
Если "(исключение доступа к памяти)" то это перезагрука модуля. Бегло прочитав про данную правку - вроде это связанно с расчетом контрольной суммы или ещё чего-то.
Ошибка не фатальная, и проявляется только возвратом неверного значения snd_buf. Меня тоже эта конструкция обескуражила pcb->snd_buf += ((pcb->acked+1) & ~0x1), зачем приводить к четности, словно выравнивая по 16 битному слову, ведь это даже не указатель. Проверял и на других проектах с LwIP в UDK. Проблема неочевидна, и при определенных размерах пакета может и не обнаружиться, но время от времени snd_buf урезался ровно на один разряд без очевидных на то причин. С исправлением все работает как часы, без отладчика трудно понять почему так происходит. Ведь глядя на исправление, все вообще должно было порушиться, но это не так!
Кто нибудь с отладчиком может прояснить почему так происходит.
 

Urbas81

Member
@Urbas81, лучше полностью upload_boundary() перенести, в ней еще изменения есть.
Также файл settings.bin нужен и еще в web_int_callbacks.c :
WirelessCO2_esp8266/web_int_callbacks.c at master · vad7/WirelessCO2_esp8266 · GitHub

Еще во flash_epp.c функция current_cfg_length().
А вообще, там много доработок...
Ясно спасибо, надо скачать наверное весь проект.
 

pvvx

Активный участник сообщества
Ошибка не фатальная, и проявляется только возвратом неверного значения snd_buf. Меня тоже эта конструкция обескуражила pcb->snd_buf += ((pcb->acked+1) & ~0x1), зачем приводить к четности, словно выравнивая по 16 битному слову, ведь это даже не указатель. Проверял и на других проектах с LwIP в UDK. Проблема неочевидна, и при определенных размерах пакета может и не обнаружиться, но время от времени snd_buf урезался ровно на один разряд без очевидных на то причин. С исправлением все работает как часы, без отладчика трудно понять почему так происходит. Ведь глядя на исправление, все вообще должно было порушиться, но это не так!
Кто нибудь с отладчиком может прояснить почему так происходит.
Надо глядеть как работает распределитель памяти pbuf.c, memp.c, .. и связанное с ними. Может там стоит коррекция на aligned (т.е. там её толпа). Распределение памяти в LwIP имеет много опций...
История с вашим приращением ещё старее:
RE: [lwip-users] Bug in snd_buf calculation
lwip-users-tcp-ip - RE: [lwip-users] Bug in snd_buf calculation - msg#00009 - Programming Mailing Lists
lwIP - A Lightweight TCP/IP stack - Bugs: bug #2679, Data packet split on odd... [Savannah]
Но у нас этих проблем нет, что в ESP8266, что в ARM RTL871x. У них у всех байтный доступ к областям памяти, где находятся буфера данных.

"Ошибка не фатальная, и проявляется только возвратом неверного значения snd_buf." - это может быть из-за нарушения атомартности. Не стоит лезть в дела LwIP из любого прерывания :) Для этого есть семафоры-светофоры и RTOS. ;)
 
Последнее редактирование:

Urbas81

Member
@Urbas81, лучше полностью upload_boundary() перенести, в ней еще изменения есть.
Также файл settings.bin нужен и еще в web_int_callbacks.c :
WirelessCO2_esp8266/web_int_callbacks.c at master · vad7/WirelessCO2_esp8266 · GitHub

Еще во flash_epp.c функция current_cfg_length().
А вообще, там много доработок...
Добавил все недостающие функции, проект компилируется, в железо еще не грузил.

Ушла ошибка ovls, менял labels.ld, сначала были ошибки, теперь вернул свой все компилируется, спасибо за помощь. Теперь вопрос: в связи с изменением и добавлением вашего кода в части сохранения настроек, другой функционал не пострадает?
Как формируется labels.ld, были ошибки указывающие на него, удалил, смотрю он не создался заново, скопировал с резервной копии, заработало.
 
Последнее редактирование:

vad7

Active member
@pvvx, есть ли возможность определить нажали ли reset или это первая подача питания?
Там в памяти что-нить осталось или какие внутренние регистры по другому инициализированы?
 

pvvx

Активный участник сообщества
@pvvx, есть ли возможность определить нажали ли reset или это первая подача питания?
Там в памяти что-нить осталось или какие внутренние регистры по другому инициализированы?
Ну есть же всё и даже на странице web-сервера dsleep.htm показывает...
 

vad7

Active member
@pvvx, да в том то и дело, что строчка вставленная в app_main.c:
os_printf("Reset reason: %u, %u\n", system_get_rst_info()->reason, rtc_get_reset_reason());
выдает "Reset reason: 6, 2", как в случае включения, так и после нажатия на reset.
Модуль - NodeMCU v3 LoLin.
 
Сверху Снизу