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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как определить максимальную реальную глубину CSTACK моей программы?, в отладчике
Разработчики
сообщение Oct 14 2015, 08:35
Сообщение #1


Участник
*

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



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

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

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

Сообщение отредактировал Разработчики - Oct 14 2015, 08:36
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 14 2015, 08:44
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Заполняете область стека неким шаблоном (0xff, 0xDEAD, etc) и смотрите, где шаблон нарушен - туда опускался стек
Go to the top of the page
 
+Quote Post
Разработчики
сообщение Oct 14 2015, 08:48
Сообщение #3


Участник
*

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



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


Да, сейчас так и делаю. Даже можно ничем не заполнять, потому что само заполняется ненулями.
Но может есть что-то встроенное.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 14 2015, 09:43
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Разработчики
сообщение Oct 14 2015, 11:21
Сообщение #5


Участник
*

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



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

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

Сообщение отредактировал Разработчики - Oct 14 2015, 11:22
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 14 2015, 12:49
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Сергей Борщ @ Oct 14 2015, 15:43) *
Можно попросить линкер построить дерево вызовов и сложить глубину основного цикла с максимальной глубиной обработчиков прерываний. Вообще без отладчика.

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

Цитата(Разработчики @ Oct 14 2015, 17:21) *
А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено?

Стек в программе не определяют, а задают. Если что. Так же как любой другой массив.
Go to the top of the page
 
+Quote Post
den_po
сообщение Oct 14 2015, 12:53
Сообщение #7


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

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(Разработчики @ Oct 14 2015, 14:21) *
А можно как-то из программы определить границы (начало и конец) SCTACK - где расположено?

__segment_begin("CSTACK")
__segment_end("CSTACK")

и нужно не забыть заранее сделать так:
#pragma segment = "CSTACK"
Go to the top of the page
 
+Quote Post
Разработчики
сообщение Oct 14 2015, 13:55
Сообщение #8


Участник
*

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



Цитата(den_po @ Oct 14 2015, 15:53) *
и нужно не забыть заранее сделать так:
#pragma segment = "CSTACK"


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

Цитата(jcxz @ Oct 14 2015, 15:49) *
Стек в программе не определяют, а задают. Если что. Так же как любой другой массив.


Для массива можно из программы узнать, куда его запихал компилятор. А CSTACK?
Go to the top of the page
 
+Quote Post
den_po
сообщение Oct 14 2015, 14:01
Сообщение #9


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

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(Разработчики @ Oct 14 2015, 16:55) *
Я имел в виду системный сегмент CSTACK, а не мой.

Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать.
Go to the top of the page
 
+Quote Post
Разработчики
сообщение Oct 14 2015, 14:11
Сообщение #10


Участник
*

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



Цитата(den_po @ Oct 14 2015, 17:01) *
Они оба - один и тот же сегмент. Просто сишный компилятор не знает о нём, если ему не подсказать.


Понял. Спасибо!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 15 2015, 05:23
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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).
Go to the top of the page
 
+Quote Post
den_po
сообщение Oct 15 2015, 06:38
Сообщение #12


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

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(jcxz @ Oct 15 2015, 08:23) *
Я не знаю, что в Вашей программе означает символьное имя CSTACK. Это только Вы можете знать. В моих проектах это имя не используется.

То есть вы НИКОГДА не использовали иаровский стартап и его же конфиги линкера по умолчанию?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 15 2015, 06:50
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(den_po @ Oct 15 2015, 12:38) *
То есть вы НИКОГДА не использовали иаровский стартап и его же конфиги линкера по умолчанию?

Когда-то давно использовал. Но это было давно. Последние годы использую везде (в ARM) только свои стартапы.
Go to the top of the page
 
+Quote Post
Target
сообщение Nov 25 2015, 11:33
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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 байта, а третий - ноль.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Nov 25 2015, 12:51
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

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

 


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


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