Estoy usando un microcontrolador PowerPC de escala libre. En el módulo de memoria flash en la hoja de datos, el número de "estados de espera del acceso a la memoria flash" es configurable.
La siguiente es la parte de la hoja de datos que planteó mi pregunta, está tomada de la descripción del registro de los registros del módulo PFlash:
Este campo debe establecerse en un valor correspondiente a la frecuencia operativa del PFlash y el tiempo de acceso de lectura real del PFlash. Las frecuencias operativas más altas requieren configuraciones distintas de cero para este campo para una operación Flash adecuada.
0 MHz, < 23 MHz, estados de espera requeridos = 0 ---
23 MHz, < 45 MHz, estados de espera requeridos = 1 ---
45 MHz, < 68 MHz, estados de espera requeridos = 2 ---
68 MHz, < 90 MHz, estados de espera requeridos = 3 ---
(PFlash es el módulo del controlador Platform Flash)
Entiendo que el procesador es más rápido que el flash, por eso se introducen estados de espera. Lo que no entiendo es: si el procesador es más rápido que el flash, entonces el procesador es el que debe ralentizarse, no el flash, pero el párrafo anterior dice lo contrario (¿o no entendí esto?), dice que en caso de que el Pflash funcione con altas frecuencias, ¡entonces debemos reducir la velocidad al agregarle estados de espera adicionales!
¿Qué hay de malo en mi comprensión?
Gracias
Para amplificar la respuesta de stevenvh, cualquier tipo de lógica, cuando se le da una señal de entrada, tardará algún tiempo en producir una señal de salida; la memoria es a menudo muy lenta en comparación con otra lógica. A menudo, habrá una garantía de que la señal de salida será válida dentro de un cierto período de tiempo, pero eso es todo. En particular, es posible que la señal cambie varias veces dentro de ese intervalo, y no habrá ninguna indicación, antes del final de ese intervalo, de que la señal ha alcanzado su valor final "correcto".
Cuando un microcontrolador o microprocesador típico lee un byte (o palabra, o la unidad que sea) de la memoria, genera una dirección y, algún tiempo después, observa el valor de salida de la memoria y actúa en consecuencia. Entre el momento en que el controlador genera la dirección y el momento en que mira el valor de la memoria, no le importa cuándo o si cambian las señales de salida de la memoria. Por otro lado, si la señal de la memoria no se ha estabilizado en su valor final en el momento en que el controlador la mira, el controlador leerá mal la memoria como si hubiera retenido el valor que se estaba emitiendo en el momento en que la miró. Normalmente, el controlador miraría el valor de la memoria tan pronto como estuviera listo para hacer algo con él, pero si el valor de la memoria no estuviera listo en ese momento, es posible que no funcione. Como consecuencia, muchos controladores tienen la opción de esperar un poco más después de estar listos para procesar datos de la memoria, para garantizar que la salida de la memoria sea realmente válida. Tenga en cuenta que agregar dicho retraso ralentizará las cosas (el controlador habría estado feliz de actuar sobre los datos de la memoria antes), pero no afectará la corrección de la operación (a menos que las cosas se ralenticen tanto que no se puedan cumplir otras obligaciones de tiempo).
Los estados de espera se agregan al ciclo de acceso a la memoria iniciado por la CPU. Entonces, de hecho, es la CPU la que tiene que esperar al Flash más lento. El controlador de memoria indica "no listo" a la CPU durante un número de ciclos (0 a 3), y mientras lo hace, la CPU permanece en su estado actual, es decir, ha escrito la dirección Flash, pero aún no lee los datos. Solo cuando el controlador de memoria señale "datos listos", la CPU leerá del bus de datos y continuará su instrucción (enganchando los datos en un registro o en la RAM).
Es posible que el procesador deba detenerse en la memoria, pero un diseño inteligente no sería necesario.
Creo que la tecnología clave de la que no está al tanto es el acceso en modo ráfaga/página . Eso permite que el ancho de banda de los accesos a la memoria esté muy cerca de la velocidad del procesador (pero probablemente Flash siga siendo el cuello de botella ya que nunca he visto una MCU basada en Flash que se ejecute a> 200MhZ)
Sin embargo, la latencia sigue siendo la misma. Por ejemplo, para las MCU STM32F4 que estoy usando, #estados de espera = piso (velocidad del reloj / 30MhZ). Eso significa que la latencia siempre es de 33 ns, independientemente de la velocidad del reloj. Hay un dicho: "El dinero puede comprar ancho de banda, pero la latencia es para siempre..."
Incluso si el ancho de banda de Flash no fuera suficiente para mantener ocupada la CPU, puede diseñar fácilmente un caché de código que almacene y obtenga previamente las instrucciones que se espera que se ejecuten. ST tiene una pista sobre esto para sus MCU STM32F4 (168 MhZ):
Gracias al acelerador ART y la memoria Flash de 128 bits, el número de estados de espera dados aquí no afecta la velocidad de ejecución de la memoria Flash, ya que el acelerador ART permite lograr un rendimiento equivalente a la ejecución del programa en estado de espera 0.
En realidad, la declaración también sugiere que el modo de ráfaga no es necesario y que una interfaz de memoria muy amplia también es suficiente. Pero la idea es la misma (utilizar el paralelismo para ocultar la latencia). En el chip, los cables son libres, por lo que una memoria de 128 bits tendría sentido.
clabacchio