Jump to content

    

IvanPletnev

Участник
  • Content Count

    60
  • Joined

  • Last visited

Community Reputation

0 Обычный

About IvanPletnev

  • Rank
    Участник

Recent Profile Visitors

750 profile views
  1. В моём случае точно не из-за питания, на одной и той же плате всё. Сейчас тестирую, всё работает отлично.
  2. А и правда компилируется этот код. Но избавиться от подсветки "неактивного" кода мне так и не удалось. #include "lwip/opt.h" #if LWIP_NETIF_STATUS_CALLBACK void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback){ ..... #error bla-bla } #endif Даёт ошибку. Значит, всё работает. Но эта подсветка сильно сбивает с толку.
  3. Здравствуйте, коллеги!! Может, конечно, глупый вопрос задам, не пинайте сильно. В который раз уже замечаю, что CubeIDE иногда отказывается реагировать на define. Вот пример: В файле lwipopts.h #define LWIP_NETIF_STATUS_CALLBACK 1 в файле netif.c #include "lwip/opt.h" #if LWIP_NETIF_STATUS_CALLBACK void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback){ ..... } Соответственно, в файле lwip/opt.h подключен файл lwipopts.h. Всё, как обычно. Но! Код, который внутри #if #endif неактивен(подсвечен) и не компилируется. При наведении курсора на LWIP_NETIF_STATUS_CALLBACK в подсказке показывается 0. При этом в файле opt.h конструкция #if !defined LWIP_NETIF_STATUS_CALLBACK || defined __DOXYGEN__ #define LWIP_NETIF_STATUS_CALLBACK 0 #endif работает. И если нажать в файле netif.c на LWIP_NETIF_STATUS_CALLBACK с зажатым ctrl, то редактор перекидывает на этот дефайн в файле lwipopts.h, где стоит единица. Такое регулярно случается, потом проходит само собой. Почему это происходит и как бороться с этим, кто нибудь может объяснить?
  4. В общем, экспериментальным путём я выяснил, что эта проблема появляется, когда код генерируется CubeMX v. 6.2.1 и STM32Cube F4 v. 1.26.1. Когда код сгенерирован CubeMX v. 6.1.1 или 6.1.2 и STM32Cube F4 v. 1.25.2 всё работает отлично. Заметил, что в версии 1.26.1 обновлена FreeRTOS до 10.3.1. Пока не разбирался, в чём там отличия.
  5. Больше нет никакой разницы. Просто мне понадобился web интерфейс на устройство, которое уже почти готово. Для того, чтобы потренироваться с http сервером я не стал встраивать его сразу в устройство, а решил сначала сделать для него отдельный проект. Взял CubeIDE, настроил LWIP, сгенерировал, запустил. И потом несколько дней провозился собственно с сабжем. Пока не создал проект в CubeMX с точно такими же настройками. Всё совершенно одинаково, но проект из CubeMX работает хорошо, а из CubeIDE нет. Теперь вот надо прикручивать SGI и SSI. Если кто-то поделится опытом в этом смысле, буду благодарен.
  6. STM32CubeMX встроен в STM32CubeIDE, то есть в Eclipse, по сути. Но, видимо, кривовато
  7. В общем, коллеги, я совершенно не понимаю, почему, но когда я сгенерировал проект не в STM32CubeIDE, а в STM32CubeMX, проблема пропала сама собой. Теперь мой сервер работает отлично.
  8. Сегодня проверил то же самое с F746-DISCO. Собрал пример от ST, закинул свою страницу, запустил. Всё работает отлично, несмотря на то, что стек жалуется на нехватку памяти. Но с нехваткой памяти я знаю, как справиться. А когда генерирую новый проект из CubeIDE, http сервер работает медленно и генерирует ретрансмиты. Код сервера беру из этого же примера. Три дня уже потратил в поисках проблемы. Куда смотреть, подскажите пожалуйста.
  9. void http_server_serve(struct netconn *conn) { struct netbuf *inbuf; err_t recv_err; char* buf; u16_t buflen; struct fs_file file; /* Read the data from the port, blocking if nothing yet there. We assume the request (the part we care about) is in one netbuf */ recv_err = netconn_recv(conn, &inbuf); if (recv_err == ERR_OK) { if (netconn_err(conn) == ERR_OK) { netbuf_data(inbuf, (void**)&buf, &buflen); /* Is this an HTTP GET command? (only check the first 5 chars, since there are other formats for GET, and we're keeping it very simple )*/ if ((buflen >=5) && (strncmp(buf, "GET /", 5) == 0)) { if ((strncmp((char const *)buf,"GET / ",6)==0)||(strncmp((char const *)buf,"GET /index.html",15)==0)) { fs_open(&file, "/index.html"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /port1.html",15)==0) { fs_open(&file, "/port1.html"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/logo.png",17)==0) { fs_open(&file, "/IMG/logo.png"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /NotoSerif.woff",19)==0) { fs_open(&file, "/NotoSerif.woff"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /style.css",14)==0) { fs_open(&file, "/style.css"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/img1.jpg",17)==0) { fs_open(&file, "/IMG/img1.jpg"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/img2.jpg",17)==0) { fs_open(&file, "/IMG/img2.jpg"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/img3.jpg",17)==0) { fs_open(&file, "/IMG/img3.jpg"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else if (strncmp((char const *)buf,"GET /IMG/arrow.png",18)==0) { fs_open(&file, "/IMG/arrow.png"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } else { fs_open(&file, "/404.html"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } printf("Heap minimum size %u\r\n",xPortGetMinimumEverFreeHeapSize()); } } } /* Close the connection (server closes in HTTP) */ netconn_close(conn); /* Delete the buffer (netconn_recv gives us ownership, so we have to make sure to deallocate the buffer) */ netbuf_delete(inbuf); } На самом деле, сейчас функция передачи это функция из примера ST. Только с моими файлами и путями. Только в примере она работает, как нужно, а у меня пока нет. Сейчас смотрю в сторону приоритетов прерываний, сравниваю пример с моими.
  10. Да, и еще. Вставляю свою страницу в пример от ST, меняю пути к файлам, всё работает отлично. Хотя в lwipopts у меня гораздо больше ресурсов, чем в примере от ST.
  11. Уважаемые коллеги, здравствуйте! Делаю http сервер на sockets API, всё в целом работает, но во-первых, иногда (не всегда) страница 60кб довольно долго грузится (3-4c), а во-вторых, wireshark показывает ретрансмиты (см. картинку). Статистика LWIP показывает, что всего хватает. И памяти, и буферов. Ошибки в статистике все по нолям. И в общем, эти ретрансмиты не мешают, но всё равно хочется избавиться от них. Пробовал делать параллельный сервер (отдельная задача на каждый сокет), но во-первых это не помогло уйти от ретрансмитов, а во-вторых появилась проблема некорректного закрытия сокетов, которые со временем накапливались и вешали приложение напрочь. В общем, подскажите, пожалуйста, может у кого-то есть решение вышеперечисленных проблем?
  12. Да, именно так. Поэтому спасибо за наводку)
  13. Да, коллеги, это делается элементарно, оказывается. int optValue = 1; setsockopt(newconn, IPPROTO_TCP, TCP_NODELAY, (void*)&optValue, sizeof(optValue)); Работает идеально, я получил, что хотел.
  14. UDP тоже надо сделать. Позже займусь) А как определить текущий PCB для tcp_nagle_disable?