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

 
 
 
Reply to this topicStart new topic
> RL-ARM, стек для задач, Пиковые значения размера использования
toweroff
сообщение Apr 10 2012, 14:32
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый день!

Озадачился тут оптимизацией памяти. Ну во-первых, уменьшил количество одновременно запущенных задач до реального значения
Во-вторых, хочу оптимизировать размер стека

После компиляции я могу посмотреть в отчетах, например, что-то вроде такого:
Код
Maximum Stack Usage = 328 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)
Call chain for Maximum Stack Depth:
monitor ⇒ __0sscanf ⇒ __vfscanf_char ⇒ __vfscanf ⇒ _scanf_int


отлично. Закладываю 400 байт... и вылетаю в Stack Overflow

Запускаю симулятор. Все там прекрасно бегает, разумеется, как только использование printf - так сразу стек "подскакивает"
Но смотреть пошагово - неудобно, да и не всегда отобразится полная картина.
Можно ли как-то промориторить пиковые значения мспользования стека каждой задачей?
В Debug->OS Support я не нашел. Возможно, еще где-то есть такая возможность?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 10 2012, 14:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(toweroff @ Apr 10 2012, 17:32) *
Но смотреть пошагово - неудобно, да и не всегда отобразится полная картина.
Можно ли как-то промориторить пиковые значения мспользования стека каждой задачей?
В Debug->OS Support я не нашел. Возможно, еще где-то есть такая возможность?

Заполнить стек чем нибудь определённым и не равным 0.
Дать поработать достаточно долгое время, остановить и посмотреть сколько использовано.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 10 2012, 14:57
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(_Артём_ @ Apr 10 2012, 18:49) *
Заполнить стек чем нибудь определённым и не равным 0.
Дать поработать достаточно долгое время, остановить и посмотреть сколько использовано.

тоже вариянт! попробую, спасибо
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 10 2012, 16:06
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



upd

попробовал. Как там пользуется RL стеком - ума не приложу.
Заполнил все FF
в результате - дырки с FF и другими значениями по всему диапазону стека
черт поймешь, как эта ось его использует...

в общем, я так понимаю, довольно сложно будет точно определить самому. Только если нет штатных инструментов sad.gif так что пока - чистое шаманство
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 10 2012, 16:13
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



0xFF - это, мягко говоря, не самый удачный вариант. Заполните каким-нибудь паттерном подлиннее и посложнее (0xdeadbeef, например).
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 10 2012, 16:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(aaarrr @ Apr 10 2012, 20:13) *
0xFF - это, мягко говоря, не самый удачный вариант. Заполните каким-нибудь паттерном подлиннее и посложнее (0xdeadbeef, например).

попробовал... картина та же
кстати, стек инициализируется 0x00, так что паттерн особой роли не играет - обращения все равно в диапазон 0x0xxxxxxx (flash) или 0x4xxxxxxx (RAM), 0xFFFFFFFF видно все равно
ну не суть
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 10 2012, 16:37
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(toweroff @ Apr 10 2012, 19:06) *
Заполнил все FF

Может в этом ошибка: заполнять нужно не всё - задача должна запускаться с определёнными значаниями (и наверняка не с FF). То есть заполнить нужно ту часть которую задача ещё не использовала.
SP_tast_init_value-SP_min_value байт начиная от SP_start_value-1.

Цитата(toweroff @ Apr 10 2012, 19:06) *
пока - чистое шаманство

Точно.

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 10 2012, 16:37
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(toweroff @ Apr 10 2012, 20:28) *
попробовал... картина та же

Тогда увеличивайте стек, чтобы наверняка ухватить конец. Очень может быть, что его уже не хватает,
просто это пока не проявляется. "Дырки" вполне могут возникать при работе *scanf.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 10 2012, 16:40
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Ещё вариант. Использовать MPU (если такое возможно): при запуске задачи перенастраивать его на новый стек.
Но такое сам не пробовал.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 10 2012, 16:46
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(aaarrr @ Apr 10 2012, 20:37) *
Тогда увеличивайте стек, чтобы наверняка ухватить конец. Очень может быть, что его уже не хватает,
просто это пока не проявляется. "Дырки" вполне могут возникать при работе *scanf.

точно, в основном в там и проявляется явно. Но эта задача запускается только в одном режиме, в котором все остальные задачи не поднимаются
Для нее был вообще выделен свой стек, на чем и смотрю

Но иногда в задачах, которые уж точно тупо принимают пакет, отдают ответ и также тупо ходят по машине, тоже бывает глюк. После увеличения стека пропало

Цитата(_Артём_ @ Apr 10 2012, 20:37) *
Может в этом ошибка: заполнять нужно не всё - задача должна запускаться с определёнными значаниями (и наверняка не с FF). То есть заполнить нужно ту часть которую задача ещё не использовала.
SP_tast_init_value-SP_min_value байт начиная от SP_start_value-1.

задача, по идее, запускается в двух вариантах - со стеком, выделяемым системой, или со стеком, определяемым пользователем.
Вот я и хочу уйти от огульного выделения каждой задаче одинакового количества оперативки
Но сейчас копаю исходники - разобраться в ихнем менеджере памяти пока туго sad.gif
upd
MPU там нет
Go to the top of the page
 
+Quote Post
KRS
сообщение Apr 10 2012, 19:50
Сообщение #11


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



а в IARосвком отладчике есть какой то монитор стека, даже брекпоинт хавает, его поэтому отключаю все время.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 11 2012, 02:47
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(toweroff @ Apr 10 2012, 22:46) *
точно, в основном в там и проявляется явно. Но эта задача запускается только в одном режиме, в котором все остальные задачи не поднимаются
Для нее был вообще выделен свой стек, на чем и смотрю

Если у вас в каком-то режиме работает только одна задача, то это уже не многозадачность и соответственно - либо стек этой задачи можно наложить
на другие стеки (union), либо - ещё лучше - организовать работу так, чтобы другая задача, которая в это время стоит, выполняла функции данной
задачи и уменьшить кол-во задач на 1. Вот вам и экономия памяти.
А насчёт стеков - правильно вам посоветовали - увеличивайте стек до тех пор пока глюки не пропадут, потом ищите дырки в шаблоне заполнения -
стандартный способ. И естестно - шаблон не 0 и не 0xFF должен быть.
printf часто много памяти жрёт (зависит от используемой библиотеки). Я, для уменьшения расхода памяти, использую переключение стека - перед
вызовом printf переключаю SP на стек, выделенный специально для printf и защищаю это дело семафором естесно.
Например: ARM9+CCS3.3 - закладываю под отдельный стек == 136*4 байт + размер под контекст, сохраняемый ОС при переключении задач
(на моей ОС uCOS - ещё 18*4 байт). Хватает.
Go to the top of the page
 
+Quote Post

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

 


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


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