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

Вопросик про стэк

Добавлено: Вт апр 24, 2007 18:30:34
Tohey
Ошибка вылазит в обработке прерывания таймера, на команде reti: Program counter outside the valid space
Че может быть? может стэк маленький? Как вообще правильно указывать стэк?

Re: Вопросик про стэк

Добавлено: Вт апр 24, 2007 18:34:52
tych
Tohey писал(а):Ошибка вылазит в обработке прерывания таймера, на команде reti: Program counter outside the valid space
Наверно у вас вектора прерываний не прописаны в проге.
Tohey писал(а):Как вообще правильно указывать стэк?
можно в листинге компилятора посмотреть можно в обучалке можно в VMLAB проект создать и увидеть.

Добавлено: Вт апр 24, 2007 18:42:03
Tohey
Наверно у вас вектора прерываний не прописаны в проге.
да не, всё прописано. Дело в том что в обработке прерывания вызывается ещё несколько "подфункций", штук 3. Т.е. в прерывании вызывается функция, а в этой функции вызывается ещё функция. И на каком то N-ном возврате вылазит эта ошибка. А в памяти смотрел - то похоже вылазит за пределы указателя (если я правельно понял).
Как можно увеличить стэк? Возможно ли на каждую функцию зделать свой собственный стэк?

Добавлено: Вт апр 24, 2007 18:51:51
tych
Вот тебе сделал в CVAVR 2 листинга АСМ - в одном стак 256 а в другом 500.

Найди отличия и доложи :lol:

Добавлено: Вт апр 24, 2007 18:59:01
Tohey
Спасибо! Уже разобрался, POP не там заPOPил :shock:, то есть сначала шло - rcall потом, push, потом reti :))) , 2 дня потерял :cry:
А вообще возможно несколько стэков делать?

Добавлено: Вт апр 24, 2007 18:59:01
tych
Стэк 500 байт размещает в 60h - 253h

кроме того аппаратный стак 524 байт расположен
в адресах 254h - 45Fh

======

а стэк 256 байт в 60h - 15Fh

и аппаратный стак 768 байт расположен в адресах 160h - 45Fh

Добавлено: Вт апр 24, 2007 19:01:22
Tohey
Стэк 500 байт размещает в 60h - 253h
А вообще стэк с конца памяти заполняется?

Добавлено: Вт апр 24, 2007 20:36:14
ARV
У МК семейства AVR указатель стека уменьшается при занасении в стек данных, т.е. движется "от конца" к "началу".
Следует различать стек программы и стек данных.
Аппаратный стек есть только у AT90S1200, если мне память не изменяет, а во всех моделях с ОЗУ стек программный, т.е. управляется из программы - что в SPL\SPH занесешь - там стек и будет.
Пример с ассемблерным листингом программы на си - имхо, худшее, что можно привести для понимания принципа работы стека. Интересно, что вы скажете про стек данных?
;DATA STACK POINTER INITIALIZATION
LDI R28,LOW(0x160)
LDI R29,HIGH(0x160)

Добавлено: Вт апр 24, 2007 22:25:31
tych
И чем же хуже текст АСМ листинга из компилятора :shock:

Код: Выделить всё

;STACK POINTER INITIALIZATION
	LDI  R30,LOW(0x45F)
	OUT  SPL,R30
	LDI  R30,HIGH(0x45F)
	OUT  SPH,R30

;DATA STACK POINTER INITIALIZATION
	LDI  R28,LOW(0x254)
	LDI  R29,HIGH(0x254)
Все с комментариями ...

Добавлено: Вт апр 24, 2007 23:02:40
ARV
хуже хотя бы тем, что из едва ли не сотни строк нужных всего десяток, а во вторых - описано 2 стека... Это всем понятно?

Добавлено: Ср апр 25, 2007 00:31:21
Tohey
Про стэк данных впервые слышу! А как в него и что в него записуют?

Добавлено: Ср апр 25, 2007 01:27:13
tych
Советую не забивать голову а просто писать програмы на Си и радоваться результату.

Или вы в профи метите ? За ARV-ом вам все равно не угнаться :lol: Место на монументе уже занято :cry:

Добавлено: Ср апр 25, 2007 08:07:09
ARV
Едкая ирония совершенно неуместна: приведен пример кода, в котором ясно видно, что организовано 2 стека - и никаких объяснений по этому поводу не дано. Давайть куски кода без пояснений на форуме для начинающих - дурной тон, имхо. Понимать, что происходит - необходимо каждому программисту, если конечно не наплевательски относиться к своему делу, поэтому "использовать и не париться" - так же нехороший совет. Использовать надо, понимая что к чему (раз уж дело зашло о стеке, не смотря на Си).
Стеков может быть сколько угодно - но это обман зрения, программный трюк, вынужденная мера (ядро процессора все равно имеет только один указатель стека).
Стек данных используется компилятром Си (или другого языка высокого уровня) для организации передачи параметров функций и т.п. через отдельную область памяти, которая может быть и не на кристалле - это жертва универсальности языка.
Для примера: в Windows каждой задаче выделяется собственный стек, есть еще несколько стеков системных...

Добавлено: Ср апр 25, 2007 09:46:18
tych
ARV писал(а):Едкая ирония совершенно неуместна

Давайть куски кода без пояснений на форуме для начинающих - дурной тон, имхо.
И где же в вашем сообщении от " Вт Апр 24, 2007 8:36 pm" комментарии к коду ???

Дурным тоном промышляете-с Козьма ?

Начните с себя !

Добавлено: Ср апр 25, 2007 11:20:08
Tohey
tych писал(а):Советую не забивать голову а просто писать програмы на Си и радоваться результату.
Мне на асме понятней и удобней писать. На си буду писать только тогда, когда математику применять придется.

Добавлено: Ср апр 25, 2007 11:27:27
ARV
Tohey писал(а):Мне на асме понятней и удобней писать. На си буду писать только тогда, когда математику применять придется.
Уважаю!
Для математики на асме есть готовые подпрограммы всех арифметических действий - умножение, деление, сложение и т.п. как целых чисел (поставляются в комплекте с AVRStudio), так и с плавающей точкой (есть много в интернете), так что всегда можно обойтись только асмом.

Добавлено: Ср апр 25, 2007 12:00:00
Tohey
ARV писал(а): на асме есть готовые подпрограммы всех арифметических действий - умножение, деление, сложение и т.п. как целых чисел (поставляются в комплекте с AVRStudio)
НЕЗНАЛ :shock: Замечательно :)) !

Добавлено: Ср апр 25, 2007 12:08:47
ARV
рекомендую http://www.avr-asm-tutorial.net/avr_en/calc/index.html - много примеров вычислений