Перейти к содержанию
    

FTP server, LwIP, FreeRTOS, STM32F207

Есть проект сервисного устройства, которое ведет логи и считывает настройки через 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 );

Пните мою мысль что и где еще проверить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы посмотрел трафик Wireshark'ом и настройки стэка в lwipopts.h

Можно еще дебаг вывод в lwip включить, там много интересного.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда портится связанный список и зависание идет в функции vListInsert

Может HEAP? Например, KEIL-евская FS подобно себя ведет (большие файлы не пишутся), если с кучей пожадничать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за мысли. Удалось разобраться. Виновником оказался драйвер SD. Мы сборку FreeRTOS заказывали на стороне и нам сделали зверинец по системным файлам обращения к SD. После того, как были взяты из примера ST STM32F2x7_ETH_LwIP_V1.1.0 комплектом stm322xg_eval_sdio_sd.c и diskio.c, проблема решилась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не подскажите, тоже проблема с mem_malloc FTP server на LWIP , говорит could not allocate XX bytes, где можно расширить память, расширение стека не помогает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не подскажите, тоже проблема с mem_malloc FTP server на LWIP , говорит could not allocate XX bytes, где можно расширить память, расширение стека не помогает.

lwipopts.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, но 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****/

Изменено пользователем IgorKossak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, но LWIPOPTS.h мало, что настроишь

Ответ неверный. Кто мешает приписать там что-то такое:

#define MEM_SIZE 16384

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, за подсказку, в принципе заработало, но осталась проблема с именами файлов, сейчас разбираюсь

post-91471-1461745429_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...