Перейти к содержанию
    

LWIP Как послать данные (tcp_write) по событию?

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

Сделал на STM32F4 TCP/IP сервер c использованием lwip стека без OS.

Все работает замечательно по типу запрос-ответ. Ответ процедурой tcp_write реализован как и требуется из callback.

Но вот возникла необходимость посылать данные не по запросу, а по событию - по приходу строба на ножку.

Делал ссылку на pcb во время коннекта клиента, и отправлял данные вне callback...

 

struct tcp_pcb *Globalpcb;
....
Globalpcb=pcb;
....

if(Globalpcb != NULL)
{
COUNT_TX=tcp_sndbuf(Globalpcb);
if(COUNT_TX > Len)
{
err = tcp_write(Globalpcb, Data, Len, 1);
tcp_output(Globalpcb);
}
}

все работает..., но не долго - периодически стек падает.

 

Вопрос как гармотно использовать tcp_write в данном случае чтобы не порушить стек? Кто сталкивался?

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но вот возникла необходимость посылать данные не по запросу, а по событию - по приходу строба на ножку.

Делал ссылку на pcb во время коннекта клиента, и отправлял данные вне callback...

Надеюсь, не из обработчика прерывания вызываете функции lwip. Потому что это отличный способ завалить программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надеюсь, не из обработчика прерывания вызываете функции lwip. Потому что это отличный способ завалить программу.

 

Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback?

Элементарно. Предположим, программа зашла в tcp_write() из callback, меняет переменные, выделяет и освобождает память, пишет в буферы. И тут - БАЦ! - прерывание, и обработчик прерывания тоже заходит в tcp_write(), лезет в те же переменные и т.д. Так нельзя, всё сразу упадёт. Надо посылать в главный цикл сигнал из прерывания (через переменную volatile), и уже в главном цикле слать данные через TCP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из него ...какая разница из обработчика прерывания вызывать или еще откуда в программе....

 

выше уже мысль прозвучала конечно-же...

почаще ставте себя на место микроконтроллера или процессора. многое станет понятным...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почаще ставте себя на место микроконтроллера или процессора. многое станет понятным...

Типа "Criminal Minds", а точнее "Silicon Minds"? ;)

 

SCNR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарю всех откликнувшихся. Проблема решена. Действительно стек падал из-за вызовов tcp_write из прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если можно, хочу задать вопрос в развитие данной темы.

 

Я тоже планирую использовать TCP/IP сервер c использованием lwip стека без OS.

 

Хочу на нем организовать рассылку данных в формате JSON по нескольким IP адресам (без запроса со стороны клиента).

 

Хотя бы в общих чертах, как это можно сделать? Во всех примерах, что я смотрел, всегда присутствует запрос от клиента. А мне нужно стартануть передачу самому.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотя бы в общих чертах, как это можно сделать? Во всех примерах, что я смотрел, всегда присутствует запрос от клиента. А мне нужно стартануть передачу самому.

HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч.

Если соединение уже установлено, то есть всякие извращенные способы посылать по нему асинхронные посылки от сервера к клиенту: тут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч.

Если соединение уже установлено, то есть всякие извращенные способы посылать по нему асинхронные посылки от сервера к клиенту: тут.

 

А если на другой стороне висит тоже WEB-сервер? То есть каким-то образом нужно имитировать работу браузера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если на другой стороне висит тоже WEB-сервер? То есть каким-то образом нужно имитировать работу браузера?

Вы лучше обрисуйте задачу поподробнее. Потому что "рассылать JSON по нескольким адресам" - само по себе довольно сомнительное занятие, поэтому и посоветовать особо нечего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч.

Возможно автору нужно не http, а простой tcp/ip-коннект (сокет).

Если на той стороне есть tcp-порт открытый в listen-режиме, то конечно на него можно установить активное соединение.

Автору нужно почитать про TCP/IP-стек и как он работает чтобы понять, что ему нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу к своему проекту прикрутить либу LWIP, пока читаю доку и нахожу:

It can send, receive and forward packets, but can not send or receive fragmented IP packets.

Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!!

Это сильно устаревшая информация. Там давно уже добавлено "IP layer fragmentation and reassembly".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это сильно устаревшая информация. Там давно уже добавлено "IP layer fragmentation and reassembly".

Читаю доку "Design and Implementation of the lwIP TCP/IP Stack" за 20.02.2001, и использовать хотел lwip v1.3.2 (она в техасовских примерах есть).

Посоветуйте, что нового почитать, что-то в google ток эту нашёл.

Будет ли поддержка фрагментации в v1.3.2 (12.2009) или брать новую версию?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...