- Vote on answer
- posted
19 years ago
AVR data stack and IAR
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
Andy, ты ещё здесь сидишь?
Среда Март 09 2005 09:18, Andy Mozzhevilov wrote to Ilja Vlaskin:
IV>> Можно пpоще - опpеделять в pеальном устpойстве. Спеpва память IV>> данных обнуляется, а затем чеpез некотоpое вpемя можно подсчитать IV>> сколько в стековой области ненулевых байт. Это и будет pазмеp IV>> области, используемой стеком. AM> Это можно, но для этого нyжно писать свою встpоеннyю yтилиткy, котоpая AM> этот стек анализиpyет. Потом нyжно иметь еще сpедство отобpажения AM> где-либо pезyльтата. Это все можно сделать в том или ином виде, но не AM> yдобно. Резyльтат не гаpантиpyется, особенно если есть ветви, котоpые AM> выполняются достаточно pедко.
Раз уж пошла такая пьянка...
Общая идея. Предполагается, что контроллер имеет возможность вывести информацию об ошибке (это можно сделать почти всегда, один из наиболее простых и удобных способов - выводить сообщение в UART). Пишется код, на который передаётся управление в случае ошибки, этот код выдаёт дамп состояния контроллера, после чего происходит останов. Для получения информации достаточно самого простенького компа с последовательным портом, на котором запускается терминалка.
Речь зашла об AVR, так что приведу простенький примерчик организации программного стека данных на этом уродце, с использованием регистра X (на конкретном компиляторе не проверяю, при необходимости подгоняйте напильником сами). Поскольку горе-разработчикам AVR-ов вовремя руки не поотбивали за кучу крошечных адресных пространств и кривые мнемоники команд для работы с ними, проверку переполнения стека приходится делать с помощью "трюка", проверяя состояние бита в указателе X (считаем, что стек данных растёт от ячейки 60h до ячейки 7Fh, указатель показывает на место для новой записи)
PUSHD MACRO reg IFDEF debugcontrol PUSH R0 ; сохраняем значение регистра R0 IN R0,SREG ; сохраняем в нём флаги BST R26,7 ; считывание 7-го бита регистра-указателя X во флаг T BRTC corr01 ; корректное значение указателя RCALL displ_error ; индикация ошибки corr01: OUT SREG,R0 ; восстанавливаем флаги POP R0 ; восстанавливаем регистр R0 ENDIF ST X+,reg ; PUSH в стек данных ENDM
POPD MACRO reg LD reg,-X ; POP из стека данных ENDM
В сделанном "по-людски" контроллере жуткое нагромождение внутри блока с условной компиляцией выглядело бы примерно так:
PUSH SREG ; сохраняем флаги CPI R26,end_datastack ; проверка выхода значения указателя за границы BREQ displ_error ; индикация ошибки POP SREG ; восстановление флагов
Георгий
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago
- Vote on answer
- posted
19 years ago