HOME PROJETOS PROGRAMAÇÃO |
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: 05 de May de 2024 |