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

 
 
> 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
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 56)
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
scifi
сообщение May 19 2014, 08:54
Сообщение #16


Гуру
******

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



Цитата(doom13 @ May 19 2014, 16:57) *
Посоветуйте, что нового почитать, что-то в google ток эту нашёл.
Будет ли поддержка фрагментации в v1.3.2 (12.2009) или брать новую версию?

Можно попробовать почитать полуофициальный вики проекта. А поддерживается или нет - легко увидеть в исходниках: ищите макросы IP_FRAG и IP_REASSEMBLY.
Go to the top of the page
 
+Quote Post
doom13
сообщение May 19 2014, 09:19
Сообщение #17


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

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



Цитата(scifi @ May 19 2014, 16:04) *
Можно попробовать почитать полуофициальный вики проекта. А поддерживается или нет - легко увидеть в исходниках: ищите макросы IP_FRAG и IP_REASSEMBLY.

Спасибо, глянем.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение May 20 2014, 00:39
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



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

У вас UDP пакеты длиной 32КБ? Фрагментация касается разбиения отдельных пакетов, когда они не влезают в MTU. Если у вас пакеты небольшие, то без фрагментации всё будет прекрасно работать на любых потоках.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 20 2014, 00:46
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



проблема в том что макс пакет около 1500 байт, 1432 на данные. Даже если жумбо фрейм использовать и тогда 12 КБ край. Так что 32 КБайтные данные лучше самому порезать на порции и слать их. А учитывая что UDP не дает гарантии доставки, надо сверху еще протокольчик накинуть.
Go to the top of the page
 
+Quote Post
doom13
сообщение May 20 2014, 02:55
Сообщение #20


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

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



Цитата(andrewlekar @ May 20 2014, 07:49) *
У вас UDP пакеты длиной 32КБ? Фрагментация касается разбиения отдельных пакетов, когда они не влезают в MTU. Если у вас пакеты небольшие, то без фрагментации всё будет прекрасно работать на любых потоках.


32 kB это для примера, но точно больше 1500, одним ethernet-пакетом не пошлёшь.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 20 2014, 03:04
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А! ну у вас ошибка терминологии)

Если у вас есть большие данные и вы их разбиваете на пакеты UDP - это не входит в ТСР/IP уровень. Это вы делаете сами, как умеете, сами обеспечиваете контроль целостности и так далее...

Если у вас большие данные и вы их пихаете в сокет TCP, то это входит в TCP/IP уровень, стэк сам берет на себя задачу проверки того что данные дошли, что они пришли в нужном порядке, что они не повторились и так далее...

При этом UDP пакет может придти только весь разом, и он не может быть больше 1500 байт (поправьте если я ошибаюсь). ТСР может идти порциями в зависимости от размера окна и прочего. При этом есть такая неприятность как внутрипакетная фрагментация - фрагментация одного пакета, обычно всякие WiFi этим грешат. Когда ваш один большой пакет UDP (но не больше 1500 байт) режут на порции и шлют кусками, такую фрагментацию также отрабатывает стэк (начиная с какой то версии), и собирает ваш единый пакет отдает вам целиком. Но это не значит что вы ему суните 32 КБайт данных, а стэк все сделает сам. Это верно только в случае ТСP, в случае UDP это придется сделать самому руками, да еще следить чтобы пакеты пришли в правильном порядке и без повторений. Причем когда вы это сделает, вы получите ТСРsm.gif


Go to the top of the page
 
+Quote Post
doom13
сообщение May 20 2014, 03:34
Сообщение #22


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

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



Цитата(Golikov A. @ May 20 2014, 07:56) *
проблема в том что макс пакет около 1500 байт, 1432 на данные. Даже если жумбо фрейм использовать и тогда 12 КБ край. Так что 32 КБайтные данные лучше самому порезать на порции и слать их.

Как бы IP поддерживает фрагментацию, а максимальная длинна UDP примерно 2^16 = 65kB.

Цитата(Golikov A. @ May 20 2014, 07:56) *
А учитывая что UDP не дает гарантии доставки, надо сверху еще протокольчик накинуть.

Если протяжённость сети измеряется не километрами и пакет не проходит через тучу маршрутизаторов, то, не смотря на отсутствие гарантий доставки, всё нормально работает без потерь данных при длинне UDP-пакета 32 kB и скорости передачи 655 Mbit/s (поднимал тему, Вы участвовали в обсуждении).

Цитата(Golikov A. @ May 20 2014, 10:14) *
А! ну у вас ошибка терминологии)

Позвольте не согласиться, с терминологией всё в порядке.

Цитата(Golikov A. @ May 20 2014, 10:14) *
Если у вас есть большие данные и вы их разбиваете на пакеты UDP - это не входит в ТСР/IP уровень. Это вы делаете сами, как умеете, сами обеспечиваете контроль целостности и так далее...

Данные большие 32 kB, но я их не разбиваю на пакеты UDP, а посылаю одним UDP-пакетом. В шапке IP используются флаги для фрагментирования данного пакета. Это не TCP, а UDP, который является одним из поддерживаемых TCP/IP-стеком (lwIP) протоколов. Вопрос был в том, что UDP поддерживается стеком, но без поддержки фрагментации (It can send, receive and forward packets, but can not send or receive fragmented IP packets).

Цитата(Golikov A. @ May 20 2014, 10:14) *
Если у вас большие данные и вы их пихаете в сокет TCP, то это входит в TCP/IP уровень, стэк сам берет на себя задачу проверки того что данные дошли, что они пришли в нужном порядке, что они не повторились и так далее...

Для передачи данных, как написал, хочу использовать UDP, не TCP.

Цитата(Golikov A. @ May 20 2014, 10:14) *
При этом UDP пакет может придти только весь разом, и он не может быть больше 1500 байт (поправьте если я ошибаюсь). ТСР может идти порциями в зависимости от размера окна и прочего. При этом есть такая неприятность как внутрипакетная фрагментация - фрагментация одного пакета, обычно всякие WiFi этим грешат. Когда ваш один большой пакет UDP (но не больше 1500 байт) режут на порции и шлют кусками, такую фрагментацию также отрабатывает стэк (начиная с какой то версии), и собирает ваш единый пакет отдает вам целиком. Но это не значит что вы ему суните 32 КБайт данных, а стэк все сделает сам. Это верно только в случае ТСP, в случае UDP это придется сделать самому руками, да еще следить чтобы пакеты пришли в правильном порядке и без повторений. Причем когда вы это сделает, вы получите ТСР

UDP-пакет может быть длинной больше 1500 байт (длинна UDP ограничена размером поля "UDP length" в шапке UDP), это ethernet-пакет ограничен длинной порядка 1500 байт. TCP использовать пока не приходилось, вот думаю опробовать при использовании lwIP.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 20 2014, 03:39
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



странно это все для меня, ну если вы говорите.... Надо будет перечитать стандарт на досуге
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 3 2014, 09:18
Сообщение #24


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

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



В либе LwIP часто встречается термин PCB, если можно, поясните, что он означает?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 3 2014, 09:36
Сообщение #25


Гуру
******

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



Цитата(doom13 @ Jun 3 2014, 17:28) *
В либе LwIP часто встречается термин PCB, если можно, поясните, что он означает?

Protocol Control Block. Структура, содержащая всю информацию о состоянии данного соединения.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 3 2014, 09:40
Сообщение #26


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

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



Цитата(scifi @ Jun 3 2014, 16:46) *
Protocol Control Block. Структура, содержащая всю информацию о состоянии данного соединения.

Спасибо, а то что-то никак не мог подобрать соответствующую расшифровку
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 04:41
Сообщение #27


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

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



Нужна помощь, не могу понять, чего не хватает, чтобы udp пакет ушёл в сеть.

CODE
int main(void)
{
unsigned long ulUser0, ulUser1;
unsigned char pucMACArray[8];

ulUser0 = 0x00F263A8;
ulUser1 = 0x00800000;

pucMACArray[0] = ((ulUser0 >> 0) & 0xff);
pucMACArray[1] = ((ulUser0 >> 8) & 0xff);
pucMACArray[2] = ((ulUser0 >> 16) & 0xff);
pucMACArray[3] = ((ulUser1 >> 0) & 0xff);
pucMACArray[4] = ((ulUser1 >> 8) & 0xff);
pucMACArray[5] = ((ulUser1 >> 16) & 0xff);

unsigned long board_ip = 0xC0A80110;
unsigned long net_mask = 0xFFFFFF00;

lwIPInit(pucMACArray, board_ip, net_mask, 0, IPADDR_USE_STATIC);

struct udp_pcb *pcb;
pcb = udp_new();

struct ip_addr ip_rmt;

//udp_bind(pcb, (struct ip_addr *)&board_ip, 11000);
udp_bind(pcb, IP_ADDR_ANY, 11000);
udp_connect(pcb, &ip_rmt, 12000);


unsigned char buffer[128];
int i;
for(i = 0; i < 128; i++)
{
buffer[i] = i;
}

struct pbuf * pb;
pb = pbuf_alloc(PBUF_TRANSPORT, 128, PBUF_RAM);
memcpy(pb->payload, buffer, sizeof(buffer));

//udp_send(pcb, pb);
//udp_sendto(pcb, pb, &ip_rmt, 12000);
//pbuf_free(pb);

int tx_en = 0;

while(1)
{
if(tx_en)
{
udp_send(pcb, pb);
//udp_sendto(pcb, pb, &ip_rmt, 12000);
pbuf_free(pb);
tx_en = 0;
}
}
}


Сообщение отредактировал IgorKossak - Jun 4 2014, 14:02
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 4 2014, 05:41
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



как минимум надо дергать еще функции LwIP которые обрабатывают стэк. Вы пока создали сообщение и добавили его в очередь, а сам стэк не работает...

tcp_fasttmr();

и еще для прочей работы

tcp_slowtmr();
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 05:52
Сообщение #29


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

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



Цитата(Golikov A. @ Jun 4 2014, 12:51) *
как минимум надо дергать еще функции LwIP которые обрабатывают стэк. Вы пока создали сообщение и добавили его в очередь, а сам стэк не работает...

Почему не работает? Если пингануть плату - она ответит.

Цитата(Golikov A. @ Jun 4 2014, 12:51) *
tcp_fasttmr();
tcp_slowtmr();

Но это функции для работы по TCP протоколу, каким боком они к UDP?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 06:11
Сообщение #30


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 14:02) *
Почему не работает? Если пингануть плату - она ответит.

Что-то не видно, как кадры из Ethernet принимаются и обрабатываются. В обработчике прерывания что ли?
Кстати, есть ещё ARP. Он тоже может задерживать отправку пакетов, и там есть таймеры.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 06:16
Сообщение #31


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

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



Цитата(scifi @ Jun 4 2014, 13:21) *
Что-то не видно, как кадры из Ethernet принимаются и обрабатываются. В обработчике прерывания что ли?
Кстати, есть ещё ARP. Он тоже может задерживать отправку пакетов, и там есть таймеры.

Я пока отправку пытаюсь сделать, или Вы хотите сказать, что посылать данные без настройки приёма оно не будет?
ARP и ICMP начинают работать уже после
Код
lwIPInit(pucMACArray, board_ip, net_mask, 0, IPADDR_USE_STATIC);

и ничего более не требуют.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 06:47
Сообщение #32


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 14:26) *
Я пока отправку пытаюсь сделать, или Вы хотите сказать, что посылать данные без настройки приёма оно не будет?

Отправка без приёма работать не должна. Если только не сделаете заранее статическую таблицу ARP.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 06:56
Сообщение #33


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

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



Цитата(scifi @ Jun 4 2014, 13:57) *
Отправка без приёма работать не должна. Если только не сделаете заранее статическую таблицу ARP.

По идее должна работать, скоро проверим, похоже, нашёл проблему, udp_send ошибку выдаёт ERR_VAL.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 07:02
Сообщение #34


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 15:06) *
По идее должна работать

Интересно, как?
SEND: ARP REQUEST
RECEIVE: ARP RESPONSE
SEND: UDP
Если уберёте вторую строчку, то всё заглохнет.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 07:14
Сообщение #35


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

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



Цитата(scifi @ Jun 4 2014, 14:12) *

Мы наверное с Вами про разные отправку/приём говорим. Я про то, что UDP должен работать на передачу, вне зависимости от приёма (настроен обработчик принимаемых сообщений или нет). Вы про ARP, где должны быть реализованы и приём и передача, но арп начинает работать уже после инициализации LwIP, там да, должен работать и приём и передача, для UDP мне пока приёмник не нужен, только начинаю разбираться с либой, хочу передачу затестить.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 07:21
Сообщение #36


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 15:24) *
Вы про ARP, где должны быть реализованы и приём и передача, но арп начинает работать уже после инициализации LwIP, там да, должен работать и приём и передача, для UDP мне пока приёмник не нужен, только начинаю разбираться с либой, хочу передачу затестить.

То есть приём кадров Ethernet уже есть? Вот я и поинтересовался, где он. Потому что если он в обработчике прерывания, то это - бяка, так нельзя.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 08:13
Сообщение #37


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

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



Короче передача заработала, проблема была в том, что дефайн IP4_ADDR задаёт IP в обратном порядке следования байт, что и необходимо функциям LwIP, я задавал в прямом. Как итог библиотечная функция udp_sendto_if() при проверке IP выкидывала ошибку и ничего не отправляла.

CODE
....
.... // Инициализация LwIP
....

// UDP
struct udp_pcb *pcb;
pcb = udp_new();

unsigned short port_rmt, port_local;
struct ip_addr ip_rmt, ip_local;

IP4_ADDR(&ip_rmt, 192, 168, 1, 66);
IP4_ADDR(&ip_local, 192, 168, 1, 16);
port_rmt = 12000;
port_local = 11000;

udp_bind(pcb, &ip_local, port_local);
udp_connect(pcb, &ip_rmt, port_rmt);

unsigned char buffer[128];
int i;
for(i = 0; i < 128; i++)
{
buffer[i] = i;
}

struct pbuf * pb;
pb = pbuf_alloc(PBUF_TRANSPORT, 128, PBUF_RAM);
memcpy(pb->payload, buffer, sizeof(buffer));

int tx_en = 0;
err_t error = 55;

while(1)
{
if(tx_en)
{
error = udp_send(pcb, pb);
pbuf_free(pb);
tx_en = 0;
}
}


Цитата(scifi @ Jun 4 2014, 14:31) *
То есть приём кадров Ethernet уже есть? Вот я и поинтересовался, где он. Потому что если он в обработчике прерывания, то это - бяка, так нельзя.

Ну я так глубоко пока не копал, взял пример http сервера для моей платы, и пытаюсь передрать его под UDP, что потом и буду использовать, правда, уже на другой борде. Поэтому связку LwIP->драйвер PHY оставил на потом. Следующий шаг - это отправить UDP-пакет за несколько фрагментов.

Очередной вопрос, как отправить фрагментированный UDP пакет?

Сообщение отредактировал IgorKossak - Jun 4 2014, 14:02
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 10:44
Сообщение #38


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 16:23) *
Очередной вопрос, как отправить фрагментированный UDP пакет?

Что значит "фрагментированный"? Фрагментация на уровне IP должна работать автомагически.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 13:33
Сообщение #39


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

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



Цитата(scifi @ Jun 4 2014, 17:54) *
Что значит "фрагментированный"? Фрагментация на уровне IP должна работать автомагически.

Как бы да, это и имел ввиду. Когда флаги выставляются More Fragments, Last Fragment и поле Fragment offset.
Попробовал сделать так:
Код
    ..........
    ..........
    unsigned char buffer[4096];
    int i;
    for(i = 0; i < 4096; i++)
    {
        buffer[i] = i;
    }

    struct pbuf * pb;
    pb = pbuf_alloc(PBUF_TRANSPORT, 4096, PBUF_RAM);
    memcpy(pb->payload, buffer, sizeof(buffer));

    int tx_en = 0;

    while(1)
    {
        if(tx_en)
        {
            udp_send(pcb, pb);
            pbuf_free(pb);
            tx_en = 0;
        }
    }


т.е. передать данные длинной 4096 байт, в итоге отправилось три пакета, в сумме то, что надо - 4096 байт. Стек сам поделил на фрагменты, вроде как круто, но потом стал разбираться, оказалось в третьем фрагменте данные повторяют данные второго фрагмента, а флаги выставились неправильно, во втором фрагменте уже стоит Last Fragment, что не верно. Может либа старая или ещё что, примеры от Техаса используется LwIP v1.3.2?

Да, и поле Fragment Offset у второго и третьего фрагментов одинаковое.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 5 2014, 02:35
Сообщение #40


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

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



WireShark для некоторых пакетов, отправляемых LwIP, выдаёт ETHERNET FRAME CHECK SEQUENCE INCORRECT, например, для ответа на ARP запрос выдаёт эту месагу.
Кто такой этот ETHERNET FRAME CHECK SEQUENCE, который получился как 5A D2 36 08, а должен был быть 4F 8F 14 D1? Ведь ethernet CRC формируется MAC-контроллером и WireShark-ом я его, по идее, не вижу.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 5 2014, 03:48
Сообщение #41


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

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



Смотрю, что в ARP протоколе этих четырёх последних байт нету, зачем LwIP их добавляет?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 5 2014, 07:05
Сообщение #42


Гуру
******

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



ARP-кадр у вас вроде верный.
Не забыли, что пре передаче по Ethernet, кадр дополняется до некоей величины (не помню точно, 50 с чем-то байт, вроде 54 или 56) паддингом.
Вы его имеете в виду?

PS: пользуемся своим TCP/IP-стеком, ругани от WireShark на его кадры не замечал.
Хотя у нас только ARP, IP, ICMP, TCP. UDP - не используется.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 5 2014, 07:32
Сообщение #43


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

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



Цитата(jcxz @ Jun 5 2014, 14:15) *
ARP-кадр у вас вроде верный.
Не забыли, что пре передаче по Ethernet, кадр дополняется до некоей величины (не помню точно, 50 с чем-то байт, вроде 54 или 56) паддингом.
Вы его имеете в виду?

Да. Так вот, на втором скриншоте ARP RESPONSE от нашего сервака (в конце данные ARP добиты нулями, как и должно быть), на первом - ответ от платы с LwIP (посылка больше на 4 байта и они какой-то ерундой забиты). Если кто может проверить, посмотрите плиз, как у Вас отвечает на ARP запросы. Просто интересно, это баг LwIP v1.3.2 или техасовцы cо своими примерами где-то прокололись. Пока поставил заглушку, для ответа на ARP, уменьшаю длину пакета на 4 байта.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 10 2014, 04:47
Сообщение #44


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

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



Приветствую.
Разбирался с работой LwIP на плате с Cortex-M3, всё было good. Счас пробую переделать проект для ARM9 (TI - AM1808) и компилятор не хочет кушать __attribute__ ((__packed__)), который используется для всех структур в LwIP. Без него всё компилится и даже работает (на плате с M3).
Можно ли использовать LwIP с #define PACK_STRUCT_STRUCT вместо #define PACK_STRUCT_STRUCT __attribute__ ((__packed__)), во что это может вылится?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 10 2014, 04:54
Сообщение #45


Гуру
******

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



Цитата(doom13 @ Jun 10 2014, 12:57) *
Можно ли использовать LwIP с #define PACK_STRUCT_STRUCT вместо #define PACK_STRUCT_STRUCT __attribute__ ((__packed__)), во что это может вылится?

Надо наладить упаковку структур, иначе работать не будет.
У меня, к примеру, сделано так:
в файле cc.h:
Код
...
/* Compiler hints for packing structures */
#define PACK_STRUCT_USE_INCLUDES
#define PACK_STRUCT_FIELD(x) x
#define PACK_STRUCT_STRUCT
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_END
...

в файле bpstruct.h:
Код
#pragma pack(push,1)

в файле epstruct.h:
Код
#pragma pack(pop)
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 10 2014, 07:28
Сообщение #46


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

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



Цитата(scifi @ Jun 10 2014, 12:04) *

Спасибо, то что надо.
Странно только, что техасовское условие выполняется:
Код
#if (__TI_COMPILER_VERSION__ >= 5000000)
    #define PACK_STRUCT_BEGIN
    #define PACK_STRUCT_STRUCT __attribute__ ((__packed__))
    #define PACK_STRUCT_END
    #define PACK_STRUCT_FIELD(x) x
#endif

__TI_COMPILER_VERSION__ = 5001001, а компилер выдаёт ошибку.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 11 2014, 03:11
Сообщение #47


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

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



Возник вопрос, получится ли использовать LwIP и AM1808 (ARM926EJ-S) у которого 128 кБ On-Chip RAM? Сколько должна весить сама либа? Пока линкер выдаёт ошибки - program will not fit into available memory. В техасовских примерах для этого процессора используется внешняя DDR2-память, может ли это означать, что без неё не обойтись и 128 кБ памяти мало для использования LwIP?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 11 2014, 04:53
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



LwIP можно утоптать в работу на аж на 2 КБайтах РАМ, Она для того и сделана чтобы работать на супер маленьких AVR. Другое дело что она сможет на такой памяти потянуть... Больше вопрос в том сколько flash она сожрет
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 11 2014, 05:32
Сообщение #49


Гуру
******

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



Цитата(doom13 @ Jun 11 2014, 11:21) *
Возник вопрос, получится ли использовать LwIP и AM1808 (ARM926EJ-S) у которого 128 кБ On-Chip RAM? Сколько должна весить сама либа?

У мну lwip занимает 21К байт памяти программ (Cortex-M3). Это Raw API, no OS. Полное приложение занимает 85К байт памяти программ. Это не считая константы, а их много: все веб-страницы там же. Приложение содержит много функционала. По моему опыту, 32К байт оперативной памяти для буферов lwip - это оч. комфортный объём, с которым веб интерфейс летатает. Наверняка и с 16К тоже будет летать.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 11 2014, 05:54
Сообщение #50


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

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



Цитата(Golikov A. @ Jun 11 2014, 12:03) *
LwIP можно утоптать в работу на аж на 2 КБайтах РАМ, Она для того и сделана чтобы работать на супер маленьких AVR. Другое дело что она сможет на такой памяти потянуть... Больше вопрос в том сколько flash она сожрет

Flash-а на этом проце нету, т.е. надо всё в RAM утоптать, вот и вопрос, сколько же код всех функций и прочего LwIP скушает?


Цитата(scifi @ Jun 11 2014, 12:42) *
У мну lwip занимает 21К байт памяти программ (Cortex-M3). Это Raw API, no OS. Полное приложение занимает 85К байт памяти программ. Это не считая константы, а их много: все веб-страницы там же. Приложение содержит много функционала. По моему опыту, 32К байт оперативной памяти для буферов lwip - это оч. комфортный объём, с которым веб интерфейс летатает. Наверняка и с 16К тоже будет летать.

Вот и у меня на плате с Cortex-M3 вместе с проектом переработанным из примера Техаса под Cortex-M3 весь код прошивки уместился в 38 кБ. Попытка прикрутить LwIP к ARM9 (так же на основе примера Техаса, но для ARM9) не проходит, после комента кучи функций код занимает порядка 90 кБ, а если оставить как есть, то и в 128 кБ не помещается. Что-то, наверное, для либы можно оптимизировать?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 11 2014, 05:57
Сообщение #51


Гуру
******

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



Цитата(doom13 @ Jun 11 2014, 14:04) *
Попытка прикрутить LwIP к ARM9 (так же на основе примера Техаса, но для ARM9) не проходит, после комента кучи функций код занимает порядка 90 кБ...

Для начала надо включить режим THUMB.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 11 2014, 05:59
Сообщение #52


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

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



Цитата(scifi @ Jun 11 2014, 13:07) *
Для начала надо включить режим THUMB.

Тут расскажите пожалуйста по-подробней.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 11 2014, 06:17
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



по РАМ режут количество сокетов и их размеры для UDP и TCP
по размеру библиотеки думаю очень должно помочь срезать весь дебаг, он там обширный и через printf, а эта библиотечка много кушает...
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 11 2014, 06:26
Сообщение #54


Гуру
******

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



Цитата(scifi @ Jun 11 2014, 14:07) *
Для начала надо включить режим THUMB.

Википедия в помощь.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 11 2014, 06:42
Сообщение #55


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

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



Цитата(scifi @ Jun 11 2014, 13:36) *

Это я уже посмотрел. Как мне его включить или посмотреть включён ли он в моём проекте?

Цитата(Golikov A. @ Jun 11 2014, 13:27) *
по РАМ режут количество сокетов и их размеры для UDP и TCP
по размеру библиотеки думаю очень должно помочь срезать весь дебаг, он там обширный и через printf, а эта библиотечка много кушает...

Дебаг, если правильно понимаю, выключен
Код
#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_OFF

, сокеты так же
Код
#define LWIP_SOCKET                     0
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 11 2014, 09:25
Сообщение #56


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

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



Цитата(scifi @ Jun 11 2014, 13:07) *
Для начала надо включить режим THUMB.

Прямо в точку, спасибо. Нашёл в опциях CCS как включить режим Thumb, размер прошивки реально уменьшился до 40 кБ, в проекте под Cortex-M3 эта опция и была установлена.
Нормально ли использовать ARM в этом режиме? На что это повлияет?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 11 2014, 09:29
Сообщение #57


Гуру
******

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



Цитата(doom13 @ Jun 11 2014, 17:35) *
Нормально ли использовать ARM в этом режиме? На что это повлияет?

THUMB исполняется немного медленнее, чем эквивалентный код в режиме ARM. Это при условии, что память не тормозит, а в случае on-chip RAM обычно так и есть.
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 Текстовая версия Сейчас: 29th July 2025 - 13:56
Рейтинг@Mail.ru


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