Mty 0 17 апреля, 2016 Опубликовано 17 апреля, 2016 · Жалоба Привет! По идеям документа с сайта 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 17 апреля, 2016 Опубликовано 17 апреля, 2016 · Жалоба Идея в том, чтобы через таймерное прерывание периодически замерять указатель на автоматическую переменную, и мониторить сколько стека в использовании. Для контроля за использованим стеков их заполняют константными заначениями и переодически следят за их целостностью. Смысла в мгновенных сравнениях указателей стеков нет никакого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 17 апреля, 2016 Опубликовано 17 апреля, 2016 · Жалоба Для контроля за использованим стеков их заполняют константными заначениями и переодически следят за их целостностью. Смысла в мгновенных сравнениях указателей стеков нет никакого. +1 Тем более, что этот метод не является в прямом смысле "мгновенным", т. к. не позволяет уличить момент порчи стека, а в случае с AVR и никакой другой метод этого не позволит - AVR ядро не содержит таких аппаратных возможностей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 17 апреля, 2016 Опубликовано 17 апреля, 2016 · Жалоба ...Идея в том, чтобы через таймерное прерывание... обычно привязывают к коду или потоку при выполнении которого портится стэк. Либо как тут уже прозвучало выше - иметь аппаратные механизмы отслеживающие выход стэка за тот объём, что ему отведён. Либо ставят анализатор на переключении контекста (в случае ОС). Как превентивная мера - можно замерять сколько осталось(используется) по глубине стэк. И при изменении данного показателя производит запись для дальнейшего анализа и разбора. (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mty 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба Для контроля за использованим стеков их заполняют константными заначениями и переодически следят за их целостностью. Смысла в мгновенных сравнениях указателей стеков нет никакого. Ок, спасибо. А есть пример как заполнить стеки константами, и получить указатель на начало в программе на рабочем девайсе (не в эмуляторе)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба А есть пример как заполнить... Как и любой массив памяти. получить указатель на начало в программе на рабочем девайсе (не в эмуляторе)? Поскольку стеки УСТАНАВЛИВАЮТСЯ при инициализации, а не назначаются господом богом, то "узнать" на самом деле означает посмотреть в программе где они устанавливаются (очевидно в cstartup). и/bли посмотреть имена сегментов в конфигурации линкера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба С data stack (CSTACK) все вроде должно получиться без проблем, а вот как получить указатель на текущий RSTACK? Так программно доступный регистр SP и есть указатель на RSTACK. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mty 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба Друзья, если у кого то есть рабочий код на С по заполнению стека при стартапе - буду признателен. Пока нашел только это на ASM http://caxapa.ru/301695.html?todo=full PS: zltigo прошу не утруждать себя ответами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба Пока нашел только это на ASM Неправда. Там описан и абсолютно правильный путь и для IAR + Си. Только, как писал - "посмотреть имена сегментов в конфигурации линкера" таки придется. Надо только думать, а не просто вопрошать "дайте рабочий код" PS: zltigo прошу не утруждать себя ответами. Без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба А почему у них там (у IAR) стек расположен не вверху памяти? А вверху памяти расположена куча? Непонятно что-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба А почему у них там (у IAR) стек расположен не вверху памяти? А потому, что по барабану как, это раз. И IAR тут ни причем - дело хозяйское - как прикажете линкеру, так и будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба А потому, что по барабану как, это раз. И IAR тут ни причем - дело хозяйское - как прикажете линкеру, так и будет. Еще вот как раз недавнюю тему почитал. Да - оказывается и так делают. Теперь надо бы переварить это... Посмотреть бы еще примеры под это дело (arm gcc). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 18 апреля, 2016 Опубликовано 18 апреля, 2016 · Жалоба хочу напрямую смотреть использование стека в процессе выполнения программы Вам правильно посоветовали использовать предварительное заполнение области стека константой с дальнейшим анализом содержимого оной. Этот метод даст максимально точный результат. Хотя и не 100%. А насколько точный результат глубины заполнения стека Вы хотите получить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mty 0 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Так программно доступный регистр SP и есть указатель на RSTACK. Спасибо, все оказывается просто :) Вам правильно посоветовали использовать предварительное заполнение области стека константой с дальнейшим анализом содержимого оной. Этот метод даст максимально точный результат. Хотя и не 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба return 1; Смотреть на "1". И думать что происходит при возврате 1 функцией __low_level_init P.S. Mty вышенаписаное читать не надо. Это только для тех, кому интересно, как это может не работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться