Bei den Mikrocontrollern der Atmel SAM-D21-Serie verwenden viele Peripheriegeräte einen Takt, der asynchron zum Haupt-CPU-Takt ist, und Zugriffe auf diese Peripheriegeräte müssen eine Synchronisationslogik durchlaufen. Bei Peripheriegeräten, deren Takt relativ zur CPU-Zeit langsam ist, kann dies einige wirklich große Verzögerungen verursachen. Wenn die RTC beispielsweise so konfiguriert ist, dass sie einen 1024-Hz-Takt verwendet (wie es die Absicht des Designs zu sein scheint) und die CPU mit 48 MHz läuft, führt das Lesen des Registers „Aktuelle Zeit“ dazu, dass die Buslogik über 200.000 Wartezustände einfügt (mindestens von fünf Zyklen des 1024-Hz-Takts). Obwohl es möglich ist, dass die CPU eine Leseanforderung ausgibt, einen anderen nicht verwandten Code ausführt und mehr als 200.000 Zyklen später zurückgibt, um die Zeit abzurufen, scheint es keine Möglichkeit zu geben, die Zeit tatsächlich schneller zu lesen.
Nach meinem Verständnis von Synchronisation verzögert eine Einzelbit-Synchronisationsschaltung ein Signal um 2-3 Zyklen des Zieltakts; Das Synchronisieren einer Multi-Bit-Menge ist etwas schwieriger, aber es gibt eine Vielzahl von Ansätzen, die ein zuverlässiges Verhalten innerhalb von fünf Zyklen der Zieluhr garantieren können, wenn sie schneller als die Quelluhr ist, und nur wenige Zyklen mehr, wenn dies nicht der Fall ist. Was würde der Atmel SAM-D21 tun, der sechs Zyklen in der Quelltaktdomäne für die Synchronisation erfordern würde , und welche Faktoren würden ein Design begünstigen, dessen Synchronisationsverzögerungen so lang genug sind, dass ein Interrupt "Synchronisation abgeschlossen" erforderlich ist, im Vergleich zu einem, der dies gewährleistet Synchronisationsverzögerungen kurz genug sind, um solche Interrupts unnötig zu machen?
Das ist für mich eine andere Art, Dinge zu tun, ich bin an meine Architekturen gewöhnt, bei denen meine Register entweder auf meiner CPU-Uhr oder mindestens der Hälfte dieser Uhr liegen. Sie schreiben also Ihre Register und sie sind sofort fertig. Vielleicht machen sie es so, um Strom zu sparen? Wenn sie Peripherieregister in ihre eigene, wirklich langsame Taktdomäne stellen, müssen sie möglicherweise nicht aufwachen und den Hauptoszillator oder die CPU-Uhr laufen lassen, sondern können die Werte auf dem Peripheriegerät aktualisieren.
Wenn dies der Fall ist, können Sie ein Register in Ihren superlangsamen Peripherieblock schreiben, dann die Strominsel für die gesamte CPU deaktivieren oder mit einem Clock-Gate versehen und den langsamen Synchronisierer lesen lassen, bis er zufrieden ist, und dann die CPU unterbrechen, um ihn herauszubringen Schlaf.
Alternativ könnte es Ihnen ermöglichen, die maximale Menge an Anweisungen in Ihre Wachzeit zu stopfen, anstatt sechs Zyklen zu drehen und auf jeden Schreibvorgang zu warten.
Warum sie so viele Synchronisationszyklen verwenden, könnte Paranoia sein, oder sie könnten einen hohen Zuverlässigkeitsstandard für einen ihrer Kunden erfüllen. Ich kann es nicht mit Sicherheit sagen, aber ich weiß, dass ich Kunden mit Forderungen gesehen habe, dass jeder RAM ECC haben und auf einen festgelegten Wert vorgeladen werden soll usw.
Ich denke, das ist keine endgültige Antwort, aber das sind meine Gedanken, nachdem ich das Datenblatt ein wenig durchgesehen habe.
T-Bull
Superkatze