Warum haben einige Mikrocontroller so große Synchronisationsverzögerungen?

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?

Vielen Dank für diese Frage. Es ließ mich endlich das Problem an meiner Hand verstehen. Ich kam hierher, weil ich nicht verstehen konnte, warum das Löschen des Watchdog-Timers (WDT) auf dem SAMD20/21 fast 5 enorme Millisekunden dauern würde. Jetzt weiß ich, dass es am Hardware-Design liegt, nicht an meinem Fehler. (Der WDT ist mit 1024 Hz getaktet, was die einzig sinnvolle Option ist.) Jetzt kann ich zumindest entsprechend damit umgehen.
@T-Bull: Das wirklich Lustige am Watchdog an diesen Teilen ist, dass er zwischen dem Zeitpunkt, zu dem die Software den Reset-Befehl ausgibt, und dem Zeitpunkt, zu dem der Befehl den Synchronizer durchläuft, deaktiviert ist. Wenn das Gerät während dieses Intervalls in den Ruhezustand wechselt, wird der Watchdog nicht ausgeführt, es sei denn, oder bis etwas anderes das Teil aufweckt.

Antworten (1)

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.

Die "sechs Zyklen" sind sechs Zyklen des Peripherietakts; wenn man z. B. das zu speisende Echtzeituhrmodul auf 1024 Hz einstellt (was Atmels Empfehlung zu sein scheint) und der CPU-Takt auf 48 MHz liegt, werden sechs Zyklen des Peripherietakts 281.250 Zyklen des CPU-Takts sein, was schrecklich lang ist Zeit, sich zu drehen, besonders wenn es Interrupts gibt, die gewartet werden müssen. Spinning ist nur mäßig schrecklich, wenn der langsame Takt 8 MHz beträgt (was einen 36-CPU-Zyklus-Spin bedeutet), aber ein harter Fehler wäre besser als ein Spin auf einem 1024-Hz-Takt.