Bei den Mikrocontrollern der Atmel SAM-D21-Serie verwenden viele Peripheriegeräte einen Takt, der asynchron zum Haupt-CPU-Takt ist, und der Zugriff auf diese Peripheriegeräte muss über eine Synchronisationslogik erfolgen. Bei Peripheriegeräten, deren Takt im Verhältnis zur CPU-Zeit langsam ist, kann dies zu sehr großen Verzögerungen führen. Wenn die RTC beispielsweise für die Verwendung eines 1024-Hz-Takts konfiguriert ist (wie es die Entwurfsabsicht zu sein scheint) und die CPU mit 48 MHz läuft, führt das Lesen des Registers "Aktuelle Zeit" dazu, dass die Buslogik mehr als 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 der 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 verschiedene Ansätze, die ein zuverlässiges Verhalten innerhalb von fünf Zyklen des Zieltakts gewährleisten können, wenn dieser schneller als der Quellentakt ist, und nur wenige Zyklen mehr, wenn dies nicht der Fall ist. Was würde der Atmel SAM-D21 tun, das sechs Zyklen in der Quellentaktdomä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 durchgeführt" erforderlich ist, im Vergleich zu einem, der dies sicherstellt Synchronisationsverzögerungen sind kurz genug, um solche Interrupts unnötig zu machen?
quelle
Antworten:
Das ist eine andere Art, Dinge mit mir zu tun. Ich bin an meine Architekturen gewöhnt, bei denen sich meine Register entweder auf meiner CPU-Uhr oder auf mindestens der Hälfte dieser Uhr befinden. Sie schreiben also Ihre Register und sie sind sofort fertig. Vielleicht machen sie es so, um Energie zu sparen? Wenn sie Peripherieregister in ihre eigene, sehr langsame Taktdomäne stellen, müssen sie möglicherweise nicht aufwachen und den Hauptoszillator oder den CPU-Takt ausführen, sondern können die Werte am Peripheriegerät ständig aktualisieren.
Wenn dies der Fall ist, können Sie ein Register in Ihren super langsamen Peripherieblock schreiben, dann die Leistungsinsel für die gesamte CPU deaktivieren oder das Clock-Gate aktivieren und den langsamen Synchronisierer lesen lassen, bis es zufrieden ist, und dann die CPU unterbrechen, um es herauszubringen Schlaf.
Alternativ können Sie die maximale Anzahl von Anweisungen in Ihre Wachzeit packen, anstatt sechs Zyklen zu drehen und auf jeden Schreibvorgang zu warten.
Warum sie so viele Synchronisationszyklen verwenden, könnte Paranoia sein oder einen hohen Zuverlässigkeitsstandard für einen ihrer Kunden erfüllen. Ich kann nicht sicher sagen, aber ich weiß, dass ich Kunden mit Anforderungen gesehen habe, bei denen jeder RAM ecc haben und auf einen festgelegten Wert vorinstalliert sein soll usw.
Ich denke, das ist keine endgültige Antwort, aber das sind meine Gedanken, nachdem ich das Datenblatt ein wenig durchgesehen habe.
quelle