|
|
  |
lwip с Rtos или без Rtos, Как лучше, правильнее, удобнее использовать стек с rtos или без |
|
|
|
Feb 3 2014, 13:51
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
У меня вот так задается PBUF_POOL_BUFSIZE Код /** Calculate memory size for an aligned buffer - returns the next highest * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4). */ #define PBUF_POOL_SIZE 16 #define MEM_ALIGNMENT 4 #ifndef LWIP_MEM_ALIGN_SIZE #define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1)) #endif
#define TCP_MSS 536 #define PBUF_LINK_HLEN 14 #define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) В DMA у меня по 2 буфера по 1536 каждый . Как лучше подобрать эти параметры?
|
|
|
|
|
Feb 3 2014, 14:00
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(sergey sva @ Feb 3 2014, 16:24)  Как различаете соединения по портам если они все приходят на порт 80 и с одного айпи? Соединение может быть установлено только между двумя сокетами, и для каждой пары сокетов может существовать только одно соединение. Сокет - это тройка параметров 1. IP 2. ПОРТ 3. Тип соединения UDP/TCP ваша тройка параметров фиксирована IP, ПОРТ:80, TCP значит для создания разных соединений будут меняться тройки параметров подключаемого устройства, так как протокол и IP наверняка фиксированны, единственное что может быть изменено это - номер порта.
|
|
|
|
|
Feb 3 2014, 15:46
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Буквально на днях сам на этом обжёгся. lwip ожидает ... lwip ничего не ожидает, это ваше приложение может ожидать, можно сделать и один байт, главное что бы ваше приложение это учитывало и правильно собирало буфер. Цитата Как различаете соединения по портам если они все приходят на порт 80 и с одного айпи? Как вы работаете со стеком я не знаю. Но может быть 3 варианта 1) Работа без ОС, 2) Работа с ОС через netconn интерфейс, 3) работа через сокеты (они тоже на самом деле работают через netconn просто это скрыто от пользователя что бы пользователь мог пользоваться стандартным интерфейсом сокетов) в общем для первого варианта у вас есть функция tcp_accept(listen_pcb, callback_accept); которая устанавливает калбек функцию для нового соединения, у этой функции есть параметр struct tcp_pcb *pcb так вот этот pcb так вот этот pcb будет уникален для каждого соединения, следователь при записи или чтения использую эти pcb будете читать от того или другого клиента. Для 2 и 3 случая все ток же создается уникальная структур (сокет) для каждого соединения.
|
|
|
|
|
Feb 3 2014, 17:33
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
почитайте викизнание по LwIP
он сам сделает структуру для вас, и даст на нее указатель, надо его сохранить. А когда соединение закроется, структура пометиться как мертвая, и функцией которая вызывается при медленном таймере уничтожится.
вообще при работе с lwip, он хорошо следить за своей памятью, и если в процесс ручками не залезть, и ничего не напортить. И следовать стандартному алгоритму вызовов, с отметками освобождения буферов, все будет хорошо.
|
|
|
|
|
Feb 4 2014, 15:18
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Собрал по примерам исходников функцию которая должна показывать страницу. Принцип такой: как поступают данные в receive делаю парсинг и вызываю эту функцию: Код err_t ShowPage(void* arg,struct tcp_pcb *tpcb) { struct userstr *us = (struct userstr*) arg; char resp[150]; u16_t lenresp = 0; memset(resp,0,150); err_t err = ERR_OK; u16_t len = us->SizePage;
lenresp = sprintf(resp, "HTTP/1.1 200 OK\r\nServer: Mutniiserver/2014-02-04\r\nContent-Type: text/html\r\nContent-Length: %i\r\nConnection: close\r\n\r\n",us->SizePage); tcp_write(tpcb, resp, lenresp, 0);
UART_printf("send ... (%s) (%i)\n\r", resp,err);
do { LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Trying go send %d bytes\n", len));
err = tcp_write(tpcb, us->PtrPageShow, len, 0);
if (err == ERR_MEM) { if ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) { /* no need to try smaller sizes */ len = 1; } else { len /= 2; }LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed, trying less (%d bytes)\n", len)); } } while ((err == ERR_MEM) && (len > 1));
UART_printf("post send ... (%i)\n\r",err);
if (err == ERR_OK) { LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Sent %d bytes\n", len)); } else { LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed with err %d (\"%s\")\n", err, lwip_strerr(err))); }
us->lenght = len; return err;
} // Но пока не хочет работать(
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|