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