Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » ARM
Медленный Ethernet
Fireball
Добавлено 16.10.2010 02:15
0
Сообщение: 1
Fireball
0

Пункты: 1075
Регистрация: 16.02.2010
Доброго времени суток!
Взял за основу IAR-овский пример от Atmel basic-emac-uip-helloworld-project. Немного доработал hello-world.c:
в хенделере socket-соединения формирую массив данных, достаточно большой и разрезая массив отправляю socket-клиенту. Вот фрагмент исходника:
Код

while (totalData >= LAN_PACKAGE_SIZE) {
PSOCK_SEND(&s->p, (char*)(outBuf+offset) , LAN_PACKAGE_SIZE);
commandsNumber -= LAN_PACKAGE_SIZE;
offset += LAN_PACKAGE_SIZE;
}

if (totalData > 0){

PSOCK_SEND(&s->p, (char*)(outBuf+offset), commandsNumber);
}


Проблема следующая : передача данных происходит ну очень медленно - порядка 5Кб/сек. Можно ли каким то образом поднять скорость интерфейса?
Спуститься к концу Подняться к началу
Персональная информация
Alexandr
Добавлено 17.10.2010 08:43 Сообщение: 2
Alexandr
0

Пункты: 234
Регистрация: 13.01.2010
Приветствую Fireball.
Не подскажешь на основе какого транспортного протокола создавал сокет (UDP, TCP). и где можно найти исходник от Atmel - basic-emac-uip-helloworld-project.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 17.10.2010 11:23 Сообщение: 3
Jury093
4.5

Пункты: 54233
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
где можно найти исходник от Atmel - basic-emac-uip-helloworld-project

попробуйте вот отсюда выудить пакет сорцов, там вполне могут оказаться искомый и остальные полезные для изучения
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4343

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Fireball
Добавлено 17.10.2010 22:12 Сообщение: 4
Fireball
0

Пункты: 1075
Регистрация: 16.02.2010
Собственно возник еще вопрос:
Решил немного поэкспериментировать с вышеприведенным проектом и заменил функцию handle_connection на следующую:
Код

static int
handle_connection(struct hello_world_state *s)
{
char buffer[1000];
int i ;
for (i = 0; i < 250; i++)
buffer[i] = '1' + i % 10;
PSOCK_BEGIN(&s->p);

printf("%d %d\r\n", i, &buffer);
for (i = 0; i < 1000; i++){
printf("Bef:%d\r\n" , i);
PSOCK_SEND(&s->p, buffer, 250);
printf("Aft:%d\r\n" , i);
}
PSOCK_CLOSE(&s->p);
printf("%d %d\r\n", i, &buffer);
PSOCK_END(&s->p);
}

В результате после подключения через сокет получил следующее в консоль ARM-а:
Цитата

=== DHCP Configurations ===
- IP : 192.168.0.54
- Mask : 255.255.255.0
- GW : 192.168.0.1
- DNS : 192.168.0.1
===========================

DNS NOT enabled in the demo
250 536881448
Bef:0
Aft:250
Bef:251
Aft:250
Bef:251
Aft:250
......

Загрузку в ARM и последующий цикл значений опускаю....
Вопрос следующий - почему меняется значение переменной после вызова метода PSOCK_SEND? И как с этим бороться?

Заранее спасибо за ваши предложения и ответы.
Спуститься к концу Подняться к началу
Персональная информация
Fireball
Добавлено 19.10.2010 23:45 Сообщение: 5
Fireball
0

Пункты: 1075
Регистрация: 16.02.2010
Собственно курение мануала решило последнюю проблему.
Суть заключается в том что в данном случае нельзя использовать локальные переменные.
Ссыль:
Мануал по Protosocket
Цитата
Because the protosocket library uses protothreads, local variables will not always be saved across a call to a protosocket library function. It is therefore advised that local variables are used with extreme care.


Так же решился и первый вопрос но достаточно неожиданным способом (экспериментальным). Передачу информации существенно ускоряет использование чтения из сокета после отправки пакета. То есть код:
Код

static int
handle_connection(struct hello_world_state *s)
{
int i = 0;
PSOCK_BEGIN(&s->p);
s->pack_length = 1000;
for (i = 0; i < s->pack_length; i++){
s->outputbuffer[i] = 'a' + i % 20;
}
s->outputbuffer[i] = 0;
resetloop();
while (checknextiteration()){
PSOCK_SEND_STR(&s->p, (char*)&(s->outputbuffer));
PSOCK_READTO(&s->p, 0);
incloop();
}
PSOCK_CLOSE(&s->p);
PSOCK_END(&s->p);
}


Работает НАМНОГО быстрее чем приведенный в первом сообщении.
Может кто-то подскажет с чем это связано?
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM