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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> LWIP Как послать данные (tcp_write) по событию?
js_slider
сообщение Apr 29 2014, 09:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 22-12-05
Пользователь №: 12 577



Здравствуйте.
Сделал на 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 - Apr 29 2014, 11:34
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 29 2014, 10:44
Сообщение #2


Гуру
******

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



Цитата(js_slider @ Apr 29 2014, 13:49) *
Но вот возникла необходимость посылать данные не по запросу, а по событию - по приходу строба на ножку.
Делал ссылку на pcb во время коннекта клиента, и отправлял данные вне callback...

Надеюсь, не из обработчика прерывания вызываете функции lwip. Потому что это отличный способ завалить программу.
Go to the top of the page
 
+Quote Post
js_slider
сообщение Apr 29 2014, 11:53
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 22-12-05
Пользователь №: 12 577



Цитата(scifi @ Apr 29 2014, 13:44) *
Надеюсь, не из обработчика прерывания вызываете функции lwip. Потому что это отличный способ завалить программу.


Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 29 2014, 12:51
Сообщение #4


Гуру
******

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



Цитата(js_slider @ Apr 29 2014, 15:53) *
Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback?

Элементарно. Предположим, программа зашла в tcp_write() из callback, меняет переменные, выделяет и освобождает память, пишет в буферы. И тут - БАЦ! - прерывание, и обработчик прерывания тоже заходит в tcp_write(), лезет в те же переменные и т.д. Так нельзя, всё сразу упадёт. Надо посылать в главный цикл сигнал из прерывания (через переменную volatile), и уже в главном цикле слать данные через TCP.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 29 2014, 19:46
Сообщение #5


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(js_slider @ Apr 29 2014, 15:53) *
Из него ...какая разница из обработчика прерывания вызывать или еще откуда в программе....


выше уже мысль прозвучала конечно-же...
почаще ставте себя на место микроконтроллера или процессора. многое станет понятным...
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 30 2014, 10:14
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(kolobok0 @ Apr 29 2014, 20:46) *
почаще ставте себя на место микроконтроллера или процессора. многое станет понятным...

Типа "Criminal Minds", а точнее "Silicon Minds"? wink.gif

SCNR.
Go to the top of the page
 
+Quote Post
js_slider
сообщение May 3 2014, 16:58
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 22-12-05
Пользователь №: 12 577



Благодарю всех откликнувшихся. Проблема решена. Действительно стек падал из-за вызовов tcp_write из прерывания.
Go to the top of the page
 
+Quote Post
TriAlexAnt
сообщение May 7 2014, 12:26
Сообщение #8





Группа: Новичок
Сообщений: 2
Регистрация: 27-03-13
Пользователь №: 76 235



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

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

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

Хотя бы в общих чертах, как это можно сделать? Во всех примерах, что я смотрел, всегда присутствует запрос от клиента. А мне нужно стартануть передачу самому.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 7 2014, 13:50
Сообщение #9


Гуру
******

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



Цитата(TriAlexAnt @ May 7 2014, 16:26) *
Хотя бы в общих чертах, как это можно сделать? Во всех примерах, что я смотрел, всегда присутствует запрос от клиента. А мне нужно стартануть передачу самому.

HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч.
Если соединение уже установлено, то есть всякие извращенные способы посылать по нему асинхронные посылки от сервера к клиенту: тут.
Go to the top of the page
 
+Quote Post
TriAlexAnt
сообщение May 7 2014, 14:04
Сообщение #10





Группа: Новичок
Сообщений: 2
Регистрация: 27-03-13
Пользователь №: 76 235



Цитата(scifi @ May 7 2014, 16:50) *
HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч.
Если соединение уже установлено, то есть всякие извращенные способы посылать по нему асинхронные посылки от сервера к клиенту: тут.


А если на другой стороне висит тоже WEB-сервер? То есть каким-то образом нужно имитировать работу браузера?
Go to the top of the page
 
+Quote Post
scifi
сообщение May 7 2014, 14:22
Сообщение #11


Гуру
******

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



Цитата(TriAlexAnt @ May 7 2014, 18:04) *
А если на другой стороне висит тоже WEB-сервер? То есть каким-то образом нужно имитировать работу браузера?

Вы лучше обрисуйте задачу поподробнее. Потому что "рассылать JSON по нескольким адресам" - само по себе довольно сомнительное занятие, поэтому и посоветовать особо нечего.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 7 2014, 15:26
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ May 7 2014, 19:50) *
HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч.

Возможно автору нужно не http, а простой tcp/ip-коннект (сокет).
Если на той стороне есть tcp-порт открытый в listen-режиме, то конечно на него можно установить активное соединение.
Автору нужно почитать про TCP/IP-стек и как он работает чтобы понять, что ему нужно.
Go to the top of the page
 
+Quote Post
doom13
сообщение May 19 2014, 08:09
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Хочу к своему проекту прикрутить либу LWIP, пока читаю доку и нахожу:
Цитата
It can send, receive and forward packets, but can not send or receive fragmented IP packets.

Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!!
Go to the top of the page
 
+Quote Post
scifi
сообщение May 19 2014, 08:40
Сообщение #14


Гуру
******

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



Цитата(doom13 @ May 19 2014, 16:19) *
Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!!

Это сильно устаревшая информация. Там давно уже добавлено "IP layer fragmentation and reassembly".
Go to the top of the page
 
+Quote Post
doom13
сообщение May 19 2014, 08:47
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(scifi @ May 19 2014, 15:50) *
Это сильно устаревшая информация. Там давно уже добавлено "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) или брать новую версию?
Go to the top of the page
 
+Quote Post

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

 


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


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