js_slider 0 29 апреля, 2014 Опубликовано 29 апреля, 2014 (изменено) · Жалоба Здравствуйте. Сделал на 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 в данном случае чтобы не порушить стек? Кто сталкивался? Изменено 29 апреля, 2014 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 29 апреля, 2014 Опубликовано 29 апреля, 2014 · Жалоба Но вот возникла необходимость посылать данные не по запросу, а по событию - по приходу строба на ножку. Делал ссылку на pcb во время коннекта клиента, и отправлял данные вне callback... Надеюсь, не из обработчика прерывания вызываете функции lwip. Потому что это отличный способ завалить программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
js_slider 0 29 апреля, 2014 Опубликовано 29 апреля, 2014 · Жалоба Надеюсь, не из обработчика прерывания вызываете функции lwip. Потому что это отличный способ завалить программу. Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 29 апреля, 2014 Опубликовано 29 апреля, 2014 · Жалоба Из него родимого... из прерывания... а можете пояснить почему это отличный способ завалить программу??? какая разница из обработчика прерывания вызывать или еще откуда в программе... если так и так не callback? Элементарно. Предположим, программа зашла в tcp_write() из callback, меняет переменные, выделяет и освобождает память, пишет в буферы. И тут - БАЦ! - прерывание, и обработчик прерывания тоже заходит в tcp_write(), лезет в те же переменные и т.д. Так нельзя, всё сразу упадёт. Надо посылать в главный цикл сигнал из прерывания (через переменную volatile), и уже в главном цикле слать данные через TCP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 29 апреля, 2014 Опубликовано 29 апреля, 2014 · Жалоба Из него ...какая разница из обработчика прерывания вызывать или еще откуда в программе.... выше уже мысль прозвучала конечно-же... почаще ставте себя на место микроконтроллера или процессора. многое станет понятным... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 30 апреля, 2014 Опубликовано 30 апреля, 2014 · Жалоба почаще ставте себя на место микроконтроллера или процессора. многое станет понятным... Типа "Criminal Minds", а точнее "Silicon Minds"? ;) SCNR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
js_slider 0 3 мая, 2014 Опубликовано 3 мая, 2014 · Жалоба Благодарю всех откликнувшихся. Проблема решена. Действительно стек падал из-за вызовов tcp_write из прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TriAlexAnt 0 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба Если можно, хочу задать вопрос в развитие данной темы. Я тоже планирую использовать TCP/IP сервер c использованием lwip стека без OS. Хочу на нем организовать рассылку данных в формате JSON по нескольким IP адресам (без запроса со стороны клиента). Хотя бы в общих чертах, как это можно сделать? Во всех примерах, что я смотрел, всегда присутствует запрос от клиента. А мне нужно стартануть передачу самому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба Хотя бы в общих чертах, как это можно сделать? Во всех примерах, что я смотрел, всегда присутствует запрос от клиента. А мне нужно стартануть передачу самому. HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч. Если соединение уже установлено, то есть всякие извращенные способы посылать по нему асинхронные посылки от сервера к клиенту: тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TriAlexAnt 0 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч. Если соединение уже установлено, то есть всякие извращенные способы посылать по нему асинхронные посылки от сервера к клиенту: тут. А если на другой стороне висит тоже WEB-сервер? То есть каким-то образом нужно имитировать работу браузера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба А если на другой стороне висит тоже WEB-сервер? То есть каким-то образом нужно имитировать работу браузера? Вы лучше обрисуйте задачу поподробнее. Потому что "рассылать JSON по нескольким адресам" - само по себе довольно сомнительное занятие, поэтому и посоветовать особо нечего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 7 мая, 2014 Опубликовано 7 мая, 2014 · Жалоба HTTP не предусматривает возможности установления соединения по инициативе сервера. Это чаще всего и невозможно из-за всяких NAT, firewall и проч. Возможно автору нужно не http, а простой tcp/ip-коннект (сокет). Если на той стороне есть tcp-порт открытый в listen-режиме, то конечно на него можно установить активное соединение. Автору нужно почитать про TCP/IP-стек и как он работает чтобы понять, что ему нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 19 мая, 2014 Опубликовано 19 мая, 2014 · Жалоба Хочу к своему проекту прикрутить либу LWIP, пока читаю доку и нахожу: It can send, receive and forward packets, but can not send or receive fragmented IP packets. Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 19 мая, 2014 Опубликовано 19 мая, 2014 · Жалоба Данная либа не позволяет послать фрагментированный UDP длинной 32 kB?!! Это сильно устаревшая информация. Там давно уже добавлено "IP layer fragmentation and reassembly". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 19 мая, 2014 Опубликовано 19 мая, 2014 · Жалоба Это сильно устаревшая информация. Там давно уже добавлено "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) или брать новую версию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться