En los microcontroladores de la serie Atmel SAM-D21, muchos periféricos usan un reloj que es asíncrono al reloj de la CPU principal, y los accesos a estos periféricos deben pasar por la lógica de sincronización; en periféricos cuyo reloj es lento en relación con el tiempo de CPU, esto puede agregar algunos retrasos realmente grandes. Por ejemplo, si el RTC está configurado para usar un reloj de 1024Hz (como parece ser la intención del diseño) y la CPU está funcionando a 48Mhz, leer el registro de "hora actual" hará que la lógica del bus inserte más de 200,000 estados de espera (un mínimo de cinco ciclos del reloj de 1024Hz). Aunque es posible que la CPU emita una solicitud de lectura, ejecute algún otro código no relacionado y devuelva más de 200,000 ciclos más tarde para recuperar el tiempo, no parece haber ninguna forma de leer el tiempo más rápido.
Según tengo entendido de la sincronización, un circuito de sincronización de un solo bit retrasará una señal en 2-3 ciclos del reloj de destino; sincronizar una cantidad de varios bits es un poco más difícil, pero hay una variedad de enfoques que pueden garantizar un comportamiento confiable dentro de los cinco ciclos del reloj de destino si es más rápido que el reloj de origen, y solo unos pocos ciclos más si no lo es. ¿Qué estaría haciendo el Atmel SAM-D21 que requeriría seis ciclos en el dominio del reloj de origen para la sincronización, y qué factores favorecerían un diseño cuyos retrasos de sincronización son tan largos como para necesitar una interrupción de "sincronización realizada", frente a uno que garantice los retrasos de sincronización son lo suficientemente cortos como para que tales interrupciones sean innecesarias?
fuente
Respuestas:
Esa es una forma diferente de hacerme cosas, estoy acostumbrado a mis arquitecturas donde mis registros están en mi reloj de CPU o al menos la mitad de ese reloj. Entonces escribes tus registros y están listos de inmediato. ¿Quizás lo están haciendo de esta manera para ahorrar energía? Si están poniendo registros periféricos en su propio dominio de reloj realmente lento por separado, tal vez no tengan que despertarse y ejecutar el oscilador principal o el reloj de la CPU, pero pueden seguir actualizando los valores en el periférico.
Si ese es el caso, entonces podría escribir un registro en su bloque periférico súper lento, luego deshabilitar la isla de energía para toda la CPU o la puerta del reloj, y dejar que el sincronizador lento lo lea hasta que esté satisfecho y luego interrumpir la CPU para sacarlo de dormir.
Alternativamente, podría permitirle incluir la cantidad máxima de instrucciones en su tiempo de vigilia, en lugar de girar seis ciclos y esperar cada escritura.
En cuanto a por qué usan tantos ciclos de sincronización, podrían ser paranoia o podrían estar cumpliendo algún estándar de alta confiabilidad para uno de sus clientes. No puedo decirlo con certeza, pero sé que he visto clientes con demandas como cada carnero tendrá ecc y se precargará a un valor establecido, etc.
Supongo que no es una respuesta definitiva, pero esos son mis pensamientos después de revisar un poco la hoja de datos.
fuente