реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> FTP server, LwIP, FreeRTOS, STM32F207, Зависание при закачке.
Мусатов Констант...
сообщение Mar 2 2015, 11:20
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



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

Пните мою мысль что и где еще проверить.
Go to the top of the page
 
+Quote Post
Andy-spb
сообщение Mar 19 2015, 11:29
Сообщение #2





Группа: Участник
Сообщений: 10
Регистрация: 3-09-09
Из: Санкт-Петербург
Пользователь №: 52 175



Я бы посмотрел трафик Wireshark'ом и настройки стэка в lwipopts.h
Можно еще дебаг вывод в lwip включить, там много интересного.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 20 2015, 15:38
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Мусатов Константин @ Mar 2 2015, 12:20) *
Тогда портится связанный список и зависание идет в функции vListInsert

Может HEAP? Например, KEIL-евская FS подобно себя ведет (большие файлы не пишутся), если с кучей пожадничать.
Go to the top of the page
 
+Quote Post
Мусатов Констант...
сообщение Mar 29 2015, 12:49
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



Спасибо за мысли. Удалось разобраться. Виновником оказался драйвер SD. Мы сборку FreeRTOS заказывали на стороне и нам сделали зверинец по системным файлам обращения к SD. После того, как были взяты из примера ST STM32F2x7_ETH_LwIP_V1.1.0 комплектом stm322xg_eval_sdio_sd.c и diskio.c, проблема решилась.
Go to the top of the page
 
+Quote Post
RomanYU
сообщение Apr 26 2016, 09:44
Сообщение #5





Группа: Участник
Сообщений: 7
Регистрация: 26-04-16
Пользователь №: 91 471



Не подскажите, тоже проблема с mem_malloc FTP server на LWIP , говорит could not allocate XX bytes, где можно расширить память, расширение стека не помогает.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 26 2016, 10:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(RomanYU @ Apr 26 2016, 12:44) *
Не подскажите, тоже проблема с mem_malloc FTP server на LWIP , говорит could not allocate XX bytes, где можно расширить память, расширение стека не помогает.

lwipopts.h
Go to the top of the page
 
+Quote Post
RomanYU
сообщение Apr 26 2016, 12:19
Сообщение #7





Группа: Участник
Сообщений: 7
Регистрация: 26-04-16
Пользователь №: 91 471



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

CODE
/**
******************************************************************************
* 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 - Apr 27 2016, 19:19
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 26 2016, 12:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(RomanYU @ Apr 26 2016, 15:19) *
Да, но LWIPOPTS.h мало, что настроишь

Ответ неверный. Кто мешает приписать там что-то такое:
Код
#define MEM_SIZE 16384
Go to the top of the page
 
+Quote Post
RomanYU
сообщение Apr 27 2016, 08:23
Сообщение #9





Группа: Участник
Сообщений: 7
Регистрация: 26-04-16
Пользователь №: 91 471



Спасибо, за подсказку, в принципе заработало, но осталась проблема с именами файлов, сейчас разбираюсь
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 22:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016