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

 
 
> 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, 14:45
Сообщение #2


Участник
*

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



Цитата(esaulenka @ Feb 18 2016, 15:09) *
1) Хорошим тоном является наличие не обычного флажка, а семафора. Или очереди.
В этом случае задача не будет крутиться впустую.
2) Также хорошим тоном (а в случае "где-то у меня память течёт" - необходимым средством) является использование snprintf() вместо sprintf(). sprintf() легко и непринуждённо портит память, лежащую сразу после выходного буфера (сколько раз сам на это наступал...).

Как можно заметить задача именуется vTemp. Это временное решение, созданное для вывода отладки в ЮАРТ. Этой задачи вовсе не должно было быть. Потому с семафорами я не заморачивался.

Цитата(esaulenka @ Feb 18 2016, 15:09) *
Ну отлично просто. Но пока мы не увидим, где и что конкретно повисло, результаты разглядывания кофейной гущи будут точнее, чем разглядывание кода.

Если бы я видел, где повисло уже и сам бы решал проблему. Вечером буду пробовать по добавлять отладки в код РТОСа.

Цитата(esaulenka @ Feb 18 2016, 15:09) *
Т.е. ссылка в 4-м сообщении - непонятная, а ссылка в 9-м - понятная? Удивительное дело, ведь ведут они в конечном итоге в одно и то же место.

Дело вовсе не в ссылке, а в примере который там показан.

esaulenka не нужно так агрессивно относится к заданным вопросам, не все так хорошо знакомы с РТОСом, как Вы. После всего прочитанного, мне стало ясно как отлаживать РТОСом, возможно скоро я и найду причину беды, если нет - перепишу с нуля обработчик прерывания и ф-кцию.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Feb 18 2016, 15:52
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Neo_Matrix @ Feb 18 2016, 17:45) *
esaulenka не нужно так агрессивно

Ок. Извините.

У Вас проблема в том, что полностью отсутствуют средства диагностики.
Настоятельно рекомендую разобраться, что такое hardfault, в какие регистры надо при этом смотреть (для начала - скопировать обработчик с сайта freertos, погуглить "hardfault cortex site:electronix.ru -redirect").
Также при работе с RTOS необходимо знание, сколько куда памяти уходит. Во фриртос это почти что встроенная штука (почему-то в heap'е нет диагностики, но это легко поправить).

Без диагностики можно долго "исправлять" методом тыка, и оно опять развалится в самый неподходящий момент...


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
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
- - Neo_Matrix   Немного добавлю по отладке. Есть задача, которая в...   Feb 18 2016, 11:41
|- - 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,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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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