Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sam9xe lwip
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
taoga
Здравствуйте!

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

Нажмите для просмотра прикрепленного файла

Как сделать, что-бы на запрос началась непрерывная передача данных? Как правильно использовать tcp_write не из callback функций, т.е. чтобы контроллер выступал инициатором передачи данных?
skripach
Цитата
В примерах веб, фтп серверов или как в этом примере:

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

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

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

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

Забыл написать, для ПК есть такой код.
scifi
Цитата(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);".
taoga
Цитата(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 запрос.
Посмотрите, пожалуйста, что не так.
Нажмите для просмотра прикрепленного файла

Еще есть вопрос: Без FreeRTOS нужно было заботиться о вызове обработчиков таймеров из lwip. Во FreeRTOS все привязано к прерыванию от EMAC, инициализируется только один arp таймер, это правильно или еще что-то нужно?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.