segunda-feira, setembro 01, 2008

Microcontroladores - Parte 11

Como exemplo seguinte de microcontrolador, vamos examinar o 8051.

Este microcontrolador foi projetado pela Intel porém sua arquitetura é utilizada por vários fabricantes (Texas, Atmel, ST, NXP e outros). É uma arquitetura Harvard (como o PIC) porém "amenizada" em vários aspectos.

Como exemplo de microcontrolador derivado do 8051 escolhi o Texas CC1010:
  • Clock de 3 a 24MHz
  • Flash de 32KB (organizada em 128 páginas de 256 bytes, cada página pode ser apagada e regravada separadamente, inclusive por controle do firmware)
  • Ram de 128bytes + 2KB (veremos isto melhor adiante)
  • até 26 E/S digitais
  • ADC de 10 bits
  • RTC
  • WDT
  • 4 timers (2 com PWM)
  • 2 UARTS
  • SPI
A figura abaixo mostra o mapa da memória do CC1010:
A memória está dividida em três regiões distintas (DATA, XDATA e CODE); instruções diferentes são utilizadas para acessar cada uma delas. As regiões DATA e XDATA são de memória Ram e a CODE de memória Flash. Todas as regiões estão organizadas em bytes; no caso do código (região CODE) as instruções tem tamanho variável.

Somente a região DATA permite acesso direto (com o endereço codificado diretamente na instrução). O acesso às outras duas regiões é indireto: o endereço deve ser colocado em um registrador, o que torna o acesso mais complicado e lento (para acesso a variáveis individuais).

Como no PIC, uma região de endereçamento da Ram corresponde a registradores de controle do microprocessador - é a que está marcada como SFR na figura.

Do ponto de vista de registradores de uso geral, o CC1010 possui uma quantidade bem maior que o PIC:
Os registradores R0 a R7 podem ser usados livremente. O registrador PSW é o status do processador e ACC o acumulador. SP é o stack pointer; o stack no 8051 reside na área DATA e pode ter, teoricamente, até 128 bytes. Ao contrário do PIC, o stack não está limitado a endereços de código. Para acesso indireto a XDATA é o usado o Data Pointer DP. Existem dois pares de DP no CC1010 e em cada um deles a parte alta e baixa pode ser acessada individualmente, resultando nos registradores DPH0, DPL0, DPH1 e DPL1.

Resumindo, o 8051 possui algumas excentricidades mas é um processador bem mais agradável de programar em Assembler que o PIC.

Como exemplo de ambiente de desenvolvimento em C, vamos examinar o Keil uVision2 (que não é a versão mais recente). A Keil é uma empresa alemã bastante tradicional neste segmento. O uVision é um produto extremamente profissional e tem uma documentação excelente.

O pacote inclui uma boa IDE (faz falta somente algo parecido ao Intelisense do Visual Studio), assembler, compilador, linker, locator (aplicativo que define os endereços absolutos onde ficarão código e dados) e debugger.

O compilador C possui uma biblioteca padrão boa e mais bibliotecas específicas para vários modelos de microcontroladores baseados na arquitetura 8051.

Para suportar as várias regiões de memória a Keil utiliza os modificadores DATA, XDATA e CODE:
char *p;
char code *p;
char xdata * data p;
Na primeira linha temos um ponteiro genérico para um char. Como este char pode estar em qualquer uma das regiões, o Keil aloca três bytes para este ponteiro: um para indicar a região referênciada e dois para o endereço na região. Embora genérico, este tipo de ponteiro é muito ineficiente: a cada acesso é preciso testar qual região está sendo endereçada e desviar para as intruções adequadas. Desta forma um simples *p vira uma lenta chamada de subrotina.

Na segunda linha estamos informando que p aponta para um char que está na área CODE. isto permite gerar código bem mais eficiente.

É claro que o ponteiro em si também está armazenado em algumas das regiões; o Keil permite dizer em qual delas. Na terceira linha temos um ponteiro p armazenad na região DATA que aponta para um char na região XDATA.

Um comentário:

Anônimo disse...

Muito obrigado! Foi de grande ajuda...