Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
Как лучше в IAR C контролировать переполнение Data stack "CSTACK"?
Отправлено
БУБУ
(195.131.149.120)
04 февраля 2011, г. 14:48
Составить ответ
|
Вернуться на конференцию
Ответы
Всем спасибо за советы (+)
-
БУБУ
(04.02.2011, 17:12:9
195.131.149.120
, 1348 байт)
можно аналитически, оценив возможные вызовы функций (если конечно рекурсии нет), можно вначале забить память значениями типа AA, а потом смотреть снимки памяти - можно определить как эволюционирует стек во времени.
-
mandigit
(04.02.2011, 16:17:11
83.237.12.19
, 219 байт)
Записать сигнатуру в дно стека "БУБУ_DEAD_BEEF_1984" и периодически ее проверять. Не совпало - опачки...
-
Doppler
(04.02.2011, 15:16:19
87.213.66.226
,
пустое
)
А как узнать его начало (конец)? AVR
-
БУБУ
(04.02.2011, 15:35:49
195.131.149.120
,
пустое
)
Ну, в пределе, конец стека - это за последним элементом данных или (если стек растет вверх) - конец физической RAM. В листинге линкера можно найти эти величины.
-
Doppler
(04.02.2011, 15:50:40
87.213.66.226
,
пустое
)
Стек у АВР растёт вниз, на встречу глобальным и статическим переменным. Компилятор, обычно, сообщает о кол-ве использованых ячеек. Остальное доступно под стек. Подробности по размещению данных в памяти можно посмотреть в файле *.map (для WinAVR)
-
Юрий_СВ
(04.02.2011, 15:56:46
217.12.195.250
,
пустое
)
Я сейчас кладу число в дно RSTACK и CSTACK, потом проверяю. Адрес беру из .map файла. Но хотелось бы это делать автоматически как-то.
-
БУБУ
(04.02.2011, 16:19:58
195.131.149.120
,
пустое
)
Зачем ложить куда-то число я не понимаю. RSTACK и CSTACK - бесполезный хлам. У АВР есть регистр указателя на стек - регистр SP (SPL+SPH).
-
Юрий_СВ
(04.02.2011, 16:42:30
213.5.199.158
, 624 байт)
Неувязочка. Вы не можете вызывать эту функцию после каждого оператора в программе. Есть (большой) риск просто пропустить момент с максимальным значением SP. А проверка сигнатуры - пассивный метод, не требует лишних вызовов и гарантированно покажет заезд стека "не туда". А для экспериментов можно, как указали выше, заполнить ОЗУ паттерном и отслеживать реальную глубину стека.
-
Doppler
(04.02.2011, 16:56:59
87.213.66.226
,
пустое
)
Вызывать после каждого оператора и не требуется. Достаточно периодически вызывать его в сАмой глубокой функции прерывания. Проверка сигнатуры то же хорошо, но она (проверка) более громоздкая (надо весь верх заполнять сигнатурами и гораздо сложнее получить сам размер) А размер стека позволяет мне осмысленно выбирать размер буферов в программе (естественно с запасом).
-
Юрий_СВ
(04.02.2011, 17:14:9
213.5.199.158
,
пустое
)
(прерывание каждые 250 мкс)
-
Юрий_СВ
(04.02.2011, 17:14:50
213.5.199.158
,
пустое
)
Пардон, забыл указать: начальное значение Stack_Border=65534;
-
Юрий_СВ
(04.02.2011, 16:45:12
213.5.199.158
,
пустое
)
Там два стека: стек вызовов и стек данных, который в регистре Y
-
БУБУ
(04.02.2011, 16:57:14
195.131.149.120
,
пустое
)
В реальности нет никакого второго стека. т.к. команды сохранения и восстановления данных (PUSH и POP) могут работать только по SP и не как иначе. Автоматическое сохранения адреса возврата - тем более только по SP.
-
Юрий_СВ
(04.02.2011, 17:25:23
213.5.199.158
,
пустое
)
Там в стек кладется примерно как ST -Y, r16
-
БУБУ
(04.02.2011, 17:51:29
195.131.149.120
,
пустое
)
Ответ:
-
БУБУ
(04.02.2011, 17:50:33
195.131.149.120
,
пустое
,
ссылка
)
На 100% не скажу. но по идее Y будет т.н. указателем на кадр (область локальных переменных для конкретной функции). Этот указатель должен использоваться очень редко (только, когда для локальных переменных функции не хватает регистров). Но ГЛАВНОЕ: Y должен находится в пределах, ограниченных SP. Т.е. Y Вас не касается.
-
Юрий_СВ
(04.02.2011, 17:19:48
213.5.199.158
,
пустое
)
Пожалуйста. Найдите, в каком с-файле определена переменная с максимальным адресом RAM, и сразу за ней определите свою тестовую переменную - она и будет дном стека. Ну и вычитывайте ее периодически и проверяйте изменилась ли. Лучше чтобы это был не байт, а стороковая сигнатура
-
Doppler
(04.02.2011, 16:27:29
87.213.66.226
,
пустое
)
У меня область CSTACK располагается после ABSOLUTE, а переменные - в конце после RSTACK.
-
БУБУ
(04.02.2011, 16:59:47
195.131.149.120
,
пустое
)
Регистр указателя стека прочитать (SP). При отладке програмно отслеживаю максимальное заполнение стека. (В самой глубокой функции прерывания отслеживаю максимальное значение SP)
-
Юрий_СВ
(04.02.2011, 15:48:30
213.5.199.158
,
пустое
)
Тоже вариант. Но для этого надо быть уверенным, что это - самая глубокая точка. Речь вообще-то о стеке данных. Никогда не известно, что ошибочно пихнет в стек вызывающая сторона. Вот тут-то метод с сигнатурой и поможет.
-
Doppler
(04.02.2011, 15:54:36
87.213.66.226
,
пустое
)
Что значит "неизвестно" ? А пролог и эпилог зачем ?
-
Юрий_СВ
(04.02.2011, 16:02:32
213.5.199.158
,
пустое
)
Хороший вопрос к автору топика. Если было бы известно, вопрос о контроле стека данных вообще бы не стоял. А мопед не мой :)
-
Doppler
(04.02.2011, 16:15:54
87.213.66.226
,
пустое
)
Что такое "Data stack "CSTACK"" - я без малейшего понятия. У AVR - один стек. (пишу под WinAVR)
-
Юрий_СВ
(04.02.2011, 15:51:28
213.5.199.158
,
пустое
)
Ваш один стек - это аппаратный стек для возвратов из функций\прерываний. DATA стек - сущность, вводимая компилятором для передачи параметров. В общем случае это две разные независимые вещи. Но могут быть и одним и тем же стеком.
-
Doppler
(04.02.2011, 15:59:20
87.213.66.226
,
пустое
)
Дык JTAGом поставить брекпоинт на изменение SRAM ячейки.
-
MegaJohn
(04.02.2011, 15:12:52
81.222.85.88
,
пустое
)
может не сработать, если там был, скажем 0 и при обращении тоже был записан 0
-
Каа
(04.02.2011, 15:54:28
213.132.80.172
,
пустое
)
Дык при отладке и так видно куда что указывает. Впрочем, автор не уточнил.
-
Doppler
(04.02.2011, 15:18:10
87.213.66.226
,
пустое
)
я про то что нужно джтагом указать брекпоинт на последний байт стека
-
MegaJohn
(04.02.2011, 15:44:19
81.222.85.88
,
пустое
)
Так в этом и фишка. У стека нет последнего байта. Вернее, он находится сразу за областью данных. Но и тут нюансы - а в друг у вас там есть динамическая "куча" без явного конца (и растет, зараза, навстречу стеку). Ну и опять же, это режим отладки. А может автор хотел runtime check.
-
Doppler
(04.02.2011, 16:21:42
87.213.66.226
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
вычтите из двух единицу:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru