segunda-feira, fevereiro 22, 2016

Arduino Due - Parte 2

Nesta segunda e última parte, vamos ver um pouco sobre memória, carga de programas e o DMA.
Mapa da Memória do SAM3X8E - clique para ampliar

Memória

O SAM3X8E possui uma grande quantidade de Ram (96K) e de Flash (512K), porém não possui EEProm. A figura acimamostra o mapa da memória:



A SRAM totaliza 100K no SAM9X8E: um bloco de 64K em SRAM0, um bloco de 32K em SRAM1 e um bloco de 4K no controlador de NAND Flash e que pode ser usado por aplicações já que o Arduino DUE não tem uma NAND Flash externa.

A ROM interna possui dois programas gravados na Flash: SAM-BA e FFPI. O SAM-BA é um bootloader que suporta comunicação pela UART e pela USB. Como veremos adiante, é através dele que a IDE do Arduino carrega sketches. O FFPI é um outro bootloader, voltado para a gravação em paralelo de múltiplos SAM3X8E fora da placa final. Seu uso típico é a gravação em volume na linha de produção.

A execução sempre começa no endereço 0 (Boot memory na figura), o SAM3X8E pode ser configurado para manear a Flash0 ou a RAM interna neste endereço.

Os 512K de Flash são divididos em dois bancos de 256K (Flash 0 e Flash 1). Cada banco, por sua vez, é divido em 1024 páginas de 256 bytes. Uma página é o mínimo que pode ser apagado de cada vez. A Flash suporta entre 10 e 30 mil apagamentos, dependendo da temperatura. Além do apagamento por programa, o SAM3X8E possui um pino que apaga toda a Flash e coloca a configuração no estado padrão. O Arduino DUE possui um botão ligado a este pino.

Carga de Programas

Existem várias estratégias possíveis para carga de programas no SAM3X8E. A opção usada no Arduino DUE é usar o pino de ERASE para apagar a Flash e selecionar a configuração padrão e em seguida dar um Reset. Nestas condições o SAM3X8E irá executar o SAM-BA contido na Rom, permitindo a carga do programa pela serial ou pela USB nativa.

Os sinais ERASE e  Reset são controlados pelo ATmega16U2 que está conectado à serial do SAM3X8E e à USB identificada como Programming. O ATmega16U2 se comporta para o host ligado ao USB como dispositivo de comunicação - uma porta serial virtual. Normalmente, quando uma conexão é feita pela USB o SAM3X8E é ressetado, simulando o auto-reset do Arduino Uno e inciando a execução do sketch. Entretanto, se a conexão for feita a 1200 bps, o ATmega16U2 considera isto como uma solicitação de preparo para carga de sketch. Para isto ele aciona o sinal ERASE e, posteriormente, o Reset.

Uma vez colocado o SAM3X8E no "modo SAM-BA", a IDE do Arduino usa um programa externo para fazer a carga (de forma semelhante ao uso do avrdude para gravar sketches nos Arduinos baseados nos microcontroladores AVR). O programa utilizado é o BOSSA (ugh!).

DMA

O recuso de DMA (Direct Memory Access) é bastante comum em microprocessadores, mas não costuma estar disponível nos microcontroladores mais simples (como os ATmega).

Em um processador sem recurso de DMA, a movimentação de dados entre a memória e um periférico é feita de uma sequência de instruções do tipo
  1. Espera o periférico estar pronto
  2. Movo o proximo byte entre a memória e o periférico
Caso o tratamento de cada byte no periférico seja demorado, o passo 1 pode ser feito via interrupção. Entretanto, se o tratamento for rápido (por exemplo, uma transmissão a uma taxa alta), o mais comum é o software ficar em loop executando os passos 1 e 2 até que todos os bytes sejam transferidos. Ou seja, o processador fica totalmente dedicado à transferência.

Com DMA o periférico transfere o byte diretamente de ou para a memória, sem envolver a CPU. Dependendo da arquitetura e da velocidade da memória, os ciclos para o DMA podem ser "roubados" da CPU, reduzindo o seu desempenho. Mesmo assim, é muito mais eficiente.

O SAM3X8E possui recursos bem completos de DMA:
  • Pode ser usado com ADC, DAC, PWM e interfaces seriais (I2C, SPI, UART e USART)
  • Suporta conexões unidirecionais e bidirecionais
  • Gera interrupção de final de transferência
  • Possibilita programar o endereço e tamanho da próxima transferência antes de finalizar a atual.


Referências

http://www.atmel.com/Images/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet.pdf
http://playground.arduino.cc/Bootloader/DueBootloaderExplained

Nenhum comentário: