|
IAR CSTACK RSTACK - измерение глубины стека |
|
|
|
Apr 17 2016, 11:59
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560

|
Привет! По идеям документа с сайта IAR https://www.iar.com/support/resources/artic...em-reliability/хочу напрямую смотреть использование стека в процессе выполнения программы Идея в том, чтобы через таймерное прерывание периодически замерять указатель на автоматическую переменную, и мониторить сколько стека в использовании. С data stack (CSTACK) все вроде должно получиться без проблем, а вот как получить указатель на текущий RSTACK? C data stack идея такова - Код char *highStack, *lowStack; int main(int argc, char *argv[]) { highStack = (char *)&argc; // ... printf("Current stack usage: %d\n", highStack - lowStack); }
void sampling_timer_interrupt_handler(void) { char* currentStack; int a; currentStack = (char *)&a; if (currentStack < lowStack) lowStack = currentStack; }
|
|
|
|
|
Apr 17 2016, 17:09
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Mty @ Apr 17 2016, 14:59)  ...Идея в том, чтобы через таймерное прерывание... обычно привязывают к коду или потоку при выполнении которого портится стэк. Либо как тут уже прозвучало выше - иметь аппаратные механизмы отслеживающие выход стэка за тот объём, что ему отведён. Либо ставят анализатор на переключении контекста (в случае ОС). Как превентивная мера - можно замерять сколько осталось(используется) по глубине стэк. И при изменении данного показателя производит запись для дальнейшего анализа и разбора. (круглый)
|
|
|
|
|
Apr 18 2016, 11:05
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560

|
Цитата(zltigo @ Apr 17 2016, 19:02)  Для контроля за использованим стеков их заполняют константными заначениями и переодически следят за их целостностью. Смысла в мгновенных сравнениях указателей стеков нет никакого. Ок, спасибо. А есть пример как заполнить стеки константами, и получить указатель на начало в программе на рабочем девайсе (не в эмуляторе)?
|
|
|
|
|
Apr 18 2016, 11:21
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Mty @ Apr 18 2016, 14:05)  А есть пример как заполнить... Как и любой массив памяти. QUOTE получить указатель на начало в программе на рабочем девайсе (не в эмуляторе)? Поскольку стеки УСТАНАВЛИВАЮТСЯ при инициализации, а не назначаются господом богом, то "узнать" на самом деле означает посмотреть в программе где они устанавливаются (очевидно в cstartup). и/bли посмотреть имена сегментов в конфигурации линкера.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 18 2016, 12:33
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Mty @ Apr 17 2016, 14:59)  С data stack (CSTACK) все вроде должно получиться без проблем, а вот как получить указатель на текущий RSTACK? Так программно доступный регистр SP и есть указатель на RSTACK.
|
|
|
|
|
Apr 18 2016, 12:37
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560

|
Друзья, если у кого то есть рабочий код на С по заполнению стека при стартапе - буду признателен. Пока нашел только это на ASM http://caxapa.ru/301695.html?todo=fullPS: zltigo прошу не утруждать себя ответами.
|
|
|
|
|
Apr 18 2016, 14:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Mty @ Apr 18 2016, 15:37)  Пока нашел только это на ASM Неправда. Там описан и абсолютно правильный путь и для IAR + Си. Только, как писал - "посмотреть имена сегментов в конфигурации линкера" таки придется. Надо только думать, а не просто вопрошать "дайте рабочий код" QUOTE PS: zltigo прошу не утруждать себя ответами. Без проблем.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 18 2016, 17:56
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
А почему у них там (у IAR) стек расположен не вверху памяти? А вверху памяти расположена куча? Непонятно что-то.
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 18 2016, 18:17
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(zltigo @ Apr 18 2016, 21:59)  А потому, что по барабану как, это раз. И IAR тут ни причем - дело хозяйское - как прикажете линкеру, так и будет. Еще вот как раз недавнюю тему почитал. Да - оказывается и так делают. Теперь надо бы переварить это... Посмотреть бы еще примеры под это дело (arm gcc).
|
|
|
|
|
Apr 19 2016, 07:22
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560

|
Цитата(aiwa @ Apr 18 2016, 15:33)  Так программно доступный регистр SP и есть указатель на RSTACK. Спасибо, все оказывается просто  Цитата(zombi @ Apr 19 2016, 02:37)  Вам правильно посоветовали использовать предварительное заполнение области стека константой с дальнейшим анализом содержимого оной. Этот метод даст максимально точный результат. Хотя и не 100%. А насколько точный результат глубины заполнения стека Вы хотите получить? Большой точности не надо, просто приблизительная оценка на реальной работе системы. Способ с заполнением хорош, только вот примера на С рабочего нет. В примере по ссылке, про который я писал имена сегментов выставлены правильные, в map файле они так и называются CSTACK и RSTACK но пример нерабочий. Код char __low_level_init() { #pragma segment="CSTACK" char* p = (char*)__segment_begin("CSTACK"); size_t len = (size_t)__segment_end("CSTACK") - (size_t)__segment_begin("CSTACK"); while( len-- ) *p++ = 'C'; p = (char*)__segment_begin("RSTACK"); len = (size_t)__segment_end("RSTACK") - (size_t)__segment_begin("RSTACK"); while( len-- ) *p++ = 'R';
return 1; }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|