Arduino Mega Server для esp8266

Модератор: Alex

serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server для esp8266

Сообщение serghei » Сб сен 02, 2017 11:05 pm

Вот и я про то же. Редко , но бывает карту передергиваю несколько раз в гнезде, пока запустится. AMS стартует всегда , только когда открываю страницы , на второй зависает. На Дуе постоянно открыты две сразу и никогда не отваливается.
Во вторник заберу еще две платы с батарейкой ( 75 дней летела в самолете , я про неё уже и забыл). Но это уже в своей теме продолжу.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server для esp8266

Сообщение Alex » Вс сен 03, 2017 10:37 am

Удалось запустить SD карту, обсуждение ESP32 перенёс в соответствующую тему

viewtopic.php?f=19&t=4032&p=58856#p58856
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server для esp8266

Сообщение Alex » Вт сен 19, 2017 1:21 am

Актуальный вопрос с тормознутостью сетевой работы ESP8266. Кто-нибудь может объяснить почему функция

Код: Выделить всё

cl.write(s.c_str());
cl.write(s.c_str(), s.length()); 
на ESP8266 работает со скоростью примерно 200 Б/с, то есть в 300 (!) раз медленнее чем на других контроллерах?

А функция

Код: Выделить всё

cl.print(s); 
Вообще тормозит так, что её невозможно использовать?

Понятно, что эти функции криво написаны, но как это лечить?
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: Arduino Mega Server для esp8266

Сообщение dmw » Вт сен 19, 2017 1:20 pm

А библиотеку ESP8266WebServer.h не пробовали для сравнения?
Хоть там тоже через currentClient.write(header.c_str(), header.length()) внутри библиотеки все делается, но всеже вдруг там какието оптимизаторы могли быть задействованы?

Плюс вот тут например: https://github.com/tretyakovsa/Sonoff_WiFi_switch все файлы в /data архивированы в .gz что дает вроде как браузеру пересылать немного меньше байтов. Теоретически должно повысить скорость загрузки страниц.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server для esp8266

Сообщение Alex » Вт сен 19, 2017 1:50 pm

А библиотеку ESP8266WebServer.h не пробовали для сравнения?
Я этот вопрос уже не первый раз поднимаю и никто из местных «профессионалов С и ассемблера» не может сказать ничего. А всего-то надо поправить библиотечную функцию. Замедление отдачи в сеть не на проценты и даже не в разы, а аж в 300 (!) раз.

И ещё раз призываю любителей микрочипа и загрузчиков показать свою квалификацию на деле.

Сам я утыкаюсь в функции в файле WiFiClient.cpp

Код: Выделить всё

virtual size_t write(const uint8_t *buf, size_t size);
  size_t write_P(PGM_P buf, size_t size);
  template <typename T>
  size_t write(T& source, size_t unitSize);

Код: Выделить всё

template <typename T>
inline size_t WiFiClient::write(T& source, size_t unitSize) {
  std::unique_ptr<uint8_t[]> buffer(new uint8_t[unitSize]);
  size_t size_sent = 0;
  
  while(true) {
    size_t left = source.available();
    if (!left)
      break;
    size_t will_send = (left < unitSize) ? left : unitSize;
    source.read(buffer.get(), will_send);
    size_t cb = write(buffer.get(), will_send);
    size_sent += cb;
    if (cb != will_send) {
      break;
    }
  }
  return size_sent;
}

Код: Выделить всё

size_t WiFiClient::write(const uint8_t *buf, size_t size)
{

    if (!_client || !size)
    {
        return 0;
    }

    return _client->write(reinterpret_cast<const char*>(buf), size);
}

и просто не знаю в чём дело и куда копать дальше.

Замедление в 300 раз, Карл. Ещё раз призываю совместно решить эту проблему — в результате АМС на ESP8266 перестанет тормозить. И все же этим смогут воспользоваться.
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server для esp8266

Сообщение alexsis_76 » Вт сен 19, 2017 2:41 pm

вот такие конструкции while(true) всегда вызывают настороженность,бесконечный цикл попробуйте вставить туда отладочный код.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server для esp8266

Сообщение Alex » Вт сен 19, 2017 2:48 pm

Сразу же вопрос: я попытался вставить отладочный маркер в функцию

Код: Выделить всё

template <typename T>
inline size_t WiFiClient::write(T& source, size_t unitSize) {
  std::unique_ptr<uint8_t[]> buffer(new uint8_t[unitSize]);
  size_t size_sent = 0;
  
  while(true) {
    size_t left = source.available();
    if (!left)
      break;
    size_t will_send = (left < unitSize) ? left : unitSize;
    source.read(buffer.get(), will_send);
    size_t cb = write(buffer.get(), will_send);
    size_sent += cb;
    if (cb != will_send) {
      break;
    }
  }
  return size_sent;
} 
компилятор его прекрасно проглотил, но в сериале ничего не выводится (в любом месте этой функции). Хотя тот же маркер прекрасно работает тут

Код: Выделить всё

size_t WiFiClient::write(const uint8_t *buf, size_t size)
{

    if (!_client || !size)
    {
        return 0;
    }

    return _client->write(reinterpret_cast<const char*>(buf), size);
}  
Что это вообще такое и почему не работает отладка в первой функции?
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server для esp8266

Сообщение alexsis_76 » Вт сен 19, 2017 3:00 pm

Что это вообще такое и почему не работает отладка в первой функции?
этому коду не передается управление(обычно по этому и не работает)
может вы не правильно интерпретируете код?
а что это такое
template <typename T>
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server для esp8266

Сообщение Alex » Вт сен 19, 2017 3:13 pm

этому коду не передается управление(обычно по этому и не работает)
может вы не правильно интерпретируете код?
а что это такое
template <typename T>
Это как раз я у вас хотел спросить :) Я так понимаю, что это шаблон для подстановки любого типа во входные параметры функции.

Что этому коду не передаётся управление — я тоже об этом думал, но другого кода для write в этой библиотеке нет!

Вы очень меня обяжете, если откроете файл WiFiClient.h и укажете, где всё-таки происходит передача строки клиенту.
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server для esp8266

Сообщение alexsis_76 » Вт сен 19, 2017 3:19 pm

а где их взять?
Что это вообще такое и почему не работает отладка в первой функции
?
потому что это шаблон
а это настоящая функция
size_t WiFiClient::write(const uint8_t *buf, size_t size)
{

if (!_client || !size)
{
return 0;
}

return _client->write(reinterpret_cast<const char*>(buf), size);
}
видимо так
Ответить