МИКРОКОНТРОЛЛЕР AVR - Страница 62

МИКРОКОНТРОЛЛЕР AVR - МИКРОКОНТРОЛЛЕР AVR

Приведенный выше пример использует глобальные переменные, доступные из любого места программы. Если же компилятор разрабатывается для языка, использующего локальные переменные и параметры, доступные только в данной процедуре, то AVR очень хорошо подходит для решения этой проблемы исключительно простым способом. Локальные переменные должны обслуживаться либо одним из индексных регистров, используя команды «load/store» с предекрементом и постинкрементом, которые позволяют эмулировать стек, либо при помощи стековых команд «push» и «pop». Лично я склоняюсь в сторону использования индексных регистров и эмуляции стека.

Если вами был написан компилятор языка С для AVR, и в вашей программе имеется такой фрагмент:

Как будет выглядеть откомпилированный и оптимизированный код для AVR? Перед вызовом функции Complex один индексный регистр должен быть определен как указатель стека данных, а другой — как указатель базового адреса. Когда данные помещаются в стек, указатель должен увеличиваться на единицу, чтобы указывать на следующий элемент стека. При вызове функции, указатель базового адреса должен указывать на текущую позицию. Итак, для приведенного выше С-кода компилятор может генерировать следующую последовательность команд AVR (здесь предполагается, что «X» — указатель стека данных, a «Y» — указатель базового адреса):

Go to Top