Estou usando um microcontrolador PowerPC em escala livre. No módulo de memória flash da folha de dados, o número de "estados de espera do acesso à memória flash" é configurável.
A seguir, a parte da folha de dados que foi levantada, foi retirada da descrição do registro dos registros do módulo PFlash:
Este campo deve ser definido como um valor correspondente à frequência de operação do PFlash e ao tempo real de acesso de leitura do PFlash. Frequências operacionais mais altas exigem configurações diferentes de zero para este campo para uma operação adequada do Flash.
0 MHz, <23 MHz, estados de espera necessários = 0 a
23 MHz, <45 MHz, estados de espera necessários = 1 a
45 MHz, <68 MHz, estados de espera necessários = 2 a
68 MHz, <90 MHz, estados de espera necessários = 3 ---
(PFlash é o módulo do controlador Platform Flash)
Entendo que o processador é mais rápido que o flash, é por isso que os estados de espera são introduzidos. O que eu não entendo é: se o processador é mais rápido que o flash, então é o processador que precisa ser mais lento, não o flash, mas o parágrafo acima diz o contrário (ou eu não entendi isso?) diz que, caso o Pflash seja operado com altas frequências, precisamos abrandá-lo adicionando estados de espera adicionais !!
O que há de errado com meu entendimento?
obrigado
Respostas:
Para amplificar a resposta de stevenvh, qualquer tipo de lógica, quando receber um sinal de entrada, levará algum tempo para produzir um sinal de saída; a memória geralmente é muito lenta em comparação com outra lógica. Freqüentemente, haverá uma garantia de que o sinal de saída se tornará válido dentro de um certo período de tempo, mas é isso. Em particular, é possível que o sinal mude várias vezes dentro desse intervalo, e não haverá indicação, antes do final desse intervalo, de que o sinal atingiu seu valor "correto" final.
Quando um microcontrolador ou microprocessador típico lê um byte (ou palavra, ou qualquer unidade) de memória, ele gera um endereço e, algum tempo depois, analisa o valor emitido pela memória e age sobre ele. Entre o momento em que o controlador gera o endereço e o tempo em que olha o valor da memória, não se importa quando ou se os sinais de saída da memória mudam. Por outro lado, se o sinal da memória não tiver se estabilizado em seu valor final no momento em que o controlador olhar para ele, o controlador interpretará mal a memória como tendo mantido qualquer valor que estava sendo emitido no momento em que olhou. Normalmente, o controlador examinaria o valor da memória assim que estivesse pronto para fazer algo com ele, mas se o valor da memória não estivesse pronto, isso poderia não funcionar. Consequentemente, muitos controladores têm a opção de esperar um pouco mais depois de estarem prontos para processar dados da memória, para garantir que a saída da memória seja realmente válida. Observe que adicionar esse atraso reduzirá a velocidade das coisas (o controlador ficaria feliz em agir sobre os dados da memória mais cedo), mas não afetará a correção da operação (a menos que as coisas diminuam a velocidade tanto que outras obrigações de tempo não possam ser cumpridas).
fonte
Os estados de espera são adicionados ao ciclo de acesso à memória iniciado pela CPU. Portanto, é realmente a CPU que precisa aguardar o Flash mais lento. O controlador de memória sinaliza "não está pronto" para a CPU por vários ciclos (0 a 3) e, enquanto o faz, a CPU permanece em seu estado atual, ou seja, tendo escrito o endereço Flash, mas ainda não está lendo os dados. Somente quando o controlador de memória sinaliza "dados prontos", a CPU lê o barramento de dados e continua suas instruções (travando os dados em um registro ou na RAM).
fonte
O processador pode precisar travar na memória, mas um design inteligente não precisa.
Acho que a principal tecnologia que você não conhece é o acesso ao modo burst / página . Isso permite que a largura de banda dos acessos à memória esteja muito próxima da velocidade do processador (mas provavelmente o Flash ainda é o gargalo, pois nunca vi um MCU baseado em Flash que roda a> 200MhZ)
No entanto, a latência permanece a mesma. Por exemplo, para os MCUs STM32F4 que estou usando, #wait states = floor (clockSpeed / 30MhZ). Isso significa que a latência é sempre 33ns, independentemente da velocidade do relógio. Há um ditado: "O dinheiro pode comprar largura de banda, mas a latência é para sempre ..."
Mesmo que a largura de banda do Flash não seja suficiente para manter a CPU ocupada, é possível criar facilmente um cache de código que armazene e prefira instruções que se espera que sejam executadas. O ST tem uma dica sobre isso para seus MCUs STM32F4 (168 MhZ):
Na verdade, a declaração também sugere que o modo burst não é necessário e que uma interface de memória muito ampla também é suficiente. Mas a ideia é a mesma (usando o paralelismo para ocultar a latência). No chip, os fios são livres, portanto uma memória de 128 bits faria sentido.
fonte