реклама на сайте
подробности

 
 
> Как повысить скорость работы по сети AT91SAM7X256
OlegHmt
сообщение Apr 22 2008, 07:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-12-06
Пользователь №: 23 146



Некоторое время назад я разрабатывал прошивку для этого процесора в которой была добавлена функциональность обмена данными по сети и USB. В качестве операционной системы использована FreeRTOS, TCP/IP стека - uIP. Сейчас потребовалось повысить скорость обработки событий устройством и оказалось, что по сети обмен данными идёт медленно. Так как я разбирался со всеми нюансами процесора и внутренностями сети самостоятельно, то мог пропустить какие-то важные моменты. Может кто увидит какие-то недостатки приведённого ниже алгоритма и подскажет как увеличить скорость работы устройства.
Итак, в устройство периодически по сети передаются данные блоком размером приблизительно в 16-20 кБ. Эти данные записываются в масив памяти и по таймеру процесора обрабатываются.
Когда я програмировал работу с сетью то передачу данных сделал блоками по 1500 Байт. Может я что-то не учёл, а может тогда вылезали другие ошибки, но при передачи блока большей длины у меня подвисал процесор (приёмный буфер установлен приблизительно на 2кБ), поэтому сделать так как в USB, когда я пишу в порт всё одним куском, на уровне USB контролера масив разбивается на части, а в процесоре я уже собираю данные (гарантированно доставленные), мне не удалось. Сейчас я смотрю, что похоже можно в обработчике прерываний от сети поставить свой код анализа входных данных и сделать похоже как в USB но не уверен - не буду ли я получать повреждённые даные, которые долго нужно будет перефрагментировать, проверять и т.д.
Сейчас у меня скорость передачи данных приблизительно 2Мб/с по 100 мегабитной сети. Выглядит это приблизительно так (результат теперешнего анализа с помощью Ethereal): отсылается пакет размером в 1500 байт в процесор, приблизительно через 4мс (время работы стека и моего копирования порции в нужное место памяти) процесор отсылает однобайтный пакет-подтверждения о приёме данных (чтобы внешняя программа не начала посылать данные пока я не обработал предыдущую порцию - правильно ли?), приблизительно через (дома забыл логи поэтому тут цыфру не помню) толи 1, толи 0,1мс, отсылается следующая порция данных. В результате 16кБ передаётся приблизительно за 50мс. Долго, было бы хорошо хотя бы в 2 раза быстрее. Можно ли улучшить скорость? Я смотрел, что при обработке стек копирует данные из буфера контролера в память, а потом я копирую куда мне нужно. Может можно сразу копировать без промежуточного буфера, но не будут ли проблемы с проверкой ошибок при передаче?
Может в стеке uIP можно убрать лишнюю обработку?

Пока что я в процессе анализа кода, может ещё что и сам найду, но за любые советы и предложения буду искренне благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Apr 22 2008, 09:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Закончил примерно с месяц встраиваемый HTTP-сервер + SNMP-агент на AT91SAM7X256. Стек использовал свой - давным-давно переделанный OpenTCP. Самый большой тормоз, ИМХО, в таких приложениях - использование memcpy, хотя МК распологает возможностью не использовать данную функцию. Код выложить не могу, ибо мое. Идея относительно простая:

1. Пишем свой менеджер памяти для работы с блоками по 128 байт (размерность для принимаемых блоков EMAC SAM7X).

2. Выделяем драйверу EMAC и стеку TCP/IP блоки.

3. При получении данных драйвер отдает список блоков с принятым пакетом а стек драйверу взамен свободные блоки. При этом производится обмен только указателями. Как такового не нужного копирования данных не происходит.

4. Соответсвенно, приложения(задачи) верхнего уровня (могут быть) тоже заточены под такой обмен данными.

При отправке данных опять происходит обмен указателями между драйвером и стеком(приложением).



Скорость, честно говоря не мерял, но работает довольно шустро - сетка прнимерно из 3-х сотен машин


--------------------
Go to the top of the page
 
+Quote Post
OlegHmt
сообщение Apr 22 2008, 11:06
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-12-06
Пользователь №: 23 146



Цитата(prottoss @ Apr 22 2008, 12:04) *
Закончил примерно с месяц встраиваемый HTTP-сервер + SNMP-агент на AT91SAM7X256. Стек использовал свой - давным-давно переделанный OpenTCP. Самый большой тормоз, ИМХО, в таких приложениях - использование memcpy, хотя МК распологает возможностью не использовать данную функцию. Код выложить не могу, ибо мое. Идея относительно простая:

1. Пишем свой менеджер памяти для работы с блоками по 128 байт (размерность для принимаемых блоков EMAC SAM7X).

2. Выделяем драйверу EMAC и стеку TCP/IP блоки.

3. При получении данных драйвер отдает список блоков с принятым пакетом а стек драйверу взамен свободные блоки. При этом производится обмен только указателями. Как такового не нужного копирования данных не происходит.

4. Соответсвенно, приложения(задачи) верхнего уровня (могут быть) тоже заточены под такой обмен данными.

При отправке данных опять происходит обмен указателями между драйвером и стеком(приложением).



Скорость, честно говоря не мерял, но работает довольно шустро - сетка прнимерно из 3-х сотен машин


Очень хороша идея.
Главное, что сам похожие вещи делал, при чём в этом же проекте, а тут использовать не догадался. Попробую smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 22 2008, 13:08
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
в таких приложениях - использование memcpy

Да от memcpy надо уходить.
Но даже с копированием, если сразу по 4 байта, и без проверок на выход за границы скорость значительно возрастет.

e.g.:

Код
static void memcpy_burst( U32 *pDest, U32 *pSrc, U32 size )
{
    U32  wCnt = (size + 3) >> 2; // words count to be copied
    do
    {
        *pDest++ = *pSrc++;
    } while (--wCnt);
}


данные обязательно должны быть 32bit-aligned.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 4 2008, 10:06
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Apr 22 2008, 17:08) *
Да от memcpy надо уходить.

Не надо уходить от memcpy! Стандартные библиотеки писаны далеко не дураками, и не на C.
Ссылка.
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 4 2008, 13:01
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ May 4 2008, 17:06) *
Не надо уходить от memcpy! Стандартные библиотеки писаны далеко не дураками, и не на C.
Ссылка.
Ну тогда объясните, чем memcpy лучше обмена списками вида
Код
typedef struct __DATALIST
{
   struct __DATALIST *next;  /* next datalist */
   void  *data;  /* adress for data */
   UINT data_len; /* lenght for this data in bytes */
   UINT total_len; /* total lenght for all data in datalist */

} DATALIST;

Вернее указателями на списки

Цитата(OlegHmt @ May 4 2008, 03:30) *
Писать свой менеджер памяти, пока для меня будет сложно, поэтому разбираюсь с lwIP. Правда ещё попробую копировать по 4 байта. А пока такой вопрос - прошивка у меня компилируется в Thumb виде, согласно документации - использование ARM команд повышает быстродействие по сравнению с Thumb режимом. Пока что, при компиляции в ARM у меня система перестаёт работать - запускается нормально, но при попытке объявить (или запустить, ещё не разобрался) какую-либо задачу (использую FreeRTOS) - виснет. Соответсвенно вопрос - стоит ли этим баловаться (в смысле компиляцией в ARM) и в чём может быть проблема, что у меня подвисает система (может я не учёл что-либо общеизвестное)?
FreeRTOS не лучшая ОСь для повышения скорости. Если с lwIP более-менее разобрались, почему бы не выбрать что-нить (OS) побыстрее и посеръезнее? Попробуйте перевести проект на ucOS-II. Наверняка получите еще несколько десятков попугаев, а возможно и исчезнут проблемы при компиляции в ARM-режиме, хотя как уже сказали выше, толку не будет из за пакетов-венегретов smile.gif

Сообщение отредактировал prottoss - May 4 2008, 13:04


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 4 2008, 16:33
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(prottoss @ May 4 2008, 15:01) *
FreeRTOS не лучшая ОСь для повышения скорости.

Глупость какая sad.gif
Цитата
почему бы не выбрать что-нить (OS) побыстрее и посеръезнее?
Попробуйте перевести проект на ucOS-II.

uCOS-II одна из самых простых и "несерьезных" осей. За счет экстремально примитивного шедулера потециально чуть быстее перепланирует задачи при их малом количестве. Это очень далеко от способностей "ускорить" IP стек.
Цитата
а возможно и исчезнут проблемы при компиляции в ARM-режиме...

И еще шерсть возможно станет мягкой и щелковистой smile.gif. Ну нет проблем с ARM режимом. Совсем нет.


Цитата(defunct @ May 4 2008, 15:58) *
По объему кода?

По быстродействию, естественно. На объемы кода в подавляющем большинстве случаеев наплевать. Да и по обьему не обещанные 30% а около 15.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 4 2008, 16:58
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(zltigo @ May 4 2008, 23:33) *
Мне следовало добавить ИМХО smile.gif . Так как останусь при своем мнении не смотря на глупости.


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- OlegHmt   Как повысить скорость работы по сети AT91SAM7X256   Apr 22 2008, 07:21
- - _dem   2 мегабита или 2 мегабайта ?   Apr 22 2008, 07:26
|- - OlegHmt   Цитата(_dem @ Apr 22 2008, 10:26) 2 мегаб...   Apr 22 2008, 08:03
- - Gemm   Цитата(OlegHmt @ Apr 22 2008, 11:21) ... ...   Apr 22 2008, 08:01
- - chds   А транспорт UDP или TCP? Мы юзали uCOS у нас с под...   Apr 22 2008, 08:24
|- - OlegHmt   Цитата(chds @ Apr 22 2008, 11:24) А транс...   Apr 22 2008, 08:36
|- - zltigo   Цитата(aaarrr @ May 4 2008, 12:06) Не над...   May 4 2008, 10:45
|- - defunct   Цитата(zltigo @ May 4 2008, 19:33) По быс...   May 4 2008, 20:09
- - _dem   Какую скорость требуется получить ? на uip много ...   Apr 22 2008, 14:33
|- - OlegHmt   Цитата(_dem @ Apr 22 2008, 17:33) Какую с...   Apr 22 2008, 14:59
- - OlegHmt   Писать свой менеджер памяти, пока для меня будет с...   May 3 2008, 20:30
|- - defunct   Цитата(OlegHmt @ May 3 2008, 23:30) А пок...   May 3 2008, 21:26
|- - Rst7   Цитата(defunct @ May 4 2008, 00:26) В ARM...   May 4 2008, 11:06
|- - defunct   Цитата(Rst7 @ May 4 2008, 14:06) Вы уж пр...   May 4 2008, 13:58
|- - prottoss   Цитата(defunct @ May 4 2008, 20:58) Есть ...   May 4 2008, 14:17
||- - defunct   Цитата(prottoss @ May 4 2008, 17:17) Я же...   May 4 2008, 14:26
||- - prottoss   Цитата(defunct @ May 4 2008, 21:26) Ну ка...   May 4 2008, 14:55
||- - defunct   Цитата(prottoss @ May 4 2008, 17:55) hIP ...   May 4 2008, 14:59
||- - prottoss   Цитата(defunct @ May 4 2008, 21:59) Ок, к...   May 4 2008, 15:17
||- - defunct   Цитата(prottoss @ May 4 2008, 18:17) Но о...   May 4 2008, 15:20
||- - prottoss   Цитата(defunct @ May 4 2008, 22:20) Под m...   May 4 2008, 15:27
|||- - defunct   Цитата(prottoss @ May 4 2008, 18:27) Я го...   May 4 2008, 15:33
|||- - prottoss   Цитата(defunct @ May 4 2008, 22:33) Ну ды...   May 4 2008, 15:52
|||- - prottoss   Цитата(defunct @ May 4 2008, 22:33) Указа...   May 4 2008, 16:01
|||- - defunct   prottoss можете привести реальные цифры? Сколько у...   May 4 2008, 16:10
|||- - prottoss   Цитата(defunct @ May 4 2008, 23:10) prott...   May 4 2008, 16:48
||- - blackfin   Цитата(defunct @ May 4 2008, 19:20) Может...   May 4 2008, 15:53
||- - defunct   Цитата(blackfin @ May 4 2008, 18:53) Это ...   May 4 2008, 15:58
||- - blackfin   Цитата(defunct @ May 4 2008, 19:58) А с ч...   May 4 2008, 16:37
||- - zltigo   Цитата(blackfin @ May 4 2008, 18:37) Если...   May 4 2008, 16:52
||- - blackfin   Цитата(zltigo @ May 4 2008, 20:52) Ага, т...   May 4 2008, 16:59
||- - zltigo   Цитата(blackfin @ May 4 2008, 18:59) Став...   May 4 2008, 17:47
||- - blackfin   Цитата(zltigo @ May 4 2008, 21:47) Будет ...   May 4 2008, 17:58
||- - zltigo   Цитата(blackfin @ May 4 2008, 19:58) Меня...   May 4 2008, 18:09
|- - aaarrr   Цитата(defunct @ May 4 2008, 17:58) Надо ...   May 4 2008, 15:15
- - OlegHmt   Понятно, тогда вопрос со стороны lwIP - можно ли и...   May 3 2008, 22:30
|- - defunct   Цитата(OlegHmt @ May 4 2008, 01:30) Перво...   May 3 2008, 23:12
|- - OlegHmt   Цитата(defunct @ May 4 2008, 02:12) А чем...   May 4 2008, 07:36
- - Rst7   Цитатарасчитаной на быстрое копирование выровненны...   May 4 2008, 15:19
- - Rst7   ЦитатаНу дык на 60-ти байтных пакетах +/- попугай ...   May 4 2008, 15:43
- - Rst7   ЦитатаДлина блоков, применительно к SAM7X уже выбр...   May 4 2008, 16:37
- - AlexandrY   Возьмите процы от Freescale, в них IP-core Ethern...   May 4 2008, 21:32
|- - zltigo   Цитата(AlexandrY @ May 4 2008, 23:32) RTO...   May 5 2008, 08:07
|- - AlexandrY   Я ж не предлагаю отказаться от оси. Это ж святое...   May 5 2008, 09:19
- - OlegHmt   Ну и темку же я поднял Поделюсь результатами кот...   May 5 2008, 06:59
- - Rst7   ЦитатаВозьмите процы от Freescale, в них IP-core ...   May 5 2008, 09:44
|- - AlexandrY   Не забывают, а не договаривают. Ну не всеж сразу в...   May 5 2008, 10:24
- - Rst7   ЦитатаЕсть такой тэг VLAN, в MAC хидере. Используя...   May 5 2008, 11:12
- - AlexandrY   Вообще-то я просто прикалывался, но была одна мелк...   May 5 2008, 13:20


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01557 секунд с 7
ELECTRONIX ©2004-2016