Arduino Mega Server

Модератор: Alex

Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Вт июл 28, 2015 12:29 pm

Метод sclient.write() судя по всему оперирует одним байтом. Должен быть другой метод (переопределённый может быть), который оперирует буфером. Также в драйвере файловой системы должна быть возможность чтения буфера, а не одного символа. Тогда цикл можно будет сделать не побайтный (как, видимо, сейчас), а кусками размером с буфер.

Вообще, скетчи - это зло. Нужно писать на чистом C++, где среда разработки может подсказать что и как. Как только нужно профилирование кода - ардуинщики не знают куда копать.
Россия навсегда!
arturmon82
Сообщения: 28
Зарегистрирован: Сб июн 06, 2015 6:04 pm
Благодарил (а): 9 раз
Поблагодарили: 3 раза

Re: Arduino Mega Server

Сообщение arturmon82 » Вт июл 28, 2015 12:30 pm

Заменить всякие дигитал реад и врайт на что то более быстрое для работы с портами, помоему либа называется digitalIO
А и еще заменить в этой функции запись на блок на не по 1 килобайту, где то в инете встречал, но уже не помню где

Отправлено с моего P780 через Tapatalk
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт июл 28, 2015 1:00 pm

Проблема начинает проясняться.

Файлы читаются со скоростью 25 КБ в секунду, а отдаются со скоростью 4.1 КБ в секунду. То есть дело не в чтении файлов. Проблема в отдаче функцией

sclient.write();

Можно каким-то способом увеличить скорость работы сетевого интерфейса или W5100 с большей скоростью работать не может?

И что со всем этим делать?
Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Вт июл 28, 2015 1:35 pm

Можно каким-то способом увеличить скорость работы сетевого интерфейса или W5100 с большей скоростью работать не может?
В arduino_libs нужно положить все используемые модули (заголовочники). Используемый метод чтения с SD-карты нужно заменить другим, как и подсказано в описании класса (и на что я указывал выше):

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

int File::read() {
  if (_file) 
    return _file->read();
  return -1;
}

// buffered read for more efficient, high speed reading
int File::read(void *buf, uint16_t nbyte) {
  if (_file) 
    return _file->read(buf, nbyte);
  return 0;
}
 
Наверняка в описании класса, работающего с W5100 есть аналог такой подсказки. File::read() читает либо 1 байт, либо 2 или 4 (зависит от реализации). Я думаю, что карточка не тормозит, а просто читает файл побайтно и пишет его побайтно (sclient.write()).

Где описание класса EthernetClient?
Россия навсегда!
Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Вт июл 28, 2015 1:50 pm

Попробуйте заменить код:

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

if (webFile) {
  while(webFile.available()) {
    sclient.write(webFile.read());
  }
  webFile.close();
}
на

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

// send web page to client

const MAX_BUFFER_SIZE = 32;

uint16_t rsize;
uint8_t buff[ MAX_BUFFER_SIZE ];

if ( webFile ) {
    
    while( webFile.available() ) {
        
        rsize = webFile.read( buff, MAX_BUFFER_SIZE );
        
        sclient.write( buff, rsize );    
    }
    
    webFile.close();
}
За это сообщение автора uni поблагодарили (всего 2):
Alex (Вт июл 28, 2015 2:44 pm) • Xseon (Вс янв 10, 2016 6:07 pm)
Рейтинг: 2.33%
Россия навсегда!
cabat
Сообщения: 216
Зарегистрирован: Ср май 28, 2014 12:42 pm
Откуда: Санкт-Петерург
Благодарил (а): 76 раз
Поблагодарили: 28 раз

Re: Arduino Mega Server

Сообщение cabat » Вт июл 28, 2015 2:43 pm

Возможно будут полезны вот эти ссылки:
http://ua9uqb.livejournal.com/162691.ht ... ad=1272451
http://aterentiev.livejournal.com/123718.html
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт июл 28, 2015 2:44 pm

Докладываю о результатах.

Время загрузки тестовых страниц сократилось примерно на 30%, что очень круто.

С 13 секунд до 5 и с 18 секунд до 12. Но всё равно ещё очень велико. Есть ли какие-нибудь ещё способы увеличить скорость? Например увеличить буфер до 64 или более?

Что непонятно. По тестам скорость отдачи стала 43 КБ/сек, то есть увеличилась в 10 раз, скорость загрузки возросла только на 30%. Как это?

А вообще, uni, вы — гений и вам плюс в карму. :)
Аватара пользователя
uni
Сообщения: 191
Зарегистрирован: Вс июл 26, 2015 9:21 pm
Откуда: Екатеринбург
Благодарил (а): 4 раза
Поблагодарили: 7 раз
Контактная информация:

Re: Arduino Mega Server

Сообщение uni » Вт июл 28, 2015 3:15 pm

Размер буфера я взял с потолка. Вообще, этот размер зависит от свободной ОЗУ. Если есть место, то можно поставить и 512 байт. Нужно вынести определение буфера в глобальные переменные, тогда при компиляции будет видно влезает ли буфер в ОЗУ или нет. Его нельзя оставлять локально определённым.
Что непонятно. По тестам скорость отдачи стала 43 КБ/сек, то есть увеличилась в 10 раз, скорость загрузки возросла только на 30%. Как это?
Поскольку используется один SPI (насколько я понял), то время работы с картой перемежается со временем работы с Ethernet. Т.е. всё время чтения с карточки Ethernet в ожидании. Тут нужно правильно всё считать просто. Мысленно представить последовательность работы по SPI и логически посчитать.

П.С. Максимальный размер буфера зависит от того, какой размер страницы используется в драйвере sd-карты для чтения. Это нужно смотреть в коде драйвера. В драйвере PetitFS используется размер 512 байт.

Если поставить размер 513 байт, к примеру, то скорость может упасть, т.к. будут читаться две страницы по 512 байт, но во второй используется только 1 байт. Это если читается размер страницы в 512 байт.
Россия навсегда!
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт июл 28, 2015 3:29 pm

На Меге по моему 2 SPI и теоретически, наверное, можно было бы задействовать оба. Но это такие дебри, что даже думать в эту сторону не хочется.

Теперь хотелось бы выявить второго в очереди тех, кто тормозит загрузку от момента нажатия кнопки до загрузки страницы.

Что-то практических методов выявления виновника №2 мне не приходит в голову.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Вт июл 28, 2015 3:51 pm

Информация к размышлению.

Файлы весят 50 КБ (5 штук). При скорости передачи в 43 КБ/сек для их передачи требуется 1.1 секунды. С накладными расходами, пускай 4 секунды. Реально загружается за 12 секунд.

Вопрос. На что уходит 8 секунд и как это выявить?
Ответить