Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Microcontrolador PIC18F84A e Acesso a memoria cache em C++, Notas de estudo de Automação

Programa de acesso a memoria cache e microcontrolador PIC18F84A

Tipologia: Notas de estudo

2015

Compartilhado em 17/10/2015

jaime-2
jaime-2 🇧🇷

5

(9)

13 documentos

1 / 38

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
! !
Universidade Federal do Rio Grande do Norte
Centro de Tecnologia
Departamento de Engenharia de Computação e Automação
MICROCONTROLADOR PIC 16F84A E
ACESSO A MEMÓRIA CACHE
Primeira Avaliação
Discente: Jaime Cristalino Jales Dantas
Matricula: 2011008771
Disciplina: Arquitetura de Computadores
Natal, 2 de outubro de 2015
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26

Pré-visualização parcial do texto

Baixe Microcontrolador PIC18F84A e Acesso a memoria cache em C++ e outras Notas de estudo em PDF para Automação, somente na Docsity!

Universidade Federal do Rio Grande do Norte

Centro de Tecnologia

Departamento de Engenharia de Computação e Automação

MICROCONTROLADOR PIC 16F84A E

ACESSO A MEMÓRIA CACHE

Primeira Avaliação

Discente: Jaime Cristalino Jales Dantas

Matricula: 2011008771

Disciplina: Arquitetura de Computadores

Natal, 2 de outubro de 2015

Sumário

  • Parte I – Microcontrolador PIC 16F84A
    • 1 – Introdução
    • 2 – Pinagem PIC 16F84A
    • 3 - Estrutura do microcontrolador PIC 16F84A
    • 4 - Instruções
    • 5 - Interrupções
      • 4.1 - Interrupções externas
      • 4.2 - Interrupções de overflow TMR0
      • 4.3 - Interrupções por mudança de estado PORTB
      • 4.4 - Interrupções de fim de escrita EEPROM
  • Parte 2 – Acesso à memória cache
    • 1 – Análise das configurações da cache
    • 2 – Analise dos resultados
    • 3 – Algoritmo
  • Bibliografia

A discrição e função de cada pino é mostrado na tabele a seguir

Tabela 1 - Discrição de pinos do PIC 16F84A

NOME PINO DESCRIÇÃO

OSC1/CLKIN 16 Entrada para o cristal oscilador/clock externo

OSC2/CLKOUT

15 Saída para o cristal oscilador/clock externo

𝑴𝑪𝑳𝑹 4 Master Clear (reset) externo

RA0 17

Porta de I/O digital

RA1 18

RA2 1

RA3 2

RA4/T0CKI 3

Porta de I/O digital ou entrada de clock para o

contador

Pode ter

Pull-up

interno

habilitado

por

software

RB0/INT 6 Porta de I/O digital / Interrupção externa

RB1 7

RB2 8 Porta de I/O digital

RB3 9

RB4 10

Porta de I/O digital ou interrupção na mudança de

estado RB5 11

RB6 12

Porta de I/O digital, interrupção na mudança de

estado, ou clock da programação serial

RB7 13

Porta de I/O digital, interrupção na mudança de

estado, ou data da programação serial

VSS 5 GND - Tensão de referência negativa e I/O

VDD 14 Vcc - Alimentação positiva (+5 Volts) e I/O

3 - Estrutura do microcontrolador PIC 16F84A

O microcontrolador PIC 16F84A é um microcontrolador de 8 bits que utiliza a arquitetura RISC.

Ela é baseada em registradores, com o barramento de memória de dados separado do barramento de

memória de programa. Este conceito permite ter um conjunto de instruções simples, mas extremamente

poderoso que enfatiza as operações bit, byte e de registradores. A estrutura completa do

microcontroaldor PIC 16F84A pode ser vista no diagrama abaixo:

Figura 2 - Diagrama PIC 16F84A

Figura 3 – Estrutura simplificada PIC 16F84A

Os componentes básicos do PIC 16F84A estão listados abaixo:

Memória Flash: É a memória que fica armazenado o programa, e é escrita e apagada e eletronicamente

com o uso de software.

Memória EEPROM: É a memoria não volátil do microcontrolador, ou seja, mesmo que a alimentação

seja cortada, os dados não são perdidos. É utilizada para guardar dados internos que não podem ser

perdidos.

Memoria RAM: É a memoria volátil do microcontrolador, e é utilizada na execução do programa.

Quando a alimentação é desligada, os dados presente nessa memoria são perdidos.

Porto A e Porto B: São as I/O do microcontrolador com seus periféricos. O porto A possui 5 pinos de

I/O e o porto B possui 8 pinos de I/O.

Contador / Temporizador: É um registro de 8 bits no interior do microcontrolador PIC que roda

independentemente do programa que é instalado nele. No final de quatro ciclos de clock, ele incrementa

esse contador ate o máximo de 255, que é a máxima representação de 8 bits, e quando ele chega a esse

valor, o contador é zerado a contagem reiniciado do zero.

Unidade de Processamento Central (CPU): É responsável pela interconexão de todos os blocos

internamente no microcontrolador e também pela execução do programa.

4 - Instruções

O ciclo de instrução de um microcontrolador é composto por dois passos, o passo de busca

chamado de “fetch” e o passo de execução da instrução. Esses dois passos se dividem em diversos

passos que pode dependem de alguns fatores. A lista geral de passos é:

1 - Busca a instrução na memoria

2 - Decodificação da instrução

3 - Calculo do endereço do operando

4 - Busca do operando

5 - Operação do dado

6 - Calculo do endereço do operando

7 - Armazenação do operando

Dependendo se ha ou não interrupções, esse ciclo pode mudar um pouco. O processador ira

checar ao fim do ciclo de instrução se houve interrupções.

O microcontrolador PIC 16F84A possui um conjunto de 35 instruções. Procurou-se o otimizar o

numero de instrução o máximo possível, aumentando assim a rapidez e a simplicidade de arquitetura do

microcontrolador PIC 16F84A. Entretendo, isso também trousse uma limitação na programação, pois

existe apenas 35 diferente instruções, ou seja, em alguns casos é necessário desenvolver analises não

convencionais para solucionar um problema.

Cada instrução é composta por uma “word” de 14 bits dividida em OPCODE, a qual especifica o

tipo de instrução e um ou mais operadores que especificam a operação da instrução. As operações

podem ser divididas em orientada a byte, a bit e literais e controle. A descrição do OPCODE é mostrada

na tabela abaixo:

Tabela 2 - Campos do OPCODE

Campo Descrição

f

Registrador de endereço; Referência a

um registrador

w

Registrador temporário para as

operaçõe na ULA (acumulador)

b

Refere-se ao bit específico dentro de

um byte

Conjunto de instruções do PIC 16F84A

Tabela 3 - Instruções PIC 16F84A

INSTRUÇÃO ARGUMENTO

DESCRICAO

ADDLW k

Soma a constante k ao valor memorizado no acumulador

W e coloca o resultado no acumulador.

ADDWF f,d

Soma o valor contido no acumulador W com o valor

contido no registrador endereçado pelo parâ metro f.

ANDLW k

Efetua o AND bit a bit entre o valor contido no

acumulador W e o valor constante k. O resultado será

memorizado no acumulador.

ANDWF f,d

Efetua o AND bit a bit entre o valor contido no

acumulador W e o valor contido no registrador endereç ado

pelo parâmetro f.

BCF f,b Zera o bit b do registrador no endereç o f.

BSF f,b Coloca em 1 no bit b do registrador que está no endereço f.

BTFSC f,b

Testa o bit b contido no registrador no endereç o f e pula a

pró xima instrução se este valer 0.

BTFSS f,b

Testa o bit b contido no registrador do endereç o f e pula a

instrução seguinte se este for 1.

CALL k

Chama uma subrotina memorizada no endereç o k. O

parâmetro k pode ser especificado utilizando-se

diretamente o valor numé rico do endereç o ou então o

relativo label.

CLRF f

Zera o valor contido no registrador endereç ado pelo

parâmetro f.

CLRW

Zera o valor contido no registrador W.

CLRWDT

Utilizada quando programarmos o PIC 16F84A com a

opção Watchdog. Nesta modalidade o microcontrolador

PIC habilita um timer que, uma vez transcorrido um

determinado tempo, efetua o reset do mesmo. Para evitar o

reset do nosso programa deveremos executar ciclicamente

a instrução CLRWDT para zerar o timer antes deste

tempo. Se não zerarmos o WDT neste tempo, o circuito de

watchdog interpretará este como um bloco de programa

em execuç ão e efetuará o reset para bloquea-lo.

COMF f,d

Efetua o complemento do valor contido no registrador

endereç ado pelo parâ metro f.

DECF f,d

Decrementa o conteú do do registrador endereçado pelo

parâmetro f.

DECFSZ f,b

Decrementa o valor de registrador do endereç o f e se o

resultado for zero pula a pró xima instrução.

GOTO k

Determina o desvio incondicional do programa em

execução para o endereç o k. O parâmetro k pode ser

especificado utilizando-se diretamente um valor numérico

do endereço ou então o relativo label.

INCF f,d Incrementa o conteú do do registrador no endereç o f.

INCFSZ f,b

Incrementa o valor do registrador f e se o resultado for

zero pula a pró xima instrução.

IORLW k

Efetua o OR inclusive entre o valor contido no acumulador

W e o valor da constante k.

IORWF f,d

Efetua o OR inclusive entre o valor contido no acumulador

W e o valor contido no registrador endereç ado pelo

parâmetro f.

MOVLW k Passa ao acumulador W um valor constante k.

MOVVF f,d

Copia o conteú do do registrador endereç ado pelo

parâmetro f para o parâ metro de destino d.

MOVWF f

Copia o conteú do do registrador W no registrador de

parâmetro f.

NOP

Esta instrução não executa nenhuma operaç ão mas é útil

para inserir atrasos de um ciclo de maquina ou mais.

RETFIE

Esta instrução deve ser colocada no té rmino de cada

subrotina de controle de interrupç ões para retornar o

controle ao programa principal.

RETLW k

Retorna o controle de uma rotina ao programa principal. A

diferença desta em relaç ão à instrução RETURN é que

retflw permite retornar, atravé s do acumulador W, o valor

k ao programa principal.

RETURN

Esta instrução deve ser inserida no termino de cada

subrotina para retornar a execução ao programa principal.

RLF f,b

Rotaciona o bit contido no registrador do endereç o f para a

esquerda (ou seja do bit menos significativo para o mais

significativo) passando pelo CARRY do registrador

STATUS.

RRF f,b

Rotaciona o bit contido no registrador do endereç o f para

direita (ou seja do bit mais significativo para o menos

significativo) passando pelo bit CARRY do registrador

STATUS.

SLEEP

Bloqueia a execuç ão do programa em andamento e coloca

o PIC em standby.

SUBLW k

Subtrai a constante k do valor memorizado no acumulador

W.

5 - Interrupções

O microcontrolador PIC 16F84A possui quatro fontes de interrupções: Interrupções externas no

pino RB0/INT; Interrupções de overflow TMR0; Interrupções por mudança de estado PORTB; E

interrupções de fim de escrita EEPROM.

Quando uma interrupção ocorre ela fica como pendente, e no próximo ciclo de busca o

processador ira tratar essa interrupção. Quando a interrupção é tratada, o processador suspende a

execução do programa que esta sendo executado e salva seu contexto. Depois o processador irá

armazenar no contador do programa o endereço inicial de uma rotinha de tratamento de interrupção.

O registrador de controle de interrupções (INTCON) grava todas as interrupções como bits de

flag, e também armazena o bit de habilitação de interrupção global (GIE). O GIE habilita ou desabilita

todas as interrupções de uma só vez, e ele é resetado no RESET.

Quando uma interrupção é tratada, o bit GIE é limpado para desabilitar qualquer interrupção

futura, o endereço de retorno é colocado numa STACK e o PROGRAM COUNTER (PC) é carregado

com 0004h. Para interrupções externas (RB0/INT or PORTB) a latência será três à quatro ciclos de

instrução. A latência depende quando a interrupção ocorre e é a mesma para um ou dois ciclos. A fonte

da interrupção pode ser determinada através dos bits de flag. O bit de flag deve ser limpado através de

software antes da reabilitação do “sistema” de interrupções para evitar infinitas interrupções. Uma

interrupt flag é um bit que indica qual foi o tipo de interrupção.

Portanto, o INTCON pode habilitar ou desabilitar os bits de interrupções independentemente (

tipos de interrupções). A figura a seguir mostra como funciona o quadro de interrupções do PIC 16F84A

Figure 4 - Lógica de interrupção

4.1 - Interrupções externas

Esse tipo de interrupção é gerado por um sinal externo conectado ao pino RB0/INT. Portando,

essa porta serve como entrada para um sinal que pode ser processado internamento do microcontrolador.

Interrupções externas no pino RB0/INT é elevado (de 0 para 1) quando o bit INTEDG é setado e baixa (

de 1 para 0) quando o bit INTEDG é limpado. Quando uma borda válida (subida ou descida) aparece no

pino RB0/INT, o bit INTF é setado. Esse tipo de interrupção pode ser desabilitada limpando-se o bit de

controle INTE. O bit de flag INTF deve ser limpo através de software via Rotina de Serviço de

Interrupção antes de habilitar essa interrupção. A interrupção externa pode ligar o processador do modo

“SLEEP” se o bit INTE for setado antes dele entrar no modo “SLEEP”. O status do bit GIE decide se as

conexões do processador para o vetor de interrupção também ligaram ou não.

4.2 - Interrupções de overflow TMR

Esse tipo de interrupção ocorre quando o contador TMR0 estoura. Esse contador é geralmente

utilizado para contar o tempo, e ele pode ser incrementado tanto pelo clock como por um sinal externo.

Um overflow em TMR0 ira setar o bit T01F. A interrupção pode se habilitada ou desabilitada setando ou

limpando o bit de habilitação T01E.

Parte 2 – Acesso à memória cache

1 – Análise das configurações da cache

Cada “word” na arquitetura computacional estudada representa 1 byte, que por sua vez é o

mesmo que 8 bits. Portanto, temos que:

A memória cache é representada de um conjunto que espaços que nós chamamos cada um desses

espaços como uma linha de uma pilha. Cada linha da memoria cache contem um campo para o

endereço “tag” e outro campo para o dado em si. O dado armazenado na memória cache é

geralmente um bloco de vários endereços, e não apenas um endereço. Sendo assim, cada linha da

cache pode armazenar um bloco de n “words”. Para sabermos quantas linhas uma memória cache

possui, basta dividir o número total de “words” pelo número de “words” que cada linha armazena.

Portanto, temos que:

A memoria principal armazena apenas uma “word” de 8 bits em cada endereço dela. No

mapeamento direto, nos temos que o a quantidade de “linhas” da memoria principal é muito maior

que a quantidade de linhas da memoria cache. O nosso problema consistia em uma memória

principal de 1024 posições e uma memória cache que variava segundo os casos descritos a seguir.

1.1 Caso 1: Cache com 128 words

Nesse caso, a memória cache é composta por 128 “words”.

Tamanho da memória cache em bits:

Quantidade de linhas:

Caso A: Linha com 4 words

Tamanho do endereço das “words” em bits:

!"#$%

= 𝑄𝑡𝑑𝑃𝑜𝑠𝑖çõ𝑒𝑠

!"#$%

Logo, para acessar uma “word” em uma linha da cache com 4 “words” por bloco, se faz

necessário um endereço de 2 bits para diferenciar a “word” nessa linha.

Analisando o mapeamento da memória principal para esse caso, veremos que cada 4 endereços

da memória principal representa um bloco, que será armazenada em uma linha da memória cache.

Os endereços 0 !"

ao 3

!"

serão colocados na linha 0

!"

da memoria cache, já que ela comporta um

bloco de 4 “words”. Quando chegar no endereço 127

!"

, ele armazena esse endereço na ultima

posição da memória cache, a posição 31 !"

. A memória cache pode armazenar até 32 blocos

simultâneos, logo o próximo endereço da memoria principal será armazenado na posição 0

!"

da

cache. Caso já haja um outro bloco nessa linha da cache, ele será removido e colocado o novo bloco

atualizando a respectiva “tag”. Logo, a linha 0

!

da memória cache armazena um conjunto

predefinido de possíveis “tags” da memória principal (a “tag” da cache é igual a “tag” da memória

principal). Para esse caso, a representação do endereço da “word” será de 2 bits, já que são 4

“words” por bloco. Logo, a memória cache vai endereçar cada “word” a partir da do endereço de

dois bits reservado para o campo “word”. Vale salientar, que toda essa sequencia de tag, endereço da

“word” e mapeamento da memória principal na cache é obtida do endereço completo de um

elemento na memoria principal.

Caso B: Linha com 8 words

Tamanho do endereço das “words” em bits:

!"#$%

= 𝑄𝑡𝑑𝑃𝑜𝑠𝑖çõ𝑒𝑠

!"#$%

Logo, para acessar uma “word” em uma linha da cache com 8 “words” por bloco, se faz

necessário um endereço de 3 bits para diferenciar a “word” nessa linha.

O tamanho do endereço das “words” em bits segue o mesmo raciocínio da cache acima de 128

words com 4 words por linha. Logo, para acessar uma “word” em uma linha da cache com 4

“words” por bloco, se faz necessário um endereço de 2 bits para diferenciar a “word” nessa linha.

As configurações seguintes segue o mesmo raciocínio aplicado na cache de 128 words.

Analisando o mapeamento da memória principal para esse caso, veremos que cada 4 endereços

da memória principal representa um bloco, que será armazenada em uma linha da memória cache.

Os endereços 0 !"

ao 3

!"

serão colocados na linha 0

!"

da memoria cache, já que ela comporta um

bloco de 4 “words”. Quando chegar no endereço 255 !"

, ele armazena esse endereço na ultima

posição da memória cache, a posição 63 !"

. A memória cache pode armazenar até 64 blocos

simultâneos, logo o próximo endereço da memoria principal será armazenado na posição 0

!"

da

cache. Caso já haja um outro bloco nessa linha da cache, ele será removido e colocado o novo bloco,

atualizando a respectiva “tag”. Logo, a linha 0 !

da memória cache armazena um conjunto

predefinido de possíveis “tags” da memória principal (a “tag” da cache é igual a “tag” da memória

principal). Para esse caso, a representação do endereço da “word” será de 2 bits, já que são 4

“words” por bloco. Logo, a memória cache vai endereçar cada “word” a partir do endereço de dois

bits reservado para o campo “word”. Vale salientar, que toda essa sequencia de tag, endereço da

“word” e mapeamento da memória principal na cache é obtida do endereço completo de um

elemento na memoria principal.

Caso B: Linha com 8 words

Para esse caso e os demais casos, o mapeamento na da cache na memória principal será análogo

a analise descrita acima mudando o tamanho do bloco e a quantidade de linhas da cache.

Caso C: Linha com 16 words

Caso A: Linha com 32 words

1.3 Caso 3: Cache com 512 words

Nesse caso, a memória cache é composta por 512 “words”.

Tamanho da memória cache em bits:

Quantidade de linhas:

Caso A: Linha com 4 words

O mapeamento da memória cache da memória principal será análogo ao descrito no caso 2,

mudando apenas a quantidade de linhas da cache.

Caso B: Linha com 8 words

Para esse caso e os demais casos, o mapeamento na da cache na memória principal será análogo a

analise descrita acima mudando o tamanho do bloco e a quantidade de linhas da cache.

Caso C: Linha com 16 words