Flash e EEPROM

14

A folha de dados do Atmega16 diz que possui

a) 16 Kbytes de memória de programa Flash auto-programável no sistema eb) EEPROM de 512 bytes.

Um microcontolador pode ter duas ROMs separadas que podem ser programadas através da tecnologia EEPROM e da tecnologia Flash?

Ou A minha inferência (conforme fornecida acima) da folha de dados está errada?

Sei que nosso programa está armazenado na memória flash e por que alguém precisará de EEPROM? Para que serve se tivermos memória flash para o programa?

Também qualquer um pode explicar qual é o termo "Auto-programável no sistema"

O que eu sei: a tecnologia Flash pode gravar o programa em blocos de dados, enquanto a EEPROM pode gravar dados byte a byte.

Jasser
fonte

Respostas:

21

Atualmente, a memória Flash é usada para armazenar o código do programa e a EEPROM (Memória somente leitura apagável eletricamente) é usada para armazenar dados persistentes. Há cerca de 30 anos, antes da criação do Flash, as EEPROMs eram usadas para armazenar o código do programa.

Na verdade, a ROM (memória somente leitura) veio primeiro, depois o PROM (ROM programável, apenas uma vez), EPROM (PROM apagável com luz UV), EEPROM e, finalmente, o Flash. As ROMs ainda são usadas para aplicativos de alto volume e baixo custo (por exemplo, cartões comemorativos).

A diferença importante com os microcontroladores atuais é que geralmente não é possível executar código fora da EEPROM, e é estranho os programas armazenarem dados em flash. (Os dados são armazenados em flash quando, por exemplo, você usa a palavra-chave "const" em uma declaração de dados ou define uma string, mas isso é tratado nos bastidores pelo compilador e vinculador.)

A área EEPROM pode ser usada para manter a configuração ou outros dados que você deseja disponibilizar durante as reinicializações, incluindo se o microcontrolador perdeu energia e depois é ligado novamente. Funcionalmente, você pode pensar na EEPROM como um disco rígido ou cartão SD muito pequeno.

Em microcontroladores sem EEPROM, é possível armazenar dados persistentes na memória flash, mas isso se torna difícil, uma vez que os microcontroladores não foram realmente projetados para isso, e você precisa encontrar um local especial que não interfira no código do programa e deixar isso de lado. com o vinculador. Além disso, como mencionado abaixo, você geralmente pode atualizar a EEPROM muitas vezes mais do que o flash.

Se você programar dados em flash, isso não significa que você pode acessar os dados como variáveis ​​em seu programa C, porque não há como informar ao compilador onde essas variáveis ​​estão no seu código (ou seja, você não pode vincular uma const variável para esta área do flash.) Portanto, a leitura deles deve ser feita através do conjunto especial de registros que são usados ​​para escrevê-los. Observe que esta restrição também se aplica aos dados na EEPROM, portanto, não possui vantagens nesse sentido.

Para programar o flash ou a EEPROM, primeiro um bloco de memória deve ser apagado. Então é programado. Para o flash, a escrita também costuma ser feita um bloco de cada vez. Para EEPROMs, isso pode ser feito por blocos ou um byte por vez, dependendo do microcontrolador.

Para flash e EEPROMs, existe um número máximo de vezes que você pode atualizá-los antes de esgotar a memória. Esse número é fornecido na folha de dados como um valor mínimo garantido. Geralmente é muito mais alto para EEPROMs do que para memória flash. Para flash, vi números tão baixos quanto 1000. Para EEPROMs, vi números tão altos quanto 1.000.000.

Uma vantagem das EEPROMs sobre o flash é que você pode apagá-las muito mais vezes do que o flash.

"Auto-programável no sistema" significa simplesmente que o microcontrolador pode atualizar seu próprio flash durante a execução. O recurso geralmente é usado para atualizar o código no campo. O truque é que você precisa deixar algum código no sistema enquanto o programa principal está sendo atualizado, chamado de carregador de inicialização. Esse esquema é usado no sistema Arduino para programar o chip.

tcrosley
fonte
Obrigado pela sua resposta, senhor. Então, para inserir dados na EEPROM, precisarei de um programador da EEPROM como em um programador USBASP para despejar o programa na memória flash? Estou certo, senhor.
Jasser
1
@ Jasser Não, você não precisa de um programador externo. Você acessará a EEPROM de dentro do seu programa. Haverá um conjunto de registros dentro do ATmega que, escrevendo para eles, permitirá que você atualize a EEPROM. Você também precisará usar esses registros para ler a EEPROM, pois ela não aparecerá no mapa de endereços normal. As informações sobre como apagar, escrever e ler a EEPROM estarão na folha de dados do chip.
Tcrosley
Como podemos escrever ou ler a partir da EEPROM dentro do microcontrolador, o microcontrolador deve ter um circuito para armazenar dados na EEPROM e que deve ser semelhante ao programador da EEPROM. Isso novamente me leva a outra pergunta que, como a EEPROM pode ser ativada aproximadamente 100.000 vezes, talvez não seja possível armazenar dados na EEPROM por meio dos registros. Essas declarações são significativas? @tcrosley
Jasser
1
@Jasser Correto, há um limite no número de vezes que você pode atualizar a EEPROM. Isso geralmente é muito maior (às vezes uma ordem de magnitude maior) do que o número de vezes que você pode atualizar o flash. Eu deveria ter mencionado isso na minha resposta e vou atualizá-lo. O número que você citou é um mínimo garantido pelo fabricante do chip; Fiz alguns testes uma vez com um chip especificado para 100.000 gravações e ultrapassou os 500.000 antes que quaisquer erros fossem detectados.
Tcrosley
1
@Jasser Sim, é um pouco mais difícil configurar os dados em flash. Além disso, conforme discutido na minha atualização da minha resposta, você pode apagar e reprogramar a EEPROM muitas vezes mais (normalmente 10x) do que o flash.
Tcrosley
4

Acrescentarei mais algumas informações à excelente resposta de @tcrosley.

O ATmega16 implementa uma arquitetura de Harvard , isto é, uma topologia de sistema em que a memória de dados é separada da memória do programa. Citando o parágrafo relevante da folha de dados do Atmega16 (página 8):

Para maximizar o desempenho e o paralelismo, o AVR usa uma arquitetura de Harvard - com memórias e barramentos separados para programa e dados. As instruções na memória do programa são executadas com um pipelining de nível único. Enquanto uma instrução está sendo executada, a próxima instrução é pré-buscada na memória do programa. Este conceito permite que as instruções sejam executadas em cada ciclo do relógio. A memória do programa é a memória Flash reprogramável no sistema.

A arquitetura de Harvard tem a vantagem de não haver contenção de barramento entre os ciclos de busca de instruções e os ciclos de acesso a dados, uma vez que dados e instruções não compartilham o mesmo barramento, como na arquitetura de PC convencional.

Portanto, a memória flash é usada como memória do programa, enquanto a memória de dados é dividida entre SRAM (para dados transitórios, como pilha de chamadas de funções e heap - se você estiver programando em C, por exemplo) e a EEPROM (para armazenamento permanente) .

Lorenzo Donati apoia Monica
fonte