Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 0
Регистрация: 12.11.2018
Сообщений: 511

Передача данных LWIP

03.08.2021, 10:27. Показов 1275. Ответов 0

Студворк — интернет-сервис помощи студентам
При передаче относительно большого объема данных по LWIP мк зависает. Если передавать меньший объем данных, то все нормально, как только перехожу определенный порог так все, зависает с концами. Сделал отладку FreeRTOS, там все в целом нормально по стеку, да и в ОС загруженность задач не меняется от размера передаваемой информации.
defaultTask X 3 1889 1
IDLE R 0 108 4
myEthTask B 3 103 3
LinkThr B 2 227 8
tcpip_thread B 3 1921 6
EthIf B 6 282 7
Tmr Svc B 2 224 5
myDataRecvTask B 4 2013 2
На задачи ОС (defaultTask и myDataRecvTask) выделил по 2048 слов.
Функция передачи по LWIP такая:
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
PAGE_BODY[0] = 0;
sprintf(PAGE_BODY,"%s%s%s%s%d\r\n%s",PAGE_HEADER_200_OK,PAGE_HEADER_SERVER,PAGE_HEADER_CONTENT_STREAM,PAGE_HEADER_LEN,(64*DataSize*2),PAGE_HEADER_BYTES);
len = strlen(PAGE_BODY);
 
netconn_write(conn, PAGE_BODY, strlen((char*)PAGE_BODY), NETCONN_COPY | NETCONN_MORE);
 
    MallocBuff = (uint8_t*) malloc(DataSize*2);
 
    for(uint8_t i = 0; i < 64; i++)
    {
        if(i < 63)
        {
            for(uint8_t j = 0; j < DataSize; j++)
            {
                MallocBuff[j * 2] = (StackBuff[i][j]);
                MallocBuff[j * 2 + 1] = (StackBuff[i][j]>>8);
            }
            netconn_write(conn, MallocBuff, (DataSize*2), NETCONN_COPY | NETCONN_MORE);
        }
        else
        {
            for(uint8_t j = 0; j < DataSize; j++)
            {
                MallocBuff[j * 2] = (StackBuff[i][j]);
                MallocBuff[j * 2 + 1] = (StackBuff[i][j]>>8);
            }
            netconn_write(conn, MallocBuff, (DataSize*2), NETCONN_COPY);
            free(MallocBuff);
        }
    }

Создается динамический массив размером DataSize*2, который отпвляется 64 раза. 64 раза потому что массив StackBuff, откуда берутся даные, это двумерный массив, в котором 64 строки. Таким образом весь массив передается по одной строке.
Проблема возникает когда размер DataSize превышает значение примерно 250. Т.е. 200 значений передаются нормально, при 300 уже все зависнет точно, да и при 250 тоже.
В чем проблема, не могу понять. До момента передачи данных все нормально. Если ничего не передавать, просто создавать динамический массив, то мк будет работать дальше, не зависать. Исходя из этого делаю вывод, что проблем либо в LWIP, либо в принимающей сторне. Но данные принимаются в браузер, там сервер на js.
Настройки LWIP:
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* STM32CubeMX Specific Parameters (not defined in opt.h) ---------------------*/
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/
/*----- WITH_RTOS enabled (Since FREERTOS is set) -----*/
#define WITH_RTOS 1
/*----- CHECKSUM_BY_HARDWARE enabled -----*/
#define CHECKSUM_BY_HARDWARE 1
/*-----------------------------------------------------------------------------*/
 
/* LwIP Stack Parameters (modified compared to initialization value in opt.h) -*/
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/
/*----- Default Value for LWIP_DNS: 0 ---*/
#define LWIP_DNS 1
/*----- Default Value for MEMP_NUM_TCP_PCB: 5 ---*/
#define MEMP_NUM_TCP_PCB 8
/*----- Value in opt.h for MEM_ALIGNMENT: 1 -----*/
#define MEM_ALIGNMENT 4
/*----- Default Value for MEM_SIZE: 1600 ---*/
#define MEM_SIZE 5120
/*----- Default Value for MEMP_NUM_SYS_TIMEOUT: 4 ---*/
#define MEMP_NUM_SYS_TIMEOUT 16
/*----- Default Value for MEMP_NUM_NETBUF: 2 ---*/
#define MEMP_NUM_NETBUF 16
/*----- Default Value for MEMP_NUM_NETCONN: 4 ---*/
#define MEMP_NUM_NETCONN 16
/*----- Default Value for PBUF_POOL_BUFSIZE: 592 ---*/
#define PBUF_POOL_BUFSIZE 1460
/*----- Value in opt.h for LWIP_ETHERNET: LWIP_ARP || PPPOE_SUPPORT -*/
#define LWIP_ETHERNET 1
/*----- Value in opt.h for LWIP_DNS_SECURE: (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT) -*/
#define LWIP_DNS_SECURE 7
/*----- Default Value for TCP_WND: 5840 ---*/
#define TCP_WND 4096
/*----- Default Value for TCP_MSS: 536 ---*/
#define TCP_MSS 1460
/*----- Default Value for TCP_SND_BUF: 2920 ---*/
#define TCP_SND_BUF 4096
/*----- Default Value for TCP_SNDLOWAT: 2921 ---*/
#define TCP_SNDLOWAT 2048
/*----- Value in opt.h for LWIP_NETIF_LINK_CALLBACK: 0 -----*/
#define LWIP_NETIF_LINK_CALLBACK 1
/*----- Value in opt.h for TCPIP_THREAD_STACKSIZE: 0 -----*/
#define TCPIP_THREAD_STACKSIZE 2048
/*----- Value in opt.h for TCPIP_THREAD_PRIO: 1 -----*/
#define TCPIP_THREAD_PRIO osPriorityNormal
/*----- Value in opt.h for TCPIP_MBOX_SIZE: 0 -----*/
#define TCPIP_MBOX_SIZE 6
/*----- Value in opt.h for SLIPIF_THREAD_STACKSIZE: 0 -----*/
#define SLIPIF_THREAD_STACKSIZE 2048
/*----- Value in opt.h for SLIPIF_THREAD_PRIO: 1 -----*/
#define SLIPIF_THREAD_PRIO 3
/*----- Value in opt.h for DEFAULT_THREAD_STACKSIZE: 0 -----*/
#define DEFAULT_THREAD_STACKSIZE 2048
/*----- Value in opt.h for DEFAULT_THREAD_PRIO: 1 -----*/
#define DEFAULT_THREAD_PRIO 3
/*----- Value in opt.h for DEFAULT_UDP_RECVMBOX_SIZE: 0 -----*/
#define DEFAULT_UDP_RECVMBOX_SIZE 6
/*----- Value in opt.h for DEFAULT_TCP_RECVMBOX_SIZE: 0 -----*/
#define DEFAULT_TCP_RECVMBOX_SIZE 8
/*----- Value in opt.h for DEFAULT_ACCEPTMBOX_SIZE: 0 -----*/
#define DEFAULT_ACCEPTMBOX_SIZE 8
/*----- Value in opt.h for RECV_BUFSIZE_DEFAULT: INT_MAX -----*/
#define RECV_BUFSIZE_DEFAULT 2000000000
/*----- Default Value for LWIP_HTTPD: 0 ---*/
#define LWIP_HTTPD 1
/*----- Value in opt.h for HTTPD_USE_CUSTOM_FSDATA: 0 -----*/
#define HTTPD_USE_CUSTOM_FSDATA 0
/*----- Value in opt.h for LWIP_STATS: 1 -----*/
#define LWIP_STATS 0
/*----- Value in opt.h for CHECKSUM_GEN_IP: 1 -----*/
#define CHECKSUM_GEN_IP 0
/*----- Value in opt.h for CHECKSUM_GEN_UDP: 1 -----*/
#define CHECKSUM_GEN_UDP 0
/*----- Value in opt.h for CHECKSUM_GEN_TCP: 1 -----*/
#define CHECKSUM_GEN_TCP 0
/*----- Value in opt.h for CHECKSUM_GEN_ICMP: 1 -----*/
#define CHECKSUM_GEN_ICMP 0
/*----- Value in opt.h for CHECKSUM_GEN_ICMP6: 1 -----*/
#define CHECKSUM_GEN_ICMP6 0
/*----- Value in opt.h for CHECKSUM_CHECK_IP: 1 -----*/
#define CHECKSUM_CHECK_IP 0
/*----- Value in opt.h for CHECKSUM_CHECK_UDP: 1 -----*/
#define CHECKSUM_CHECK_UDP 0
/*----- Value in opt.h for CHECKSUM_CHECK_TCP: 1 -----*/
#define CHECKSUM_CHECK_TCP 0
/*----- Value in opt.h for CHECKSUM_CHECK_ICMP: 1 -----*/
#define CHECKSUM_CHECK_ICMP 0
/*----- Value in opt.h for CHECKSUM_CHECK_ICMP6: 1 -----*/
#define CHECKSUM_CHECK_ICMP6 0
/*-----------------------------------------------------------------------------*/

Может у кого будут какие идеи
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2021, 10:27
Ответы с готовыми решениями:

Передача данных по Ethernet TCP LWIP
На плате stm32f746 discovery реализован TCP эхо сервер, хочу переделать его под передачу данных с АЦП. Код реализации соединения сокета: ...

LwIP Raw API отправка данных
Добрый день. Я реализовал TCP эхо сервер на своей stm32 nucleo, прием и передача работает как надо, т.е. при отправки чего-либо с ПК на...

STM32F437 + lwIP 1.4.1(netcon), прием большого кол-ва данных
Отправляю файл в 200 кбайт на МК. По логам вижу, как летят мелкие пакеты по 20-1450 байт. Вопрос в чем - как понять что все данные пришли?...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2021, 10:27
Помогаю со студенческими работами здесь

LwIP http без LwIP стека
Всем доброго дня! А кто нибудь пробовал отделить LwIP http веб сервер от самого LwIP стека, чтобы сделать его независимым от этого...

STM32 - получение данных из LwIP
Всем доброго. Пытаюсь получить данные из стека LwIP для дальнейшего использования. За основу взял пример эхо-сервера TCP для моего...

Передача ссылки в конструктор (передача данных между формами)
Из темы &quot;Ответы на 7 самых частых вопроса по WinForms&quot; Реализовал метод № 2.3 без проблем, а вот 2.4 не получается( вот текст из той...

LWIP
что нужно включить в lwip, чтобы было так: &lt;Изображение удалено&gt; а не вот так: &lt;Изображение удалено&gt;

передача json данных с внешнего сервера через клиент в базу данных
Доброго времени суток. Времени до завтра мало, а который день бьюсь уже, новичок в этом деле. Имеется внешний сервер с json данными,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru