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

 
 
> sam9xe lwip
taoga
сообщение Aug 27 2011, 11:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809



Здравствуйте!

Почти все примеры для TCP из lwIP используют методику запрос/ответ, т.е. на запрос с ПК возвращается порция данных. В примерах веб, фтп серверов или как в этом примере:

Прикрепленный файл  tcpecho_raw.rar ( 3.58 килобайт ) Кол-во скачиваний: 121


Как сделать, что-бы на запрос началась непрерывная передача данных? Как правильно использовать tcp_write не из callback функций, т.е. чтобы контроллер выступал инициатором передачи данных?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
skripach
сообщение Aug 27 2011, 12:24
Сообщение #2


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
В примерах веб, фтп серверов или как в этом примере:

Цитата
чтобы контроллер выступал инициатором передачи данных?

Может контроллер должен быть клиентом, а не сервером. wink.gif


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
taoga
сообщение Aug 27 2011, 18:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809



Цитата(skripach @ Aug 27 2011, 16:24) *
Может контроллер должен быть клиентом, а не сервером. wink.gif

Может и так, но нужно, чтобы контроллер был сервером. Написать код клиента или сервера, которые будут асинхронно передавать друг другу данные не проблема. Такой код у меня есть.
Я попытался написать код, который посылает данные из обработчика tcp_sent(), но похоже этот обработчик вызывается 4 раза в секунду, скорость передачи соответственно очень медленная.
Попробовал передавать данные из основного цикла программы с помощью tcp_write(), tcp_output(), передача тоже очень медленная и через несколько секунд соединение закрывается.
Поэтому у меня и возник вопрос. Очень мало примеров и информации. Кто-то же передавал данные со скоростью 60 - 80 Мбит?

Цитата(taoga @ Aug 27 2011, 22:08) *
Может и так, но нужно, чтобы контроллер был сервером. Написать код клиента или сервера, которые будут асинхронно передавать друг другу данные не проблема. Такой код у меня есть.

Забыл написать, для ПК есть такой код.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 28 2011, 18:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(taoga @ Aug 27 2011, 22:10) *
Я попытался написать код, который посылает данные из обработчика tcp_sent(), но похоже этот обработчик вызывается 4 раза в секунду, скорость передачи соответственно очень медленная.

Для непрерывной передачи вроде бы и нужно из tcp_sent() посылать. Для достижения высокой скорости передачи должен быть достаточного размера TCP_SND_BUF и, возможно, размеры иных буферов, участвующих в передаче. Там много настроек, и очень легко выделить память не туда, где она действительно нужна. Полезно включить статистику и попытаться понять, есть ли где-либо нехватка памяти. Также надо посылать помногу, вплоть до того момента, пока tcp_write() не перестанет возвращать ERR_OK. В общем, стараться держать буфер передачи заполненным.

Цитата(taoga @ Aug 27 2011, 22:10) *
Очень мало примеров и информации.

Да, есть такая особенность у lwip. Стек бесплатный, "вы получаете то, за что заплатили". Опираясь на свой опыт, могу предположить, что для использования lwip в своих проектах народ просто становится экспертами по lwip, а эксперту сторонняя помощь уже не нужна. Ну а потом отвечать на чужие вопросы просто времени нет. Но вообще есть англоязычные списки рассылки на домашней странице проекта. В этих списках на вопросы отвечают. Можно даже пошерстить их архивы: Ваша проблема не экзотическая, её неоднократно решали.

Update:
Да, забыл, для быстрой передачи нужно отключить Nagle Algorithm. То есть после установления соединения сделать "tcp_nagle_disable(pcb);".
Go to the top of the page
 
+Quote Post
taoga
сообщение Sep 2 2011, 08:16
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809



Цитата(scifi @ Aug 28 2011, 22:54) *
Да, есть такая особенность у lwip. Стек бесплатный, "вы получаете то, за что заплатили". Опираясь на свой опыт, могу предположить, что для использования lwip в своих проектах народ просто становится экспертами по lwip, а эксперту сторонняя помощь уже не нужна. Ну а потом отвечать на чужие вопросы просто времени нет. Но вообще есть англоязычные списки рассылки на домашней странице проекта. В этих списках на вопросы отвечают. Можно даже пошерстить их архивы: Ваша проблема не экзотическая, её неоднократно решали.


Без FreeRtos собрал работающие проекты с lwip 1.3.1, 1.4.0.

Как я понял, чтобы использовать сокеты lwip, необходимы мьютексы, семафоры, потоки, поэтому попытался прикрутить lwip к FreeRTOS.
Собрал кучу мусора из примеров FreeRTOS, IAR: проект с lwip 1.1.0 freertos с модифицированными emac драйвером и ethernetif для lwip.
Пакеты принимаются, но нет ответа на ping. После передачи первого пакета от МК больше ничего не передается. Иногда от МК проходит ответ на ARP запрос.
Посмотрите, пожалуйста, что не так.
Прикрепленный файл  sam9xe_iar6_lwip_freertos.rar ( 4.17 мегабайт ) Кол-во скачиваний: 113


Еще есть вопрос: Без FreeRTOS нужно было заботиться о вызове обработчиков таймеров из lwip. Во FreeRTOS все привязано к прерыванию от EMAC, инициализируется только один arp таймер, это правильно или еще что-то нужно?
Go to the top of the page
 
+Quote Post

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

 


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


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