Перейти к содержанию
    

Как определить максимальную реальную глубину CSTACK моей программы?

Есть ли какая-нибудь встроенная особенность отладчика IAR, которая автоматически показывает максимальную глубину CSTACK, которая произошла в моей программе за время отладки встроенным отладчиком?

 

Сейчас приходится вручную приблизительно прикидывать, сколько скушает SCTACK, а хотелось бы поточнее.

 

Думаю, вопрос подойдет про разные платформы. Конкретно - AVR.

Изменено пользователем Разработчики

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заполняете область стека неким шаблоном (0xff, 0xDEAD, etc) и смотрите, где шаблон нарушен - туда опускался стек

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заполняете область стека неким шаблоном (0xff, 0xDEAD, etc) и смотрите, где шаблон нарушен - туда опускался стек

 

Да, сейчас так и делаю. Даже можно ничем не заполнять, потому что само заполняется ненулями.

Но может есть что-то встроенное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно попросить линкер построить дерево вызовов и сложить глубину основного цикла с максимальной глубиной обработчиков прерываний. Вообще без отладчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Я посмотрел, он довольно сильно завышает.

 

А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено?

Изменено пользователем Разработчики

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно попросить линкер построить дерево вызовов и сложить глубину основного цикла с максимальной глубиной обработчиков прерываний. Вообще без отладчика.

Не канает если есть косвенные вызовы.

 

А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено?

Стек в программе не определяют, а задают. Если что. Так же как любой другой массив.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено?

__segment_begin("CSTACK")

__segment_end("CSTACK")

 

и нужно не забыть заранее сделать так:

#pragma segment = "CSTACK"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и нужно не забыть заранее сделать так:

#pragma segment = "CSTACK"

 

Я имел в виду системный сегмент CSTACK, а не мой.

 

Стек в программе не определяют, а задают. Если что. Так же как любой другой массив.

 

Для массива можно из программы узнать, куда его запихал компилятор. А CSTACK?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я имел в виду системный сегмент CSTACK, а не мой.

Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать.

 

Понял. Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для массива можно из программы узнать, куда его запихал компилятор. А CSTACK?

Я не знаю, что в Вашей программе означает символьное имя CSTACK. Это только Вы можете знать. В моих проектах это имя не используется.

У меня есть массив

static __root __no_init OS_STK stkTaskMain[NNN + STK_SIZE_ISR_NFP] @ ".bssStkMain";

задающий стек используемый стартапом и функцией main() (и, впоследствии, после старта ОС, другой задачей), есть сегмент .bssStkMain, в который линкуется этот массив и указатель на конец которого записывается в вектор сброса.

Есть множество других стеков задач ОС, каждый задан массивом типа

__no_init static OS_STK stkXXX[NNN + STK_SIZE_ISR_NFP] @ ".bssStk";

И место под любой стек задаётся статическим массивом в исходниках либо в файле конфигурации компоновщика (*.icf в IAR).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не знаю, что в Вашей программе означает символьное имя CSTACK. Это только Вы можете знать. В моих проектах это имя не используется.

То есть вы НИКОГДА не использовали иаровский стартап и его же конфиги линкера по умолчанию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть вы НИКОГДА не использовали иаровский стартап и его же конфиги линкера по умолчанию?

Когда-то давно использовал. Но это было давно. Последние годы использую везде (в ARM) только свои стартапы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А подскажите, как получить трехбайтовую величину? Хочу получить длину программы по окончанию сегмента NEAR_ID.

Пытаюсь получить адрес сегмента NEAR_ID.

 

Делаю так:

 

#pragma segment = "NEAR_ID"

unsigned long * pNEAR_ID_end = (unsigned long *)__segment_end("NEAR_ID");

 

 

Компилятор ругается так:

 

Linking

Warning[w47]: Range error,

Number out of range. Valid range is -128 (-0x80) to 255 (0xFF).

File: main.cpp, Line: 247

Source: LDI R17, (SFE(NEAR_ID)) >> 8

 

Если вместо unsigned long ставить void или word, то выдает только 2 байта, а третий - ноль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А подскажите, как получить трехбайтовую величину? Хочу получить длину программы по окончанию сегмента NEAR_ID.

Пытаюсь получить адрес сегмента NEAR_ID.

Очень похоже на то, что сказывается гарвардская архитектура AVR. Указатели на память данных и память кода это две совершенно разные сущности и просто так не смешиваются.

А у Вас как раз написано unsigned long * pNEAR_ID_end = ..., что подразумевает указатель на память данных, в то время как сегмент NEAR_ID располагается во флеше.

В EWAVR_CompilerReference.pdf есть подсказка:

If the segment was declared with a memory attribute

memattr, the type of the __segment_begin operator is a pointer to memattr void.

Otherwise, the type is a default pointer to void.

Попробуйте так:

#pragma segment = "NEAR_ID" __farflash

char __farflash* pNEAR_ID_end = __segment_end("NEAR_ID");

а то и просто

uint32_t pNEAR_ID_end = __segment_end("NEAR_ID");

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...