|
sam9xe lwip |
|
|
|
Aug 27 2011, 11:30
|
Участник

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

|
Здравствуйте! Почти все примеры для TCP из lwIP используют методику запрос/ответ, т.е. на запрос с ПК возвращается порция данных. В примерах веб, фтп серверов или как в этом примере:
tcpecho_raw.rar ( 3.58 килобайт )
Кол-во скачиваний: 121Как сделать, что-бы на запрос началась непрерывная передача данных? Как правильно использовать tcp_write не из callback функций, т.е. чтобы контроллер выступал инициатором передачи данных?
|
|
|
|
|
 |
Ответов
|
Aug 27 2011, 12:24
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата В примерах веб, фтп серверов или как в этом примере: Цитата чтобы контроллер выступал инициатором передачи данных? Может контроллер должен быть клиентом, а не сервером.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Aug 27 2011, 18:10
|
Участник

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

|
Цитата(skripach @ Aug 27 2011, 16:24)  Может контроллер должен быть клиентом, а не сервером.  Может и так, но нужно, чтобы контроллер был сервером. Написать код клиента или сервера, которые будут асинхронно передавать друг другу данные не проблема. Такой код у меня есть. Я попытался написать код, который посылает данные из обработчика tcp_sent(), но похоже этот обработчик вызывается 4 раза в секунду, скорость передачи соответственно очень медленная. Попробовал передавать данные из основного цикла программы с помощью tcp_write(), tcp_output(), передача тоже очень медленная и через несколько секунд соединение закрывается. Поэтому у меня и возник вопрос. Очень мало примеров и информации. Кто-то же передавал данные со скоростью 60 - 80 Мбит? Цитата(taoga @ Aug 27 2011, 22:08)  Может и так, но нужно, чтобы контроллер был сервером. Написать код клиента или сервера, которые будут асинхронно передавать друг другу данные не проблема. Такой код у меня есть. Забыл написать, для ПК есть такой код.
|
|
|
|
|
Aug 28 2011, 18:54
|
Гуру
     
Группа: Свой
Сообщений: 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);".
|
|
|
|
|
Sep 2 2011, 08:16
|
Участник

Группа: Участник
Сообщений: 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 таймер, это правильно или еще что-то нужно?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|