O PIC é bastante popular, principalmente entre hobbistas (entre outros motivos, por estar disponível no encapsulamento DIP que permite uma montagem mais simples).
Uma peculariedade do PIC é que uma série de características são definidas através da gravação de uma área especial de configuração na memória Flash.
Falando em Flash, alguns modelos (mas não todos) possibilitam a implementação de um bootloader (atualização do software sob controle do próprio software).
Um modelo médio é o PIC16F628:
- clock de DC até 20MHz
- memória Flash para 2K instruções (já veremos o que é isto)
- memória Ram de 96 bytes
- memória EEProm de 128 bytes
- até 16 E/S digitais
- 3 timers
- uma UART
- módulo CCP: Capture, Compare e PWM
Mais radical ainda, o PIC utiliza uma Arquitetura Harvard. A idéia básica desta arquitetura é separar a memória de código da memória de dados. A memória de código é dimensionada para guardar uma instrução em cada posição (ou seja, cada posição no PIC16 armazena 14bits) e a de dados é organizada em bytes:
Na figura acima as instruções passam pelas partes em verde e os dados pelas partes em azul. O PIC16 suporta diretamente uma memória de programa com até 8K instruções, usando um contador de programa (PC) com 13 bits. Para tratamento de interrupções e chamada de subrotinas o PIC dispõe de uma pilha (stack) com apenas 8 posições.
As instruções lógicas e aritméticas trabalham sempre com um acumulador, o registrador W. Este registrador, os registradores de controle das funcionalidades (SFR) e a Ram de uso geral (GPR) estão armazenados conjuntamente na memória de dados, que é paginada em bancos (cada banco possui 128 posições, o banco ativo é selecionado através de bits no registrador de status):
Esta arquitetura é particularmente cruel para um compilador de linguagens de alto nível como o C:
- existe pouco suporte para constantes armazenadas na Flash. Comandos como printf("Alo, mundo") requerem um ginástica incrível do compilador para armazenar o string na Flash e acessá-lo posteriormente como parâmetro para uma função.
- não existem ponteiros para rotinas
- pilha reduzida, só para código
- Ram muito reduzida
- "urso andando de bicicleta"
- não possui linker, todo o programa deve estar em um único fonte (#include pode ser usado para dividir o fonte em vários arquivos)
- váriaveis auto (inclusive parâmetros) são implementadas como static
- para aproveitar melhor a Ram, o compilador analisa a árvore de chamada de funções e usa a mesma posição de Ram para variáveis que não existem simultaneamente
- IDE bem simples, com um Wizard para criar o projeto
- Depurador e simulador integrados
- variáveis inteiras dos tipos int1, int8, int16 e int32. int1 é um bit, o compilador agrupa variáveis deste tipo em bytes.
- subconjunto da biblioteca C padrão e mais funções específicas de controle do hardware
Nenhum comentário:
Postar um comentário