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


11

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?


2
Vielen Dank für diese Frage. Dadurch verstand ich endlich das Problem an meiner Hand. Ich bin hierher gekommen, 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 sich um ein Hardware-Design handelt, nicht um einen Fehler von mir. (Der WDT wird mit 1024 Hz getaktet, was die einzig sinnvolle Option ist.) Jetzt kann ich zumindest entsprechend damit umgehen.
T-Bull

2
@ 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 erst ausgeführt, wenn das Teil durch etwas anderes aufgeweckt wurde.
Supercat

Antworten:


2

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.


2
Die "sechs Zyklen" sind sechs Zyklen der peripheren Uhr; Wenn man beispielsweise das Echtzeit-Taktmodul so einstellt, dass es mit 1024 Hz gespeist wird (was Atmels Empfehlung zu sein scheint) und der CPU-Takt auf 48 MHz liegt, sind sechs Zyklen des Peripherietakts 281.250 Zyklen des CPU-Takts, was furchtbar lang ist Zeit zum Drehen, insbesondere wenn Interrupts gewartet werden müssen. Das Drehen ist nur mäßig schrecklich, wenn der langsame Takt 8 MHz beträgt (was einen Spin mit 36 ​​CPU-Zyklen bedeutet), aber ein schwerer Fehler wäre besser als ein Spin mit einem 1024-Hz-Takt.
Supercat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.