Developers 0 14 октября, 2015 Опубликовано 14 октября, 2015 (изменено) · Жалоба Есть ли какая-нибудь встроенная особенность отладчика IAR, которая автоматически показывает максимальную глубину CSTACK, которая произошла в моей программе за время отладки встроенным отладчиком? Сейчас приходится вручную приблизительно прикидывать, сколько скушает SCTACK, а хотелось бы поточнее. Думаю, вопрос подойдет про разные платформы. Конкретно - AVR. Изменено 14 октября, 2015 пользователем Разработчики Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Заполняете область стека неким шаблоном (0xff, 0xDEAD, etc) и смотрите, где шаблон нарушен - туда опускался стек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developers 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Заполняете область стека неким шаблоном (0xff, 0xDEAD, etc) и смотрите, где шаблон нарушен - туда опускался стек Да, сейчас так и делаю. Даже можно ничем не заполнять, потому что само заполняется ненулями. Но может есть что-то встроенное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Можно попросить линкер построить дерево вызовов и сложить глубину основного цикла с максимальной глубиной обработчиков прерываний. Вообще без отладчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developers 0 14 октября, 2015 Опубликовано 14 октября, 2015 (изменено) · Жалоба Спасибо. Я посмотрел, он довольно сильно завышает. А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено? Изменено 14 октября, 2015 пользователем Разработчики Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Можно попросить линкер построить дерево вызовов и сложить глубину основного цикла с максимальной глубиной обработчиков прерываний. Вообще без отладчика. Не канает если есть косвенные вызовы. А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено? Стек в программе не определяют, а задают. Если что. Так же как любой другой массив. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено? __segment_begin("CSTACK") __segment_end("CSTACK") и нужно не забыть заранее сделать так: #pragma segment = "CSTACK" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developers 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба и нужно не забыть заранее сделать так: #pragma segment = "CSTACK" Я имел в виду системный сегмент CSTACK, а не мой. Стек в программе не определяют, а задают. Если что. Так же как любой другой массив. Для массива можно из программы узнать, куда его запихал компилятор. А CSTACK? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Я имел в виду системный сегмент CSTACK, а не мой. Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Developers 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать. Понял. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 15 октября, 2015 Опубликовано 15 октября, 2015 · Жалоба Для массива можно из программы узнать, куда его запихал компилятор. А 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 15 октября, 2015 Опубликовано 15 октября, 2015 · Жалоба Я не знаю, что в Вашей программе означает символьное имя CSTACK. Это только Вы можете знать. В моих проектах это имя не используется. То есть вы НИКОГДА не использовали иаровский стартап и его же конфиги линкера по умолчанию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 15 октября, 2015 Опубликовано 15 октября, 2015 · Жалоба То есть вы НИКОГДА не использовали иаровский стартап и его же конфиги линкера по умолчанию? Когда-то давно использовал. Но это было давно. Последние годы использую везде (в ARM) только свои стартапы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Target 0 25 ноября, 2015 Опубликовано 25 ноября, 2015 · Жалоба А подскажите, как получить трехбайтовую величину? Хочу получить длину программы по окончанию сегмента 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 байта, а третий - ноль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 25 ноября, 2015 Опубликовано 25 ноября, 2015 · Жалоба А подскажите, как получить трехбайтовую величину? Хочу получить длину программы по окончанию сегмента 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"); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться