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

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

Стек можно образно представить в виде некого списка контрольных точек (координат), с помощью которых можно легко найти обратную дорогу,  причем возвращаться тем же путем. То же самое и при  выполнении программы, в зависимости от алгоритма ее работы, то же приходится не раз "уходить" для выполнения определенных ПП.  Для "возвращения" необходимо применить  команды 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".


 

Регистр  STKPTR.

 

Регистр STKPTR доступен для чтения и записи, за исключением битов 7 и 6 (программно могут быть только сброшены в ‘0’). Регистр содержит: биты указателя стека; бит STKFUL - флаг переполнения стека; бит STKUNF - флаг исчерпания  стека.

 

Важно:

Сброс по включению питания   микроконтроллера (POR) и сброс по снижению питания (BOR) приводит к сбросу  битов управления регистра STKPTR, за исключением битов 5  который не используется. 

 

R/C - 0 R/C - 0 U-0 R/W-0 R/W - 0 R/W-0 R/W - 0 R/W - 0
STKFUL  STKUNF - SP4 SP3 SP3 SP2 SP1
Бит7 Бит6 Бит5 Бит4 Бит3 Бит2 Бит1 Бит0


 
Бит 7    STKFUL: Флаг переполнения стека
             1 = стек полон или произошло переполнения стека
             0 = стек не полон, нет переполнения стека


 
Бит 6  STKUNF: Флаг исчерпания стека
            1 = произошло исчерпание стека
            0 = исчерпание стека не происходило


 
Бит 5   Не используется: Читается как ‘0’


 
Бит 4-0  SP4:SP0: Биты указателя стека


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

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