Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RL-ARM, стек для задач
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
toweroff
Добрый день!

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

После компиляции я могу посмотреть в отчетах, например, что-то вроде такого:
Код
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 я не нашел. Возможно, еще где-то есть такая возможность?
_Артём_
Цитата(toweroff @ Apr 10 2012, 17:32) *
Но смотреть пошагово - неудобно, да и не всегда отобразится полная картина.
Можно ли как-то промориторить пиковые значения мспользования стека каждой задачей?
В Debug->OS Support я не нашел. Возможно, еще где-то есть такая возможность?

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

тоже вариянт! попробую, спасибо
toweroff
upd

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

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

попробовал... картина та же
кстати, стек инициализируется 0x00, так что паттерн особой роли не играет - обращения все равно в диапазон 0x0xxxxxxx (flash) или 0x4xxxxxxx (RAM), 0xFFFFFFFF видно все равно
ну не суть
_Артём_
Цитата(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) *
пока - чистое шаманство

Точно.

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

Тогда увеличивайте стек, чтобы наверняка ухватить конец. Очень может быть, что его уже не хватает,
просто это пока не проявляется. "Дырки" вполне могут возникать при работе *scanf.
_Артём_
Ещё вариант. Использовать MPU (если такое возможно): при запуске задачи перенастраивать его на новый стек.
Но такое сам не пробовал.
toweroff
Цитата(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 там нет
KRS
а в IARосвком отладчике есть какой то монитор стека, даже брекпоинт хавает, его поэтому отключаю все время.
jcxz
Цитата(toweroff @ Apr 10 2012, 22:46) *
точно, в основном в там и проявляется явно. Но эта задача запускается только в одном режиме, в котором все остальные задачи не поднимаются
Для нее был вообще выделен свой стек, на чем и смотрю

Если у вас в каком-то режиме работает только одна задача, то это уже не многозадачность и соответственно - либо стек этой задачи можно наложить
на другие стеки (union), либо - ещё лучше - организовать работу так, чтобы другая задача, которая в это время стоит, выполняла функции данной
задачи и уменьшить кол-во задач на 1. Вот вам и экономия памяти.
А насчёт стеков - правильно вам посоветовали - увеличивайте стек до тех пор пока глюки не пропадут, потом ищите дырки в шаблоне заполнения -
стандартный способ. И естестно - шаблон не 0 и не 0xFF должен быть.
printf часто много памяти жрёт (зависит от используемой библиотеки). Я, для уменьшения расхода памяти, использую переключение стека - перед
вызовом printf переключаю SP на стек, выделенный специально для printf и защищаю это дело семафором естесно.
Например: ARM9+CCS3.3 - закладываю под отдельный стек == 136*4 байт + размер под контекст, сохраняемый ОС при переключении задач
(на моей ОС uCOS - ещё 18*4 байт). Хватает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.