AVR data stack and IAR

Loading thread data ...
Reply to
George Shepelev

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 ; восстановление флагов

Георгий

Reply to
George Shepelev
Reply to
George Shepelev
Reply to
Nickita A Startcev
Reply to
George Shepelev
Reply to
Michael Belousoff

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.