Arduino Mega Server

Модератор: Alex

alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Вт апр 19, 2016 7:38 am

Посмотрел сегодня коды AMS честно говоря немного не по себе, вот от чего, сначала открываем 2 сокета, затем браузер спрашивает GET и начинается куча пакетов размером 1 байт полезной нагрузки передается по одному символу, т е первый пакет H второй T третий T и т д,представляете да, блин в шоке, затем начинают грузится картинки, вместо того чтобы грузить сразу по сектору в 512 байт , грузим по 128, надо что то делать :)
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт апр 19, 2016 9:23 am

Посмотрел сегодня коды AMS честно говоря немного не по себе, вот от чего, сначала открываем 2 сокета, затем браузер спрашивает GET и начинается куча пакетов размером 1 байт полезной нагрузки передается по одному символу, т е первый пакет H второй T третий T и т д,представляете да, блин в шоке, затем начинают грузится картинки, вместо того чтобы грузить сразу по сектору в 512 байт , грузим по 128, надо что то делать
Ни одного слова не понял. Постарайтесь сформулировать попонятнее — тема актуальная и интересны все дельные предложения по ускорению сетевой работы.
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Вт апр 19, 2016 9:46 am

Alex вот сдесь
Безымянный_1.JPG
Безымянный_1.JPG (346.99 КБ) 12738 просмотров
это сетевой сканер видите в самом верху пакеты SYN это браузер открывает 2 потока оба они хотят соединится с портом 80 по исходящим портам 4415 и 4416. затем ниже строка GET/HTTP, это запрос от браузера
и ниже начинается самое интересное, в самом верху пакет размером 118 байт, это я уже переделал и ниже видите пакеты от 192,168,1,37 длинной 60 байт перемежаются с ACK пакетами от 192,168,1,100 в углу можете посмотреть содержимое пакета , как видите полезная нагрузка равна всего 1 байт , загрузите варезшарк все увидите, собственно так по байту они и передаются , ниже картинки по 128 байт
так делают эти функции
cl.print("<"); cl.print(tagBase); cl.print(tagCount); cl.print(">");
передают в сокет байт за байтом
если из заменить на эти
void sendHtmlAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n"));}
void sendCssAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: text/css\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: text/css\r\nConnnection: close\r\n\r\n"));}
void sendJsAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: application/javascript\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: application/javascript\r\nConnnection: close\r\n\r\n"));}
void sendImgAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nConnnection: close\r\n\r\n"));}
void sendXmlAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\nConnnection: close\r\n\r\n"));}
то получим пакет длинной 118 байтов.
файл server_ajax в архиве, там все увидите.

Да функции в таком виде малопригодны для использования,жрут много памяти,одна и та же строка хранится в контроллере аж в трех местах, строку можно спрятать за PGM, освободив кучку оперативки.
Вложения
server_ajax.rar
(4.2 КБ) 193 скачивания
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Ср апр 20, 2016 12:48 pm

Нашел еще одну бяку, ту самую,завтра исправлю, поставил размер пакета картинок 512 картинки стали грузится повеселее.
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Чт апр 21, 2016 11:16 am

подредактировал код получилось так
Безымянный_444.JPG
Безымянный_444.JPG (160.04 КБ) 12640 просмотров
я думаю вполне хороше для контроллера с 16 мгц,код можно еще перетрясти для оптимизации, попрятать глобальные буфера и строки, а так же убрать cl.print.
За это сообщение автора alexsis_76 поблагодарил:
nick7zmail (Чт апр 21, 2016 11:20 am)
Рейтинг: 1.16%
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пт апр 22, 2016 8:45 am

Поскольку вы создаёте полезные решения, то предлагаю оформлять их как можно подробнее и каждое по отдельности с описанием, иначе ни я, ни кто другой не смогут ими воспользоваться.

Например, «ускорение загрузки картинок»

Делаем 1...
Делаем 2...
Делаем 3...

«Избавление от cl.print»

Делаем 1...
Делаем 2...
Делаем 3...

И так далее...
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Mega Server

Сообщение nick7zmail » Пт апр 22, 2016 9:01 am

Согласен с Алексом...выложите пожалуйста ваши оптимизации...думаю неплохо бы их было включить в релиз амс 0.15...тут, наверное, все за ускорение работы)

Отправлено с моего Xperia Z через Tapatalk
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Пт апр 22, 2016 9:47 am

Давайте.
Насчет мелких пакетов , которые по 54 байта на рисунке с сетевого сканера, когда с браузера приходит запрос GET/HTTP amc начинает отдавать ответ, первой следует строка
HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n
сейчас это делается с помощью cl.print, которая передает в канал сообщение побайтно, в результате возникает куча пакетов с полезной нагрузкой 1 байт, с учетом всех заголовков 54 байта, в результате в первом пакете передается первый H,второй T, третий T, четвертый P и т д, на картинке в углу фрагмент такого пакета , внизу надпись TCP SEGMENT DATA (1byte), сделаем так, заодно освобождаем оперативную память от находящейся там строки, дело в том что при данном способе строки хранятся в контроллере в двух экземплярах, сначала строка при прошивке вкомпиливается во флеш память (та которая 256 кб), затем, при запуске бодро копируются в оперативку и висят там до выключения питания, короче говоря место занимают, делаем так
PSTR("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n" )
строка перемещается в память программ(можете проверить), но обычным путем ее оттуда уже не добыть, поэтому описана функция
void write_p(const char *progmem_s,EthernetClient cl){
char c;
char Buf[512];
uint8_t Count=0;
while ((c = pgm_read_byte_near(progmem_s++))) {
Buf[Count]=c;
Count++;
}
cl.write(Buf,Count);
}
которая может скопировать за раз 512 байт из памяти программ в память данных и передать одним пакетом, в результате получаем пакет длинной 118 байтов где помещается весь ответ, не пугайтесь сильно такого большого значения 512(можно и поменьше), это конечно налагает некоторые ограничения, этот буфер существует только в функции void write_p,создается в момент входа в функцию в стеке и уничтожается при выходе, это необходимо иметь ввиду оставляя необходимое количество свободной памяти иначе не будет работать, учитывая что таких моментов там много , можно наскрести наверное около килобайта бесхозной памяти.в архиве файл которого коснулись данные правки,попозже будет остальное.
Вложения
server_ajax.rar
(5.27 КБ) 198 скачиваний
За это сообщение автора alexsis_76 поблагодарил:
ipz (Сб май 28, 2016 3:54 pm)
Рейтинг: 1.16%
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server

Сообщение serghei » Пт апр 22, 2016 9:54 am

Попробовал оптимизатор в деле и сразу уперся в две очень неприятные вещи-
1. Так-как скорость выросла до 250 000 в стандартный сериал выводится каша(максимум 115 000). То что АМС работает
вижу только по экрану.
2.Ввиду увеличения буфера обмена в IDE до 1 килобайта у Меги не остается памяти для работы.
Если отключить главный пожиратель оперативы модуль электро-останется 3 килобайта-работать
можно,но мерить температуру такой ценой?
3. У дуи проблем с оперативой нет,но мне пока не удалось добиться заливки файлов.
Выводы. Прога отличная, но надо очень подробную инструкцию по инсталяции и изменений всех файлов!
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Пт апр 22, 2016 9:56 am

А на меге работает?
Ответить