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

Где найти подробное описания по работе с pubsubclient.h

combasoft

New member
На самом деле вектора прерывания - это и есть адрес колбек функций.
Пока не могу с этим согласиться..
Есть прерывания от устройств, а есть прерывания от программ.
Прерывания от программ - это тоже прерывания от железа (процессора или диспетчера памяти).
Да, типа ДОС-овского системного 21h или там BIOS 10h или 09h (кажется, на 1-е аппаратное прерывание замаплен). Тут как, мне кажется, видение мира у нас одинаковое.
Колбеком такие функции называются потому, что они будут вызваны не по ходу исполнения кода, как вызываются обычные функции, а когда-то позже, когда возникнет вызывающее их событие.
Раньше их просто называли функциями обработчиками прерываний, ну ок.
Картинка почти сложилась. Есть ли где дока по прерываниям ESP? Интересно глянуть какой номер прерывания с чем соотнесен, есть ли приоритеты. Я все еще подозреваю, что wifi модуль живет своей жизнью и висит на одном из прерываний + имеет доступ в отведенную ему область памяти (буфер под принятые пакеты). Типа принял пакет, положил данные и дернул прерывание, по аналогии с UART - мол вам письмо. А на прерывании уже сидит что-то со стороны Wiring.
..колбэк функция должна выполняться полностью, без прерываний..
Вот это смущает. Либо нет разных приоритетов у прерываний, либо (что вероятнее) прерывания на время выполнения колбэк функции запрещаются, типа CLI -> тело функции -> STI. Но это значит, что мы запрещаем все прерывания, в том числе и более приоритетные, что чревато пропуском важных системных событий. А, не, отбой. Увидел слово "должна". Но опять же. Если мы хотим отреагировать на изменение на пине и не хотим монитроить его в цикле - мы навешиваем нашу функцию обработки изменения состояния пина на одно из прерываний, которое соотнесено с этим событием. Делаем это двумя способами: либо в таблице векторов прописываем адрес нашей функции либо каким-то образом добавляем вызов нашей функции из штатной функции обработки прерывания. Ничего страшного, если процессор в это время переключится на выполнение более приоритетной задачи - он же потом обратно вернется в то же место откуда его прервали. Разве что мы словим мелкую задержку. Если мы не строим что-то реалтаймовое, где все события должны происходить с точностью до тика, то это не критично.
 

Сергей_Ф

Moderator
Команда форума
@combasoft для пользователя Arduino IDE, Вы лезете в абсолютно ненужные дебри. Либо Вы уж пользуетесь готовыми либами и не заморачиваетесь (поправить ошибки в либах не в счёт), либо переходите на SDK/UDK и тогда копаете кишочки. На двух стульях сидеть не стоит, имхо.
 

combasoft

New member
@combasoft для пользователя Arduino IDE, Вы лезете в абсолютно ненужные дебри. Либо Вы уж пользуетесь готовыми либами и не заморачиваетесь (поправить ошибки в либах не в счёт), либо переходите на SDK/UDK и тогда копаете кишочки. На двух стульях сидеть не стоит, имхо.
Для меня это нормально) Я просто хочу убедиться, что уже есть инструмент, который сохранит пришедшие пакеты, и не нужно городить что-то свое. В общем, не хочу надеяться на авось. Сделать это можно на мой взгляд двумя путями: увидеть как оно устроено, определиться какой ёмкости буфер ну или устроить нагрузочное тестирование, что попроще)

Небольшой апдейт. Нашел в доке по эспрессиф:
Currently, only 20% of MIPS has been occupied by the WiFi stack,
т.е. всё висит на проце, никакой отдельный модуль этими делами не занимается, только проц.

Вот кстати вариант с нагрузочным тестированием - просто понять для себя при каких условиях оно начинает терять входящие данные.

@Victor, не подскажете за yield() ? В приведенном вами примере вызовы этой функции используются в нескольких местах. Ардуиновская документация кратко отмечает, что это функция из экспериментальной либы и что она служит тому, что бы функция, в теле которой вызывается yield(), могла быть прервана.
Не понятно по какому принципу расставлять вызовы yield() и почему ее вставляли в основной цикл, который вроде бы и так может быть прерван прерыванием.
 

ivanpost67

New member
Никто не подскажет, как в этой в PubSubClient(Client, Server, Port) загрузить параметры не из скетча а из EEPROM (системные, туда записаны с HTML) ?
Во всех примерах функция стоит с явными строчными параметрами до void setup.. Квалификации нету осознать эту подстановку.
 
Сверху Снизу