kostya-m 0 2 марта, 2015 Опубликовано 2 марта, 2015 · Жалоба Есть проект сервисного устройства, которое ведет логи и считывает настройки через SD карточку. Для доступа к логам и настройкам поднят FTP сервер. В общем-то все работает. Но есть один баг, который, хотя и не мешает, но не дает спать спокойно. Проблема возникает при попытке закачать на устройство файл размерами выше нескольких килобайт. Всякие файлы настроек меньше и проходят, а скачать с устройства можно файл любого размера. Но, все равно, мне не нравится, что в ОС осталась такая проблема. Проблема возникает если первые блоки данных FTP сервер еще пишет на SD, а пришло несколько новых пакетов. Тогда портится связанный список и зависание идет в функции vListInsert Причем над этим местом есть даже комментарии для таких как я: /* *** NOTE *********************************************************** If you find your application is crashing here then likely causes are listed below. In addition see http://www.freertos.org/FAQHelp.html for more tips, and ensure configASSERT() is defined! http://www.freertos.org/a00110.html#configASSERT 1) Stack overflow - see http://www.freertos.org/Stacks-and-stack-overflow-checking.html 2) Incorrect interrupt priority assignment, especially on Cortex-M parts where numerically high priority values denote low actual interrupt priorities, which can seem counter intuitive. See http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition of configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html 3) Calling an API function from within a critical section or when the scheduler is suspended, or calling an API function that does not end in "FromISR" from an interrupt. 4) Using a queue or semaphore before it has been initialised or before the scheduler has been started (are interrupts firing before vTaskStartScheduler() has been called?). **********************************************************************/ 1. Переполнения стека нет. Стоит и его контроль и давал значительно больше, его хватает с запасом. 2. Раздача приоритетов прерываниям кажется наиболее вероятной причиной. Однако сверялся с разными похожими проектами, примерами от ST и демо проектами FreeRTOS. К тому же попробовал разные варианты приоритетов Eternet и SDIO - больше, меньше, одинаковые - результат одинаковый. 3. Для контроля, ввел дополнительные assert в код, вроде все вызовы делаются в соответствии с правилами. Например такой configASSERT( (uxCriticalNesting || uxSchedulerSuspended || __get_BASEPRI() ) ); для контроля, что в функцию попал внутри критической секции или при остановленном шедулере или при закрытом приоритете прерывания. 4. Гарантированно не причина. Менял исходный код LwIP версий от 1.1.0 до 1.4.0 и RfeeRTOS версий 6.1, 7.1, 7.2 и 8.1 - результат одинаковый. Код ftp сервера по выполнению закачки прост: for(;;) { err = netconn_recv(sess->dconn, &nbuff); len = ( nbuff != NULL && nbuff->p != NULL ) ? netbuf_len( nbuff ) : 0; if ( !len ) break; if ( err == ERR_TIMEOUT ) { debug("[storeFile] timeout"); break; } if ( err != ERR_OK ) { debug("[storeFile] data error [%d]", err); if ( ERR_IS_FATAL(err) ) break; // connection closed vTaskDelay(500); continue; } buff = mem_malloc( len ); if ( buff == NULL ) { debug("[storeFile] error linear buff allocation"); break; } netbuf_copy( nbuff, (void *)buff, len ); netbuf_delete( nbuff ); if ( f_write(fp, buff, len, &wlen) || len != (uint16_t)wlen ) { debug("[storeFile] write error"); mem_free( buff ); break; } mem_free( buff ); } f_close(fp); mem_free( fp ); Пните мою мысль что и где еще проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy-spb 0 19 марта, 2015 Опубликовано 19 марта, 2015 · Жалоба Я бы посмотрел трафик Wireshark'ом и настройки стэка в lwipopts.h Можно еще дебаг вывод в lwip включить, там много интересного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 20 марта, 2015 Опубликовано 20 марта, 2015 · Жалоба Тогда портится связанный список и зависание идет в функции vListInsert Может HEAP? Например, KEIL-евская FS подобно себя ведет (большие файлы не пишутся), если с кучей пожадничать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 29 марта, 2015 Опубликовано 29 марта, 2015 · Жалоба Спасибо за мысли. Удалось разобраться. Виновником оказался драйвер SD. Мы сборку FreeRTOS заказывали на стороне и нам сделали зверинец по системным файлам обращения к SD. После того, как были взяты из примера ST STM32F2x7_ETH_LwIP_V1.1.0 комплектом stm322xg_eval_sdio_sd.c и diskio.c, проблема решилась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RomanYU 0 26 апреля, 2016 Опубликовано 26 апреля, 2016 · Жалоба Не подскажите, тоже проблема с mem_malloc FTP server на LWIP , говорит could not allocate XX bytes, где можно расширить память, расширение стека не помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 апреля, 2016 Опубликовано 26 апреля, 2016 · Жалоба Не подскажите, тоже проблема с mem_malloc FTP server на LWIP , говорит could not allocate XX bytes, где можно расширить память, расширение стека не помогает. lwipopts.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RomanYU 0 26 апреля, 2016 Опубликовано 26 апреля, 2016 (изменено) · Жалоба Да, но LWIPOPTS.h мало, что настроишь /** ****************************************************************************** * File Name : lwipopts.h * Description : This file overrides LwIP stack default configuration * done in opt.h file. ****************************************************************************** * * COPYRIGHT© 2016 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Define to prevent recursive inclusion --------------------------------------*/ #ifndef __LWIPOPTS__H__ #define __LWIPOPTS__H__ #include "stm32f4xx_hal.h" /* Within 'USER CODE' section, code will be kept by default at each generation */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ #ifdef __cplusplus extern "C" { #endif /* STM32CubeMX Specific Parameters (not defined in opt.h) ---------------------*/ /* Parameters set in STM32CubeMX LwIP Configuration GUI -*/ /*----- WITH_RTOS disabled (Since FREERTOS is not set) -----*/ #define WITH_RTOS 0 /*----- CHECKSUM_BY_HARDWARE disabled -----*/ #define CHECKSUM_BY_HARDWARE 0 /*-----------------------------------------------------------------------------*/ /* LwIP Stack Parameters (modified compared to initialization value in opt.h) -*/ /* Parameters set in STM32CubeMX LwIP Configuration GUI -*/ /*----- Default Value for LWIP_DHCP: 1 -*/ #define LWIP_DHCP 0 /*----- Value in opt.h for NO_SYS: 0 -----*/ #define NO_SYS 1 /*----- Value in opt.h for MEM_ALIGNMENT: 1 -----*/ #define MEM_ALIGNMENT 4 /*----- Default Value for MEMP_NUM_SYS_TIMEOUT: 5 -*/ #define MEMP_NUM_SYS_TIMEOUT 4 /*----- Value in opt.h for LWIP_ETHERNET: (LWIP_ARP || PPPOE_SUPPORT) -*/ #define LWIP_ETHERNET 1 /*----- Default Value for DHCP_DOES_ARP_CHECK: 1 -*/ #define DHCP_DOES_ARP_CHECK 0 /*----- Default Value for LWIP_DNS: 0 -*/ #define LWIP_DNS 1 /*----- Value in opt.h for LWIP_NETCONN: 1 -----*/ #define LWIP_NETCONN 0 /*----- Value in opt.h for LWIP_SOCKET: 1 -----*/ #define LWIP_SOCKET 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_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 /*-----------------------------------------------------------------------------*/ /* Parameter(s) not set in STM32CubeMX LwIP Configuration GUI -*/ /* LwIP Parameter(s) not in opt.h -----------------------------*/ #define LWIP_PROVIDE_ERRNO 1 /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ #ifdef __cplusplus } #endif #endif /*__ LWIPOPTS__H_H */ /************************* © COPYRIGHT STMicroelectronics *****END OF FILE****/ Изменено 27 апреля, 2016 пользователем IgorKossak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 апреля, 2016 Опубликовано 26 апреля, 2016 · Жалоба Да, но LWIPOPTS.h мало, что настроишь Ответ неверный. Кто мешает приписать там что-то такое: #define MEM_SIZE 16384 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RomanYU 0 27 апреля, 2016 Опубликовано 27 апреля, 2016 · Жалоба Спасибо, за подсказку, в принципе заработало, но осталась проблема с именами файлов, сейчас разбираюсь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться