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

 
 
> STM32 зависание при добавлении любой функции
Neo_Matrix
сообщение Feb 17 2016, 21:33
Сообщение #1


Участник
*

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



Имеется плата на stm32f407 камне. Пытаюсь написать функцию парсинга ответов от модема, но при добавлении любой строки в функцию - получаю полное зависание проца. Как отлаживать не могу понять, так как присутствует FreeRTOS.
Собственно сама функция выглядит так:
Код
uint8_t modemresponse(char * data, uint16_t leng)
{
    if(iblanks(Uart3RXBuf, leng))
    {
        return 0;
    }
    else if(memchr(data, '+', leng) && memchr(data, ':', leng))
    {
        return 1;
    }
    else if(strstr(data,"ERROR") != NULL)
    {
        return 2;
    }
    else
    {
        return 3;
    }
}

Если сделать как ниже, то все работает. Тоесть достаточно закоментировать любой из else if или даже else. Если закоментировать один вариант выбора и вместо него в конец функции подставить хотя бы
Код
HAL_UART_Transmit(&huart6,(uint8_t *)"Zavislo\r",8,100);
или все что угодно - опять висяк.
Код
uint8_t modemresponse(char * data, uint16_t leng)
{
    if(iblanks(Uart3RXBuf, leng))
    {
        return 0;
    }
    else if(memchr(data, '+', leng) && memchr(data, ':', leng))
    {
        return 1;
    }
    //else if(strstr(data,"ERROR") != NULL)
    //{
    //    return 2;
    //}
    else
    {
        return 3;
    }
}

Когда то с таким сталкивался и проблема была в размере СТОК\ХЕАП. В данном случае пробовал менять их размер и в FreeRTOS и в Стартап файле, но как узнать какой размер куда прописывать?

Похоже разобрался. Поставил во FreeRTOS вместо heap4 тип heap1.

Сообщение отредактировал Neo_Matrix - Feb 17 2016, 21:34
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Neo_Matrix
сообщение Feb 18 2016, 11:41
Сообщение #2


Участник
*

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



Немного добавлю по отладке. Есть задача, которая в цикле запускает вышеуказанную функцию. Собственно вот:
Код
void vTemp(void const * argument)
{
  for(;;)
  {
    uint16_t leng; //Длина строки до знака \n
    uint8_t resp; //Собственно сам ответ 0,1,2,3.....
    if(uart3_not_empty) //Обработчик прерывания устанавливает флаг 1\0
    {
        leng = uart3_readline(); //вычисляем длину строки вместе с \r\n
        sprintf(debug_buff, "leng: %d, line: %s", len, Uart3RXBuf); //формировка данных в соседний порт для отладки(длина строки и сама строка)
        USART_STR(USART6, debug_buff);  //просто отправка данных в соседний порт для отладки
        resp = process_response(uart3_fifo_line,len); // тут вызов глючной функции
        sprintf(debug_buff, "resp: %d \r\n", resp); //формовка
        TM_USART_Puts(USART6, debug_buff); //отправка для отладки
        }
}
}

Как видно в начале происходит проверка на новые данные if(uart3_not_empty), и даже если условие if не выполнено, все равно все висло.
uart3_not_empty инициализируется 0-лем, в прерывании флаг ставится в 1. Зависон просходил даже при условии отсутствия данных на ком порте, но только при условии, что в функции process_response вариантов if(if else) более трех.

Цитата(gazpar @ Feb 18 2016, 12:56) *
В этой РТОС есть специальные службы для определения, что где ломается

О, теперь понятно!!! Спасибо!

Еще добавлю, на сайте РТОС есть такое:
Known Issues with the Current Version
Heap_4.c cannot be used on 8-bit devices (FreeRTOS V8.2.1)
A typo in the calculation of xHeapStructSize means heap_4.c cannot be used to provide the heap when FreeRTOS is being built for an 8-bit microcontroller.
Software timers and FreeRTOS-MPU
The software timer API is not yet included in the official distribution of FreeRTOS/source/include/mpu_wrappers.h.
Может как то связано.....
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Neo_Matrix   STM32 зависание при добавлении любой функции   Feb 17 2016, 21:33
- - gazpar   Странно, что работает: Кодconst void * memchr ...   Feb 18 2016, 01:08
|- - Сергей Борщ   Цитата(gazpar @ Feb 18 2016, 03:08) Стран...   Feb 18 2016, 07:03
- - esaulenka   Цитата(Neo_Matrix @ Feb 18 2016, 00:33) К...   Feb 18 2016, 07:56
- - Neo_Matrix   gazpar Странно, что работает: void *memchr(cons...   Feb 18 2016, 08:30
|- - esaulenka   Цитата(Neo_Matrix @ Feb 18 2016, 11:30) Г...   Feb 18 2016, 09:13
- - gazpar   Ок. Neo_Matrix, Вы используете прерывания? Если д...   Feb 18 2016, 08:48
- - Neo_Matrix   gazpar Настройка прерываний следущая HAL_NVIC_SetP...   Feb 18 2016, 10:37
- - gazpar   В этой РТОС есть специальные службы для определени...   Feb 18 2016, 10:56
|- - esaulenka   Цитата(Neo_Matrix @ Feb 18 2016, 14:41) Н...   Feb 18 2016, 13:09
|- - turnon   Цитата(esaulenka @ Feb 18 2016, 17:09) 2)...   Mar 17 2016, 21:36
- - Neo_Matrix   Цитата(esaulenka @ Feb 18 2016, 15:09) 1)...   Feb 18 2016, 14:45
|- - esaulenka   Цитата(Neo_Matrix @ Feb 18 2016, 17:45) e...   Feb 18 2016, 15:52
- - Neo_Matrix   esaulenka,gazpar Спасибо за помощь. Уже немного ра...   Feb 18 2016, 21:56
- - esaulenka   Слово "HAL" я пропустил. Вас ждёт масса...   Feb 19 2016, 07:17
- - Neo_Matrix   К сожалению не изменилось нечего Кроме: Код * @fi...   Feb 19 2016, 09:15


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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 05:08
Рейтинг@Mail.ru


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