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

 
 
> IAR CSTACK RSTACK - измерение глубины стека
Mty
сообщение Apr 17 2016, 11:59
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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;
}


Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
zltigo
сообщение Apr 17 2016, 16:02
Сообщение #2


Гуру
******

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



QUOTE (Mty @ Apr 17 2016, 14:59) *
Идея в том, чтобы через таймерное прерывание периодически замерять указатель на автоматическую переменную, и мониторить сколько стека в использовании.

Для контроля за использованим стеков их заполняют константными заначениями и переодически следят за их целостностью. Смысла в мгновенных сравнениях указателей стеков нет никакого.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 17 2016, 16:56
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

+1 Тем более, что этот метод не является в прямом смысле "мгновенным", т. к. не позволяет уличить момент порчи стека, а в случае с AVR и никакой другой метод этого не позволит - AVR ядро не содержит таких аппаратных возможностей.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Apr 17 2016, 17:09
Сообщение #4


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Mty @ Apr 17 2016, 14:59) *
...Идея в том, чтобы через таймерное прерывание...


обычно привязывают к коду или потоку при выполнении которого портится стэк.
Либо как тут уже прозвучало выше - иметь аппаратные механизмы отслеживающие выход стэка за тот объём, что ему отведён.
Либо ставят анализатор на переключении контекста (в случае ОС).

Как превентивная мера - можно замерять сколько осталось(используется) по глубине стэк. И при изменении данного показателя производит запись
для дальнейшего анализа и разбора.

(круглый)
Go to the top of the page
 
+Quote Post
Mty
сообщение Apr 18 2016, 11:05
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



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


Ок, спасибо.
А есть пример как заполнить стеки константами, и получить указатель на начало в программе на рабочем девайсе (не в эмуляторе)?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 18 2016, 11:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
aiwa
сообщение Apr 18 2016, 12:33
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Mty @ Apr 17 2016, 14:59) *
С data stack (CSTACK) все вроде должно получиться без проблем, а вот как получить указатель на текущий RSTACK?


Так программно доступный регистр SP и есть указатель на RSTACK.
Go to the top of the page
 
+Quote Post
Mty
сообщение Apr 18 2016, 12:37
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Друзья, если у кого то есть рабочий код на С по заполнению стека при стартапе - буду признателен.

Пока нашел только это на ASM
http://caxapa.ru/301695.html?todo=full

PS: zltigo прошу не утруждать себя ответами.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 18 2016, 14:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 18 2016, 17:56
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



А почему у них там (у IAR) стек расположен не вверху памяти? А вверху памяти расположена куча? Непонятно что-то.




Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 18 2016, 17:59
Сообщение #11


Гуру
******

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



QUOTE (AleksBak @ Apr 18 2016, 20:56) *
А почему у них там (у IAR) стек расположен не вверху памяти?

А потому, что по барабану как, это раз. И IAR тут ни причем - дело хозяйское - как прикажете линкеру, так и будет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 18 2016, 18:17
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(zltigo @ Apr 18 2016, 21:59) *
А потому, что по барабану как, это раз. И IAR тут ни причем - дело хозяйское - как прикажете линкеру, так и будет.

Еще вот как раз недавнюю тему почитал. Да - оказывается и так делают. Теперь надо бы переварить это... Посмотреть бы еще примеры под это дело (arm gcc).
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 18 2016, 23:37
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Mty @ Apr 17 2016, 14:59) *
хочу напрямую смотреть использование стека в процессе выполнения программы

Вам правильно посоветовали использовать предварительное заполнение области стека константой с дальнейшим анализом содержимого оной.
Этот метод даст максимально точный результат. Хотя и не 100%.
А насколько точный результат глубины заполнения стека Вы хотите получить?
Go to the top of the page
 
+Quote Post
Mty
сообщение Apr 19 2016, 07:22
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Цитата(aiwa @ Apr 18 2016, 15:33) *
Так программно доступный регистр SP и есть указатель на RSTACK.


Спасибо, все оказывается просто sm.gif


Цитата(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;
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 19 2016, 07:33
Сообщение #15


Гуру
******

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



QUOTE (Mty @ Apr 19 2016, 10:22) *
CODE
return 1;

Смотреть на "1". И думать что происходит при возврате 1 функцией __low_level_init

P.S.
Mty вышенаписаное читать не надо. Это только для тех, кому интересно, как это может не работать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:39
Рейтинг@Mail.ru


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