Relojes, procesadores y temporizadores en una MCU

1

Así que estoy revisando este excelente libro Patrones para sistemas integrados con activación de tiempo y tengo una pregunta sobre el cálculo de valores para los temporizadores de hardware con precisión. Consulte el patrón de "Retardo de hardware" en el libro anterior.

Mi entendimiento es que, una "fuente de reloj" (también conocida como "Reloj del sistema") genera una serie constante de tics (por ejemplo, f1 khz) que luego se alimenta a través de una unidad de "Prescaler" que la divide (por un factor n que puede ser 1) dando otra frecuencia (digamos f2 = f1 / n khz) que luego se alimenta al procesador. Por lo tanto, el "Reloj del procesador" tiene una frecuencia f2 y un período de tiempo t2 = 1 / f2 ms. Para calcular un intervalo de tiempo preciso (por ejemplo, un temporizador de 100 ms), solo calculamos el número de tics en 100 ms como 100 / t2 = f3 "tics de reloj del procesador". Por lo tanto, debemos configurar los registros de temporizador apropiados para los valores correspondientes a f3 para generar un tick de 100 ms.

Sin embargo, no parece ser tan sencillo (al menos para el 8051) debido a la cantidad de tics requeridos para un "ciclo de instrucciones del procesador". Un procesador realiza su ciclo de instrucción, es decir, "Fetch- > Decode- > Execute- > Interrupt" (las interrupciones se comprueban al final de la instrucción actual) que toma una serie de tics. Lo ideal es que todo el ciclo de instrucciones tome solo 1 tic (p. Ej., Un procesador canalizado) y así pueda usar el cálculo anterior para configurar los temporizadores. Sin embargo, aparentemente en el 8051 original, el reloj del sistema funcionó a 12 mhz y cada ciclo de instrucción tomó 12 tics. Dado que las interrupciones se verifican solo al final del ciclo de instrucciones, ahora necesitamos una división adicional por 12 para obtener la marca de reloj correcta del "temporizador", que es "reloj del procesador" / 12, es decir, f2 / 12.

¿Mi comprensión anterior es correcta? Si es verdadero, ¿cómo puedo calcular los tiempos precisos cuando las instrucciones pueden tener diferentes tics de ciclo (por ejemplo, instrucciones mixtas de 32 y 16 bits)? Además, ¿los temporizadores deben incrementarse a través de un ciclo de instrucciones del procesador o hay una manera en HW de incrementar un registro de temporizador estrictamente sincronizado con la salida de la unidad "Prescaler"?

    
pregunta RamanathanR

1 respuesta

1

La respuesta corta entonces es "depende". Diferentes familias de procesadores utilizarán diferentes enfoques. No hay una sola idea para todos los micros. Además, las interrupciones síncronas (aquellas generadas por el hardware interno sincronizado con algún reloj interno) pueden reconocerse de manera más predecible y diferente que los eventos asíncronos (externos al micro). Como siempre, lea la hoja de datos y mantenga la mente abierta.

El cálculo del tiempo preciso también dependerá del procesador. Incluso si ocurre un evento (coincidencia del contador del temporizador, externo, lo que sea), si su procesador está ocupado ejecutando una instrucción durante varios ciclos, generalmente no abortará la instrucción para iniciar una rutina de interrupción. (Pero algunos procesadores interrumpirán ALGUNAS instrucciones, aunque simplemente dije que no lo hacen. Así que incluso eso no es evangelio y tienes que leer la hoja de datos y las guías familiares para estar seguro). Peor, incluso si el procesador se está ejecutando En una instrucción de un solo ciclo, puede haber alguna variabilidad en la respuesta de interrupción. Por lo tanto, puede encontrar los documentos que dicen "5 a 6 ciclos más tarde", por ejemplo. Así que incluso entonces, no estás exactamente seguro.

Por otro lado, algunos procesadores son tan predecibles como un reloj atómico. El procesador ADSP-21xx de Analog Devices (ciclo único para CADA palabra de instrucción, algunos de los cuales pueden estar realizando tres instrucciones en paralelo), SIEMPRE tiene exactamente el mismo tiempo de respuesta de interrupción, cada vez, a un temporizador evento. Casi se puede configurar su reloj atómico por ella. Ninguna variación, en absoluto. Solo respuestas limpias, perfectas, predecibles. Cada vez.

Pero eso es raro.

Y si su procesador tiene una tubería larga y agradable, es posible que tenga que esperar a que se "drene". Esto se hace para que no haya muchos estados internos que deban restaurarse, reiniciando varias instrucciones en varias etapas de ejecución.

Pero incluso entonces, hay excepciones. El DEC Alpha puede necesitar algunos relojes para llegar a su rutina de interrupción. Pero cuando lo haga, es probable que tenga varias instrucciones en varios estados de las diversas tuberías, todas las cuales están ahí esperando para continuar. Su código de interrupción tendrá que guardar todo ese estado, hacer su trabajo, restaurar ese estado y luego reiniciar ... con todas las tuberías de vuelta donde estaban cuando se interrumpieron. El código de interrupción, si necesita realizar un seguimiento y encontrar una instrucción con fallas, es PELIGRO de escribir. Pero esa cosa gritó. Ni siquiera harían cambios de carril para la selección de bytes porque agregaría un retraso combinatorio que reduciría la velocidad de reloj.

Entonces, eso es raro. Pero sí, incluso eso puede suceder.

SO ...... LEA LA HOJA DE DATOS Y EL MANUAL DE LA FAMILIA. Y prepárate para CUALQUIER COSA en absoluto. Los diseñadores pueden ser MUY CREATIVOS a veces.

    
respondido por el jonk

Lea otras preguntas en las etiquetas