Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
Стек у АВР растёт вниз, на встречу глобальным и статическим переменным. Компилятор, обычно, сообщает о кол-ве использованых ячеек. Остальное доступно под стек. Подробности по размещению данных в памяти можно посмотреть в файле *.map (для WinAVR)
Отправлено
Юрий_СВ
(217.12.195.250)
04 февраля 2011, г. 15:56
В ответ на:
Ну, в пределе, конец стека - это за последним элементом данных или (если стек растет вверх) - конец физической RAM. В листинге линкера можно найти эти величины.
отправлено
Doppler
04 февраля 2011, г. 15:50
Составить ответ
|
Вернуться на конференцию
Ответы
Я сейчас кладу число в дно 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
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 6 на 2:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru