|
Как определить максимальную реальную глубину CSTACK моей программы?, в отладчике |
|
|
|
Oct 14 2015, 08:35
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 13-03-14
Из: Санкт-Петербург
Пользователь №: 80 903

|
Есть ли какая-нибудь встроенная особенность отладчика IAR, которая автоматически показывает максимальную глубину CSTACK, которая произошла в моей программе за время отладки встроенным отладчиком?
Сейчас приходится вручную приблизительно прикидывать, сколько скушает SCTACK, а хотелось бы поточнее.
Думаю, вопрос подойдет про разные платформы. Конкретно - AVR.
Сообщение отредактировал Разработчики - Oct 14 2015, 08:36
|
|
|
|
|
Oct 14 2015, 08:48
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 13-03-14
Из: Санкт-Петербург
Пользователь №: 80 903

|
Цитата(Непомнящий Евгений @ Oct 14 2015, 11:44)  Заполняете область стека неким шаблоном (0xff, 0xDEAD, etc) и смотрите, где шаблон нарушен - туда опускался стек Да, сейчас так и делаю. Даже можно ничем не заполнять, потому что само заполняется ненулями. Но может есть что-то встроенное.
|
|
|
|
|
Oct 14 2015, 11:21
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 13-03-14
Из: Санкт-Петербург
Пользователь №: 80 903

|
Спасибо. Я посмотрел, он довольно сильно завышает.
А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено?
Сообщение отредактировал Разработчики - Oct 14 2015, 11:22
|
|
|
|
|
Oct 14 2015, 12:49
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Сергей Борщ @ Oct 14 2015, 15:43)  Можно попросить линкер построить дерево вызовов и сложить глубину основного цикла с максимальной глубиной обработчиков прерываний. Вообще без отладчика. Не канает если есть косвенные вызовы. Цитата(Разработчики @ Oct 14 2015, 17:21)  А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено? Стек в программе не определяют, а задают. Если что. Так же как любой другой массив.
|
|
|
|
|
Oct 14 2015, 12:53
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(Разработчики @ Oct 14 2015, 14:21)  А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено? __segment_begin("CSTACK") __segment_end("CSTACK") и нужно не забыть заранее сделать так: #pragma segment = "CSTACK"
|
|
|
|
|
Oct 14 2015, 13:55
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 13-03-14
Из: Санкт-Петербург
Пользователь №: 80 903

|
Цитата(den_po @ Oct 14 2015, 15:53)  и нужно не забыть заранее сделать так: #pragma segment = "CSTACK" Я имел в виду системный сегмент CSTACK, а не мой. Цитата(jcxz @ Oct 14 2015, 15:49)  Стек в программе не определяют, а задают. Если что. Так же как любой другой массив. Для массива можно из программы узнать, куда его запихал компилятор. А CSTACK?
|
|
|
|
|
Oct 14 2015, 14:01
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(Разработчики @ Oct 14 2015, 16:55)  Я имел в виду системный сегмент CSTACK, а не мой. Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать.
|
|
|
|
|
Oct 14 2015, 14:11
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 13-03-14
Из: Санкт-Петербург
Пользователь №: 80 903

|
Цитата(den_po @ Oct 14 2015, 17:01)  Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать. Понял. Спасибо!
|
|
|
|
|
Oct 15 2015, 05:23
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Разработчики @ Oct 14 2015, 19:55)  Для массива можно из программы узнать, куда его запихал компилятор. А 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).
|
|
|
|
|
Oct 15 2015, 06:38
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(jcxz @ Oct 15 2015, 08:23)  Я не знаю, что в Вашей программе означает символьное имя CSTACK. Это только Вы можете знать. В моих проектах это имя не используется. То есть вы НИКОГДА не использовали иаровский стартап и его же конфиги линкера по умолчанию?
|
|
|
|
|
Nov 25 2015, 11:33
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691

|
А подскажите, как получить трехбайтовую величину? Хочу получить длину программы по окончанию сегмента 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 байта, а третий - ноль.
|
|
|
|
|
Nov 25 2015, 12:51
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Target @ Nov 25 2015, 18:33)  А подскажите, как получить трехбайтовую величину? Хочу получить длину программы по окончанию сегмента 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");
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|