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

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

pvvx

Активный участник сообщества
В текущей версии свалки стороннего вызова не будет.
Китайцы вызывают ets_set_idle_cb(). Гарантировать, что она не задействована в SDK1.5.2(patch1) не могу. Он завязана и на некоторых функциях ROM-BIOS и простым удалением адреса из eagle.rom.addr.v6.ld не узнать. Но с предыдущими SDK с этой функцией были проблемы. Я её использовал в web-свалке для обхода некоторых глюков в SDK и нарывался, что функция не отрабатывала, т.к. была переназначена чем-то.
Пример обхода протектед в старых SDK при вызове установки режима WiFi после сканирования: esp8266web/wifi.c at master · pvvx/esp8266web · GitHub
Переключение (восстановление) режима WiFi срабатывало без протектед только после завершения китайской функции вызвавшей wifi_scan_cb().
 
Последнее редактирование:

pvvx

Активный участник сообщества
У меня пока работает...
Хорошо, а какой тогда простой способ сделать main loop в вашей прошивке для человека, первый раз увидевшего eps8266?
Написать "hello world" в UDK и начать изучать разные методы программирования и работы систем. В NON_OS_SDK вся работа идет по событиям и никаких main_loop и подобного нет.
 

vad7

Active member
@pvvx, А зачем усложнять? В некоторых случаях проще и эффективнее вставить алгоритм в одно место, чем разбрасывать его по разным файлам, да еще и чужого кода, в котором предварительно надо разобраться.
Потом, через годик-два, если нужно что-то доработать или поправить, открыл - весь код и на ладони.
 

DoctorVx

New member
А какое событие возникает постоянно не мешая работе модуля на базе вашего проекта? ну чтобы с датчика данные получать..
 

pvvx

Активный участник сообщества
А какое событие возникает постоянно не мешая работе модуля на базе вашего проекта? ну чтобы с датчика данные получать..
Нет такого. Всё зависит от приема запросов сервера и исполнения заданных в нем задач.
Ну нету в NON_OS_SDK main_loop и не привидится.
@pvvx, А зачем усложнять? В некоторых случаях проще и эффективнее вставить алгоритм в одно место, чем разбрасывать его по разным файлам, да еще и чужого кода, в котором предварительно надо разобраться.
Потом, через годик-два, если нужно что-то доработать или поправить, открыл - весь код и на ладони.
а зачем нам совсем детсад? И какие задачи можно решить с одним ядром CPU без таймеров, семафоров и прочих флагов, если делать распределение задач? RTOS имеет свой (с) и не всё с ней можно. И там не выйдет простого main_loop, без кучи обвесов и дерганного исполнения... Вас куда-то всё не туда тянет.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вон, в параллельных ветках форума как-то передают же на сайты типа thingspeak температуру там, влажность и прочее.
Только через SHTTP - т.е. c SSL, который до сих пор кривой у китайцев и не годится для всех сайтов, тем более устаревшая версия с дырами.
И в чем сложности? Взяли и написали, ну пусть за два часа TCP клиента...
tcp_client.ovl

Пример TCP клиента.
Считывает температуру воздуха из HTML по адресу weather-in.ru - погода в Санкт-Петербург (север) (г. Санкт-Петербург, Пушкинский район) - прогноз погоды в России на 3 и 5 дней


Переменные:
mdb[50] - номер ошибки (=0 - нет ошибок)
mdb[51] - Флаг:
=0 - драйвер закрыт
=1 - драйвер установлен и работает
mdb[52] - Температура минимум (со знаком)
mdb[53] - Температура максимум (со знаком)

Лог с загрузкой оверлея:
srv[80] 192.168.1.2:55676 [1] listen
srv[80] 192.168.1.2:55676 [1] read: 1460 of254[/fsupload] content_len = 1503 of 1189 'ESP8266:0123456789' POST f[/fsupload] filename:'tcp_client.ovl' ...
srv[80] 192.168.1.2:55676 [1] read: 1316 Wr:0x40106300[0x0000041c] Wr:0x3fffdf60[0x00000074] Wr:0x3fffdfd4[0x00000040] Run0x401066a0 head[82]:302 dis
srv[80] 192.168.1.2:55676 [1] disconnect
cf254 srv[4097] 62.149.0.160:80 [0] start client - Ok
srv[4097] 62.149.0.160:80 [1] send 62 bytes
srv[80] 192.168.1.2:55677 [1] listen
srv[80] 192.168.1.2:55677 [1] read: 169 of1[disk_ok.htm] GET f[/disk_ok.htm] head[201]:200 send: of2[timer.inc] cf2 of2[footer.inc] cf2 cf1 722 dis
srv[4097] 62.149.0.160:80 [1] received, buffer 311 bytes
srv[4097] 62.149.0.160:80 [1] received, buffer 796 bytes
srv[4097] 62.149.0.160:80 [1] received, buffer 1477 bytes
srv[4097] 62.149.0.160:80 [1] received, buffer 1477 bytes
srv[4097] 62.149.0.160:80 [1] received, buffer 1278 bytes
srv[4097] 62.149.0.160:80 [1] received, buffer 1477 bytes
srv[4097] 62.149.0.160:80 [1] received, buffer 1953 bytes
"Температура воздуха, &[HASHTAG]#176[/HASHTAG];C" -1..3 srv[80] 192.168.1.2:55677 [1] disconnect
srv[4097] 62.149.0.160:80 [1] disconnect
При написании задней левой ногой всего 1280 байт с данными и т.д. ...
 
Последнее редактирование:

DoctorVx

New member
Пропиши в инициализации свой таймер и в нем делай что хош только недолго - несколько страниц тому назад это писал.
просто это самое "НЕДОЛГО" слишком уж обьективное понятие, сколько милисекунд это примерно безопастно делать..
 

pvvx

Активный участник сообщества
просто это самое "НЕДОЛГО" слишком уж обьективное понятие, сколько милисекунд это примерно безопастно делать..
На столько, на сколько хотите затормозить и сделать выполнение рывками другие процессы.
1 ms - это 160 тысяч команд CPU. У вас такие большие программы или кодируете в Mpeg данные?
Максимальная задержка обычных прерываний типа аппаратного таймера 0 выловлена при WiFi Scan (meSDK 1.3.0) и составляет 1.156 ms.
Посмотреть вложение 814
При обычном соединении WiFi и передаче файлов по TCP часто идет задержка в 120..162 us при CLK CPU на 80 MHz, что для CLK CPU на 160 Mhz соответственно в 2 раза меньше. Проверка простого прерывания делалась на управлении таймером выходным пином с периодом в 7 us (меньше не тянет при CLK CPU на 80 MHz). При 160 MHz предел обработчика простых прерываний к 5 us.

NMI прерывание тянет до 4-х us. При обработчике прерывания от таймера через nmi выпадений не обнаружено.
Из этого другой совокупностей выходит, что для успешной по всем параметрам работы китайской части надо ограничивать обработку в программном таймере до 1..2 ms (т.е. иногда можно 1..2 ms - но что там делать в сотни тысяч команд? ). В NMI что-то совсем плохое сделали и там пределы к паре микросекунд...

Как пример времени обработки I2C в sht7x.ovl http://esp8266.ru/forum/attachments/sht71-gif.1549/ на программном таймере - там чтение данных с датчика и контрольной суммы, стоп и старт и задание новой команды на исполнение... укладывается в менее 0.1 ms. Дальше и больше датчик уже не в состоянии что-либо ответить очень долго... А I2C - это самая тормозная функция на ESP, т.к. нет аппаратного контроллера, для неё нет fifo и DMA. Для других интерфейсов есть аппаратная поддержка для работы блоками.

Объясните зачем нужно длинные по времени процедуры, которые ничего не делают?
 
Последнее редактирование:

DoctorVx

New member
На столько, на сколько хотите затормозить и сделать выполнение рывками другие процессы.
1 ms - это 160 тысяч команд CPU. У вас такие большие программы или кодируете в Mpeg данные?
Из этого другой совокупностей выходит, что для успешной по всем параметрам работы китайской части надо ограничивать обработку в программном таймере до 1..2 ms (т.е. иногда можно 1..2 ms - но что там делать в сотни тысяч команд? ). В NMI что-то совсем плохое сделали и там пределы к паре микросекунд...

Как пример времени обработки I2C в sht7x.ovl http://esp8266.ru/forum/attachments/sht71-gif.1549/ на программном таймере - там чтение данных с датчика и контрольной суммы, стоп и старт и задание новой команды на исполнение... укладывается в менее 0.1 ms. Дальше и больше датчик уже не в состоянии что-либо ответить очень долго... А I2C - это самая тормозная функция на ESP, т.к. нет аппаратного контроллера, для неё нет fifo и DMA. Для других интерфейсов есть аппаратная поддержка для работы блоками.

Объясните зачем нужно длинные по времени процедуры, которые ничего не делают?
ну так то длинные пустые процедуры не нужны =) но у меня кстати датчик на i2c но после того как дынные примуться с датчика надо среагировать както, например как в моём случае, в случае превышении определённого установленого через веб морду значения срабытывает механизм. ну или грубо говоря зажигается светодиодик, такк проще..=)
 

pvvx

Активный участник сообщества
ну так то длинные пустые процедуры не нужны =) но у меня кстати датчик на i2c но после того как дынные примуться с датчика надо среагировать както, например как в моём случае, в случае превышении определённого установленого через веб морду значения срабытывает механизм. ну или грубо говоря зажигается светодиодик, такк проще..=)
Сравнение числа и изменение бита в порту - это от силы 30 тактов CPU. А если вы это сравнение сделаете в следующем прерывании, через пару ms, то что-то в вашей системе изменится? Или у вас датчик на шине I2C реагирует быстрее чем передача нескольких байт по шине I2C? В sht7x.ovl больше тормозит математика расчетов конечных значений в float.
Вам уже написал - система иногда дает задержки на 1.5 ms - это значит, что уже с большей дискретностью обрабатывать данные с датчиков нет смысла - всё равно может попасть на эту задержку. Т.е. более скоростные процессы, требующие мгновенной реакции, необходимо делать по другому - на аппаратных прерываниях c NMI или на внешнем MCU.
 
Последнее редактирование:

DoctorVx

New member
Сравнение числа и изменение бита в порту - это от силы 30 тактов CPU. А если вы это сравнение сделаете в следующем прерывании, через пару ms, то что-то в вашей системе изменится? Или у вас датчик на шине I2C реагирует быстрее чем передача нескольких байт по шине I2C? В sht7x.ovl больше тормозит математика расчетов конечных значений в float.
Вам уже написал - система иногда дает задержки на 1.5 ms - это значит, что уже с большей дискретностью обрабатывать данные с датчиков нет смысла - всё равно может попасть на эту задержку. Т.е. более скоростные процессы, требующие мгновенной реакции, необходимо делать по другому.
ну не то что прямо мгновенной, Спасибо огромное за вашу поддержку!!..... Ну так то мне всего лиш значение освещённости сравнить..
 

DoctorVx

New member
ну не то что прямо мгновенной, Спасибо огромное за вашу поддержку!!..... Ну так то мне всего лиш значение освещённости сравнить..
А вот ещё вопрос. возник, а возможна ли организация часов реального времени средствами модуля и кода данной стаьи?
 

pvvx

Активный участник сообщества
А вот ещё вопрос. возник, а возможна ли организация часов реального времени средствами модуля и кода данной стаьи?
С точностью кварца. Это значит, для обычных кварцев до 5-го - 6-го десятичного знака.
Если вопрос о системе реального времени - то там основной критерий в фиксированном времени реакции на "раздражение" (прерывание). Для данной системы ESP это от 100 тактов CPU на вход в ваш код обработчика аппаратного прерывания... В среднем наверно больше...
 
Последнее редактирование:

vad7

Active member
@pvvx, у меня тут опять косяк обнаружился...
Перекомпилил, значит, я прошивку без отладки для ОТА, на целых 16 кило меньше стала. Настроил wifi как ap+st.
Подключил к роутеру и стал настраивать не через wifi, как обычно, а через локальную сеть. И вот через некоторое время девайс отваливается от роутера.
Причем в это время через wifi (192.168.4.1) девайс нормально отвечает.
И если зайти в настройки wifi, то стоит статус ip_got, а в ip, маске и т.д. нули.
Помогает только ресет.

В то же время, если через локалку постоянно страницы открывать, то держится дольше, но вот стоит несколько минут ничего не делать - отваливается. :(
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx, у меня тут опять косяк обнаружился...
Перекомпилил, значит, я прошивку без отладки для ОТА, на целых 16 кило меньше стала. Настроил wifi как ap+st.
Подключил к роутеру и стал настраивать не через wifi, как обычно, а через локальную сеть. И вот через некоторое время девайс отваливается от роутера.
Причем в это время через wifi (192.168.4.1) девайс нормально отвечает.
И если зайти в настройки wifi, то стоит статус ip_got, а в ip, маске и т.д. нули.
Помогает только ресет.

В то же время, если через локалку постоянно страницы открывать, то держится дольше, но вот стоит несколько минут ничего не делать - отваливается. :(
Замечено, что при некоторых сбоях и перезагрузке после протектед во время отладки, ESP загружается, соединяется к AP, но остальное не проходит. Т.е. ESP не может принять или передать пакеты по WiFi - очень похоже, что нарушена калибровка частот - некоторые пакеты всё-же доходят... Надо пробовать изменить метод инициализации WiFi при перезагрузке в таких случаях. Там несколько опций - с калибровкой по питанию и т.д. Часть задается (RF calibration) в esp_init_data_default.bin, а так-же в user_rf_pre_init() - system_phy_set_rfoption(). При загрузке инициализация WiFi у китайцев идет по разным веткам, в зависимости от причин перезагрузки... В тоже время AP ESP, в таких случаях, работает как часы...
Отмена вывода отладочных сообщений изменяет временные интервалы - SDK может не успевать что-то сделать. Это тоже наблюдалось, т.к. многие задачи у китацев решаются заданием отложенного действия по таймеру. Процедура вывода отладки занимает время и тогда всё стыкуется...
Перепробовать всё я не в состоянии. Если сможете как-то локализовать место или область этого - напишите.
 
Последнее редактирование:

vad7

Active member
@pvvx, после перезагрузки через debug & test устройство сразу начинает отвечать по локалке. Вот сейчас продержалась 8 минут активного открывания страниц. RSSI становится = 31, когда отваливается. Увеличил до 300 beacon, для проверки, не помогло, но страницы стали открываться пошустрее, когда устройство на грани видимости.
Обнаружил еще, что все-таки ets_set_idle_cb() функцией пользоваться нельзя, при активной настройке wifi, где-то она сбрасывается.
Похоже, что бы отловить глюк, нужно делать вывод отладки в буфер и скачку оной через веб.

По локалке очень медленно страницы показывает, думал от связи зависит, но нет перенес устройство поближе - почти то же самое. Пробовал пинговать, до 50% пакетов может терять, а может и не терять, от чего зависит пока не понял.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Отваливание STATION при перезагрузке исправлено. Обновлено в git + прошивки (но пока в них не исправлен Info-Help)
 
  • Like
Реакции: vad7
Сверху Снизу