Cтек в PIC микроконтроллерах 18 серии.

Автор: Super User Просмотров: 4073

Стек можно образно представить в виде некого списка контрольных точек (координат), с помощью которых можно легко найти обратную дорогу,  причем возвращаться тем же путем. То же самое и при  выполнении программы, в зависимости от алгоритма ее работы, то же приходится не раз "уходить" для выполнения определенных ПП.  Для "возвращения" необходимо применить  команды RETURN, RETLW, RETFIE. После их выполнения  значение из стека загружается в счетчик команд PC, а в вершину стека перемещается предыдущее значение. Конечно с учетом того,  что при   выполнении команд CALL,  RCALL сначала увеличивается значение указателя стека и после этого происходит запись в вершину стека, а при  выполнении команд типа RETURN значение вершины стека загружается в счетчик команд PC , затем указатель стека декрементируется. Иначе после "возвращения" из выполнения ПП ( пример)  нам пришлось бы снова исполнять эту же команду. 

Вершина стека   доступена для чтения и записи и хранится в трех специальных регистрах TOS (TOSU, TOSH, TOSL), верхний, старший и младшие регистры соответственно. Для записи и чтения регистров TOS в микроконтроллерах семейства PIC18XXXX,  существуют специальные команды - это "POP" извлечение (чтение) из стека и  PUSH размещение (запись) в стек.

В качестве примера рассмотрим команду POP в "работе":

В случае если флаг сброшен - при выполнении ПП SSS1 команда POP пропускается,  состояние стека не изменяется и возврат происходит в обратном порядке, сначала в ПП SSS и из нее возврат в основной код программы.

В ситуации когда флаг установлен - будет выполнена команда  POP в ПП SSS1 и возврат уже происходит в основную программу сразу,  т.к. по выполнению команды было извлечение из стека.

;************************************
START       clrf              Flag ; сброс флага
            call               SSS ; вызов ПП
            bsf             Flag,0 ; установка флага
            call               SSS ; вызов ПП
            goto             START ; снова
;-----------------------------------
SSS         call              SSS1 ; вызов ПП
            nop                    ; 
            nop                    ;
            return                 ; возврат из ПП
;-----------------------------------
SSS1        btfsc           Flag,0 ; =проверяем состояния флага и если 
            POP                    ;  если установлен выполняем команду рор==
            return                 ;  возврат из ПП
;---------------  
            end

 

Пример применения команды PUSH в "работе".

В случае если флаг сброшен - при выполнении ПП SSS команда PUSH пропускается,  состояние стека не изменяется и возврат происходит в основной код программы.

В ситуации когда флаг установлен - будет выполнена команда  PUSH в ПП SSS и возврат (после выполнения команды return  ) уже происходит на размещенную метку, т.е на следующую после  PUSH команду и только после следующей  команды "return" в основной код программы.

 

;************************************
START       clrf              Flag ; сброс флага
            call               SSS ; вызов ПП
            bsf             Flag,0 ; установка флага
            call               SSS ; вызов ПП
            goto             START ; снова
;-----------------------------------
SSS         btfsc           Flag,0 ; =проверяем состояния флага и если 
            PUSH                   ; если установлен выполняем команду PUSH==
            nop                    ; для отладки
            nop                    ; =
            nop                    ; =
            return                 ; возврат из ПП
;---------------------
            end

Более наглядно можно посмотреть в видеоуроке...

{flv width="400" height="320"}Stek{/flv}

Для работы со стеком задействован регистр STKPTR, в котором содержится 2 бита флагов (биты 7,6; бит 7 STKFUL - флаг переполнения стека; бит 6 STKUNF - флаг исчерпания  стека) и указатель стека. Указатель может принимать значение 0-31 (бит 5 не задействован). При необходимости можно переназначить вершину стека,  записав соответствующее число в регистр STKPTR . Для того что бы перезаписать адрес возврата  вершины стека достаточно записать необходимый адрес в регистры TOS.

Действие, выполняемое при переполнении стека, зависит от состояния бита конфигурации STVREN (разрешение сброса микроконтроллера при переполнении стека).

В случае переполнения стека (адресов возврата более 31) флаг  STKFUL аппаратно установится в "1".

В случае исчерпания стека (нет ни одного адреса возврата ) флаг STKUNF аппаратно устанавливается в "1".


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru