Страница 1 из 1

Стек и прерывания

Добавлено: Сб окт 25, 2008 09:10:55
Артур
Скажите пожалуйста что такое стек?
Где он находится? как его установить?
Влияет ли он на выполнения прерываний или подпрограмм?
На что он похож?
Приведите пожалуйста примеры доступные для понимания...
Прочитаная книга и перевод даташита не произвело на мой мозг положительного результата :(
Надеюсь на вашу помощь! Спасибо!

Добавлено: Сб окт 25, 2008 09:25:16
Gorec
В рубрике "обучалка" http://radiokot.ru/start/mcu_fpga/avr/ это хорошо расписано

Добавлено: Сб окт 25, 2008 11:10:40
Барсик
Стек - это память для данных, организованная особым образом. От английского глагола, который можно в данном случае перевести как "складывать в стопку". Смысл в том, что данные складываются в стек строго друг за другом, а извлекаются в обратном порядке - то, что лежит "сверху" извлекается первым. Место в памяти, где находится "верхушка" этого стека всегда известно. На него указывает особая переменная (как правило, специальный регистр микроконтроллера) которая называется указателем стека.
Для этого самого стека в оперативной памяти микроконтроллера должно быть выделено специальное место. И на нижнию границу этого места должен быть установлен указатель стека. Эта процедура называется инициализацией стека. Если этого не сделать, то случится катастрофа - Ваша программа будет работать ровно до того места, пока не будет вызвана подпрограмма, или не возникнет прерывание. Потому как, при вызове подпрограммы, или при обработке прерывания, текущие данные, в том числе и адрес возврата, запоминаются в стеке. Ну а если указатель стека, вместо нужного места в оперативной памяти указывает дьяволу на рога... Сами понимаете, что будет.
В заключение, совет. Чтобы никогда не заморачиваться инициализацией стека - забейте на ассемблер и используйте языки высокого уровня, например, "Си". Там заботу об указателе стека берёт на себя компилятор...

Добавлено: Сб окт 25, 2008 14:54:57
Артур
Скажите почему в регистр SPL всегда заносят low(ramend)
а в некоторых контроллерах его вобще трогать не надо :shock: ибо он аппаратный? Что будет если занести другое значение в этот регистр??
Спасибо! И еще вопрос стек расположен в памяти программ?

Добавлено: Сб окт 25, 2008 14:58:44
tych
Артур писал(а):Скажите почему в регистр SPL всегда заносят low(ramend)
Не всегда. Это от размера RAM зависит.
Артур писал(а): И еще вопрос стек расположен в памяти программ?
Выше вроде ПО РУССКИ растолковали.

Добавлено: Вс окт 26, 2008 09:06:21
Артур
СПАСИБО! :)