HOME      PROJETOS      PROGRAMAÇÃO     

Serviços de Stack de Software Para a Família 18F



Muitas linguagens como C usam um stack na memória RAM do microcontrolador para salvar dados e endereços a serem passados para subrotinas ou funções do programa.

O tamanho do stack só depende do tamanho da memória RAM do microcontrolador e o serviço de stack não verifica o fim da memória ou se o stack está invadindo outras áreas de dados do sistema. Isso fica a cargo do programador.

Para usar o serviço de Stack, baixe o arquivo stack_services.inc e inclua no programa.

O serviço de Stack requer, ainda, a inclusão dos seguintes registradores no programa:

stackdata UDATA 0x300 ; <=== Posicao do stack na RAM com o nome "stackdata". myStack RES 1 stackH RES 1 stackL RES 1 stackptrH RES 1 stackptrL RES 1 stacki RES 1

Este serviço permite gerar um stack usando apenas tres funçoes que podem ser chamadas através de macros.

A primeira função pode ser requisitada pela macro STACK_INIT que configura um stack na posição de memória designada pela diretiva [stackdata   UDATA   0x???], onde "???" é um endereço em qualquer banco de memória RAM do microcontrolador. Veja a definição dos registradores acima.
Essa macro faz uma chamada à função stackinit.

A segunda função pode ser requisitada pela macro pushR   reg, que armazena o valor contido no registrador reg no topo do stack.
Essa macro faz uma chamada à função pushW.

A terceira função pode ser requisitada pela macro popR   reg, que retira o valor que está no topo do stack e carrega no registrador reg.
Essa macro faz uma chamada à função popW.

Exemplo:

. . . stackdata UDATA 0x600 myStack RES 1 stackH RES 1 stackL RES 1 stackptrH RES 1 stackptrL RES 1 stacki RES 1 . . . inicio movlw 0x0F movwf ADCON1 ; todas as portas digitais . . . STACK_INIT ; inicializa o stack . . . pushR FSR1H ; armazena FSR1H no stack pushR FSR1L ; armazena FSR1L no stack . . . popR FSR1L ; restaura FSR1L popR FSR1H ; restaura FSR1H . . . END



Ao invés de usar as macros STACK_INIT, pushR e popR, pode-se chamar diretamente as funções stackinit, pushW e popW como a seguir:

. . . stackdata UDATA 0x600 myStack RES 1 stackH RES 1 stackL RES 1 stackptrH RES 1 stackptrL RES 1 stacki RES 1 . . . inicio movlw 0x0F movwf ADCON1 . . . call stackinit ; inicializa o stack . . . movf FSR1H, w ; carrega o valor de FSR1H call pushW ; armazena no stack movf FSR1L, w ; carrega o valor de FSR1L call pushW ; armazena no stack . . . popW ; retira valor do topo do stack movwf FSR1L ; restaura FSR1L popW ; retira valor do topo do stack movwf FSR1H ; restaura FSR1H . . . END











H P S P I N

Desde 04 de Março de 2010

Atualização: 03 de May de 2024