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

 
 
 
Reply to this topicStart new topic
> FreeRTOS 7.4.2 + stm32f407, Кто прикручивал. Отзовитесь.
SasaVitebsk
сообщение Sep 27 2013, 07:33
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Имеется проект. Очень значительный. Очень много вычислений. Вычисления сложные.
В проекте 7 моих задач. При отладке пока можно рассматривать 2 Calc и GUI. Всё написано на чистом Си.
Без выделения/ очистки памяти.
Установил контроль стека типа 2.
Наблюдаю следующую картину.
1. Растёт стек в задаче GUI. Точнее не совсем так. Вижу, что постепенно портится память по направлению к концу стека.
Это происходит рывками ч/з большие промежутки времени. Ставлю ловушку по DataBreakPoint и наблюдаю что
заполнение происходит в ОС в xPortPendSVHandler. Если после остановки я продолжаю исполнение и контролирую
сам указатель стека (R13) в задаче, то он жёстко стоит на месте. Причём намного ниже, чем портится память.
Отсюда у меня полная непонятка. Почему происходит рост?
В задаче использую sprintf. Пока грешу на это. Возможно что-то я не понимаю по сопроцессору. Может ещё какой-то стек используется
и он растёт? Проясните пожалуйста, кто в теме.

Ну и такой вопрос. Кто использовал данную ОС с данным процессором и может подтвердить, что всё устойчиво работает.
Как-то попроще будет. По увереннее себя буду чувствовать.

Заранее благодарю.

PS: Похоже всётаки на sprintf. Очень много жрёт. Но предельно. Выше определённой отметки стек не растёт.
Go to the top of the page
 
+Quote Post
aba
сообщение Sep 27 2013, 14:21
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 12-08-11
Пользователь №: 66 698



Во фриртосе под Cortex прерывания, насколько я помню, используют мейн стек. Возможно у Вас мейн стек расположен какраз за стеком задачи и прерывание налезает на стек задачи. Также, насколько помню, sprintf использует кучу, может он налезает???
Go to the top of the page
 
+Quote Post
Lagman
сообщение Sep 27 2013, 19:00
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



В настройках FreeRTOSConfig.h увеличить размер стека для idle configMINIMAL_STACK_SIZE, хотя бы для теста.
http://www.freertos.org/a00110.html
Потом можно увеличить стек для той задачи которая вредит http://www.freertos.org/a00125.html.
И проверить есть ли в файле с фунцией которая вызывает sprintf включение заголовочного файла #include <stdio.h>.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 11 2013, 08:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Как-то забыл отписаться. rolleyes.gif Извиняйте.
Работает всё очень устойчиво.
Был хомут. Мне почему-то казалось, что в thumb2 режиме выравнивания не требуется. Тем не менее Hard fault со всеми вытекающими.
Кроме того могу сказать что при использовании sprintf стека сжирается действительно много. Учитывая что у меня FreeRTOS + математика + плавучка + вывод оперативный.
Да ещё число знаков после запятой задаётся. Короче очень сложно контролировать стек. Переписал весь вывод в ручную. Теперь он по крайней мере стабильный а не плавающий от остановки к остановке.

Всем спасибо.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Dec 11 2013, 09:26
Сообщение #5


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(SasaVitebsk @ Dec 11 2013, 12:57) *
Кроме того могу сказать что при использовании sprintf стека сжирается действительно много. Учитывая что у меня FreeRTOS + математика + плавучка + вывод оперативный.
Да ещё число знаков после запятой задаётся. Короче очень сложно контролировать стек. Переписал весь вывод в ручную. Теперь он по крайней мере стабильный а не плавающий от остановки к остановке.


для экономии памяти можно printf sprintf реализовать на отдельной задаче, в которую будет отправляться arg и list, и соотвесвенно блокирующее выполнение


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 11 2013, 17:33
Сообщение #6


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(SasaVitebsk @ Dec 11 2013, 14:57) *
Кроме того могу сказать что при использовании sprintf стека сжирается действительно много.

стандартная sprintf ОЧЕНЬ прожорлива. Мног сжирается памяти программ. Используйте printf-stdarg.c

Цитата
FreeRTOS включает файл, который называется printf-stdarg.c - он содержит эффективную версию sprintf(), которая по минимуму использует стек, и может заменить во многих случаях стандартную библиотечную версию sprintf().
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 12 2013, 05:45
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Да я просто написал свои ф-ции вывода на дисплей.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 11 2014, 05:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Кому интересно, работает очень устойчиво. В последней версии использовал: IAR 7.2, FreeRTOS 8.0. В небольшом количестве HAL 1.1 от st. В основном дрова свои.
Сейчас прикручиваю lwIP.
Go to the top of the page
 
+Quote Post

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

 


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


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