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

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

vad7

Active member
@pvvx, Да в том то и дело, что я не хочу запрещать прерывания. Но если я их не запрещаю - то прошивка зависает гораздо раньше - через 3 сек.
Из-за чего зависает при разрешенных прерываниях? Web часть?
У вас еще есть ets_run_new(), но она отключена по какой-то причине?
 

pvvx

Активный участник сообщества
Да в том то и дело, что я не хочу запрещать прерывания. Но если я их не запрещаю - то прошивка зависает гораздо раньше - через 3 сек.
Из-за чего зависает при разрешенных прерываниях? Web часть?
В Web нет ничего время-зависимого. Он работает по событиям и все процедуры не сверх длинные по времени исполнения.
У вас ошибки - к примеру нельзя включать все прерывания путем разрешения ets_isr_unmask(0xFFFFFFFF) :)
У вас еще есть ets_run_new(), но она отключена по какой-то причине?
Не нужна для данного проекта. Тут не требуется многозадачность или исполнение каких-то процедур wifi во работы кода Web. Он весь работает по событиям...

Поставьте программный таймер с временем, чтобы получать/передавать по I2C на 400кГц к примеру за раз 1 байт. Получится что-то типа, пусть 10 бит на 400кГц = 10/400000 = 0.000025 сек время обработки. Значит таймер на время к примеру на минимум в 2 раза больше -> от 50 us. По прерыванию таймера обрабатываете посимвольную прием/передачу - один символ за раз и выходите. 25 us остается на время реакции SDK, затем опять срабатывает ваше прерывание и принимает/пишет следующий символ в I2C и т.д.
И не понятно - зачем вам трогать какие-то аппаратные прерывания?
 
Последнее редактирование:

vad7

Active member
@pvvx, прерывания я запрещал для проверки. В последний раз функциями ets_intr_lock()/ets_intr_unlock().
Мне и не нужно их запрещать, но без запрещения не работает. Откуда мне процесс на несколько секунд запустить?

Не нужна для данного проекта. Тут не требуется многозадачность
Откуда тогда запускать тяжелый код, через system_os_task можно?
 

pvvx

Активный участник сообщества
@pvvx, прерывания я запрещал для проверки. В последний раз функциями ets_intr_lock()/ets_intr_unlock().
Мне и не нужно их запрещать, но без запрещения не работает. Откуда мне процесс на несколько секунд запустить?



Откуда тогда запускать тяжелый код, через system_os_task можно?
Нет - ни через что нельзя. Только если сделать по типу RTOS - переключать задачи по таймеру вместе со стеком и вешать семафоры/светофоры... :)
Но может и выйдет сделать цикл в 1 сек, если выключить WiFi, установив его режим в нуль.

Для работы через ets_run_new() надо включить её в SDK конфиге.
Далее необходимо из какой-то работающей процедуры вызвать путь ets_set_idle_cb(user_idle, 1234).
Когда CPU перейдет в ets_run() в ROM, то вызовет вашу user_idle(1234)
В ней, первым делом вызвать ets_set_idle_cb(NULL, NULL);
Затем, второй командой: ets_intr_unlock();
Далее пишите свой код и через каждые, примерно более пару ms вызываете run_sdk_tasks()
Если надо определенную задержку, то вызываете task_delay_us(Xus), где если Xus от 512 us, то она будет разрешать обрабатывать процессы SDK. Иначе нет.
И так, вызывая постоянно task_delay_us(>512us) или run_sdk_tasks(), через части вашего кода, можете хоть час сидеть в цикле процедуры user_idle(1234).

Вызывать task_delay_us(>512us) или run_sdk_tasks() из Web и прерываний таймеров и task() недопустимо - будет повторное вхождение в ту-же процедуру и всё рухнет, а при вызове из прерываний таймеров и task дальнейшая обработка их будет прекращена, в SDK, т.к. выхода из них в ets_run() не произошло и там флаги не сброшены... По тому вход в длительную процедуру может быть надежным только так, как описал.
 
Последнее редактирование:

vad7

Active member
@pvvx, спасибо, попробую. Но если не используется режимы сна, можно и родную ets_run использовать?
 

pvvx

Активный участник сообщества
Это в ROM-BIOS и её режим сна не используется в SDK. Не тот кварц и не тот режим sleep у ROM-BIOS - там просыпание по изменению на ножке GPIO2 и без полного отключения питания в проце...
Что вы всё гадаете? Изучайте сами, и не методом тыка и задавания глупых вопросов.
Нашли одинаковое название и по этому считаете что использование ets_set_idle_cb связано со sleep ? :)
Вам много раз говорилось, что ets_run() - это распределитель процессов тасков и таймерных прерываний. Если она не работает, то и таймеры и таски не работают. Китайцы в своем SDK уже нагородили и дубли части процедур обслуживания таймеров, чтобы распределить свои процессы. 90% ROM-BIOS у них перенесено в SDK, т.к. ROM-BIOS не для того кварца и имеет устаревшую систему обработки WiFi - много ошибок и неподходящие алго. Открываете RTOS SDK и смотрите там eagle.rom.addr.v6.ld - там указаны используемые процедуры из ROM-BIOS. Т.е. ROM-BIOS болтается в чипе просто так и используется только для загрузки.
А я вам в прошлом соо описал как сделать второй тред, для обработки вечного цикла и без награмождения со стеком и прочим в системе Non OS SDK (китайский вариант) или meSDK, но в нем условие - вы должны периодически запускать task_delay_us(>512us) или run_sdk_tasks() для работы основного треда SDK - это некое подобие мультизадачности со своими ограничениями и требуется только тем, кто не умеет писать обработку своих алго по событиям - 99% Ардуинщиков.
 
Последнее редактирование:

vad7

Active member
Для меня микроконтроллеры это хобби в свободное от работы время. Так что без вашей помощи, к сожалению, ни куда.
Плохо еще, что и ваш код мало документирован - тяжело разобраться.
Там, где разобрался или вы подсказали, я подписываю, но это опять же останется в моем github, то есть у новеньких пользователей вашей библиотеки будут те же вопросы.
 
Последнее редактирование:

Dmitry P

New member
Добрый день!
скачал последнюю версию с github, прошиваю основную часть, все нормально. Пытаюсь прошить webbin/Webfiles.bin в 0x39000 - перестает работать. Флешка 512к.
Не поменялся адрес?
 

vad7

Active member
@Dmitry P, адрес меняется в зависимости от размера прошивки или 0х80000, если большая флешка.
И выравнивается под 0х1000.
Мне вот интересно, а как вы используете эту прошивку, если исходник не меняете?
 

Dmitry P

New member
да просто, шью fullflash_web054.bin да и использую.
а с новой версией - засада, не нашел скомпиленный full :)
а самому городить компилятор лениво...

Upd Скачал 0.5.9., посчитал смещение 0х4000 - работает.
Спасибо за информацию про выравнивание
 
Последнее редактирование:

PostLast

Member
Более одного соединения у TCP2UART невозможно. Буфера UART привязаны к первому соединению.
Вы бесспорно правы для TCP->UART но решаю частную задачу - получаю из TCP фреймы и их обрабатываю.
Приходят данные с TCP редко около 10 фреймов в секунду.
С обратной передачей, т к я не хочу привязываться к идентификаторам ESP данные передаю в момент активности канала. Как сунуть данные всем подключенным устройствам в вашей архитектуре без ее серьезной переделки пока не разобрался.
Не могу понять почему после нескольких перезагрузок несколько модулей сваливаются в esp8266web/wifi.c at master · pvvx/esp8266web · GitHub с ошибкой 0x00010040 где ее рыть?
Зачем если указан NONE режим сна между попытками подключения к точке доступа снижать частоту процессора esp8266web/wifi.c at master · pvvx/esp8266web · GitHub ?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Не могу понять почему после нескольких перезагрузок несколько модулей сваливаются в esp8266web/wifi.c at master · pvvx/esp8266web · GitHub с ошибкой 0x00010040 где ее рыть?
Здесь: esp8266web/wifi.h at master · pvvx/esp8266web · GitHub
И это не всегда ошибки. Это ответ китайской части на процедуру установки указанных параметров. Иногда их лучше передать, чтобы SDK не потеряла, но она возвращает ошибку - это и показывается в битах - какие процедуры не прошли... чисто информационное.
Зачем если указан NONE режим сна между попытками подключения к точке доступа снижать частоту процессора esp8266web/wifi.c at master · pvvx/esp8266web · GitHub ?
Для понижения потребления на пару мА пока активен и не вошел в sleep. А что ему там делать на 160 MHz, если Wifi отключен?
 
Последнее редактирование:

PostLast

Member
А что ему там делать на 160 MHz
Web серверу нечего и это отлично расписано несколькими постами выше. Да юсеры они такие casual.
То им импульс 0,4 и 0,8 us сделать надо, то SPI в режиме 3 подавай. И нет чтоб сначала спросить if (ets_get_cpu_frequency()==160) типа воду в бассейн налили? а то прыгать будем. А пока мы прыгаем воду не спустят? Надеются юсеры что если сказали -не спать система действительно не дремлет:D.
И это не всегда ошибки. Это ответ китайской части на процедуру установки указанных параметров.
У меня в этом случае система создает точку типа ESP_XXXXX
пока лечится только прибиванием настроек в init.ini
 

Dmitry P

New member
А зачем считать, если после прошивки адрес показан на странице "WebFS Upload" или запрашивается переменной ~wfs_addr~.
Ключевое слово - "после прошивки" :)
Мне-то надо этот адрес для того, чтобы как раз webfiles.bin залить сразу с заливкой прошивки.
 

pvvx

Активный участник сообщества
Ключевое слово - "после прошивки" :)
Мне-то надо этот адрес для того, чтобы как раз webfiles.bin залить сразу с заливкой прошивки.
А при трансляции адрес вычисляется автоматически, куда залить web-диск - в makefile... Тут тема то исходники, а не про готовые прошивки :p
 

pvvx

Активный участник сообщества
Web серверу нечего и это отлично расписано несколькими постами выше. Да юсеры они такие casual.
То им импульс 0,4 и 0,8 us сделать надо, то SPI в режиме 3 подавай. И нет чтоб сначала спросить if (ets_get_cpu_frequency()==160) типа воду в бассейн налили? а то прыгать будем. А пока мы прыгаем воду не спустят? Надеются юсеры что если сказали -не спать система действительно не дремлет:D.
Но снижение частоты на 80 Mhz сама SDK делает иногда. Это не влияет на ets_delay_us() и прочее. А вот sleep - влияет, т.к. прерывает всё.
У меня в этом случае система создает точку типа ESP_XXXXX
пока лечится только прибиванием настроек в init.ini
Ну это не правильный алгоритм, а не те флаги ошибок установок. Об этом они и сообщают.
 

PostLast

Member
pvvx 80 и 160 мгц не является проблемой. Надо помнить, что если делать короткую задержку подсчетом тактов типа
Код:
static uint32_t _getCycleCount(void) __attribute__((always_inline));
static inline uint32_t _getCycleCount(void) {
  uint32_t ccount;
  __asm__ __volatile__("rsr %0,ccount":"=a" (ccount));
  return ccount;
}
надо заранее разобраться с частотой. Этот вопрос не стоит количества растревоженных байт.
Ну это не правильный алгоритм
Ваши рекомендации с какой стороны рыть, т к ситуация возникает не сразу, а через несколько включений-выключений и я ее не могу пока локализовать, Тесты говорят, что это не аппаратная проблема стенда. Хотя после связи 811.b и мощности излучения 82 в любые чудеса ESP поверить можно.
 
Сверху Снизу