Uhren, Prozessoren und Timer auf einer MCU

Also gehe ich dieses hervorragende Buch Patterns for Time-Triggered Embedded Systems durch und habe eine Frage zur genauen Berechnung von Werten für Hardware-Timer. Siehe "Hardware Delay"-Muster im obigen Buch.

Mein Verständnis ist, dass eine "Taktquelle" (auch bekannt als "System Clock") eine stetige Reihe von Ticks (z. B. f1 khz) erzeugt, die dann durch eine "Prescaler" -Einheit geleitet wird, die sie teilt (durch einen Faktor n, der 1 sein kann ), die eine andere Frequenz ergibt (z. B. f2 = f1/n kHz), die dann dem Prozessor zugeführt wird. Somit hat der "Prozessortakt" eine Frequenz f2 und eine Zeitperiode t2 = 1/f2 ms. Um ein genaues Zeitintervall (z. B. 100-ms-Timer) zu berechnen, berechnen wir einfach die Anzahl der Ticks in 100 ms wie 100/t2 = f3 "Prozessoruhr-Ticks". Wir müssen also die entsprechenden Timer-Register auf Werte einstellen, die f3 entsprechen, um einen 100-ms-Tick zu erzeugen.

Es scheint jedoch nicht so einfach zu sein (zumindest für den 8051) wegen der Anzahl von Ticks, die für einen "Prozessorbefehlszyklus" erforderlich sind. Ein Prozessor durchläuft seinen Befehlszyklus, dh "Fetch->Decode->Execute->Interrupt" (Interrupts werden am Ende des aktuellen Befehls überprüft), der eine Reihe von Ticks benötigt. Idealerweise sollte der gesamte Befehlszyklus nur 1 Tick dauern (z. B. ein Pipeline-Prozessor), und so kann ich die obige Berechnung verwenden, um Timer einzurichten. Offensichtlich lief die Systemuhr im ursprünglichen 8051 jedoch mit 12 MHz und jeder Befehlszyklus dauerte 12 Ticks. Da Interrupts nur am Ende des Befehlszyklus überprüft werden, brauchen wir jetzt eine weitere Division durch 12, um den korrekten „Timer“-Takt zu erhalten, der „Prozessoruhr“/12 ist, dh f2/12.

Ist mein obiges Verständnis richtig? Wenn ja, wie kann ich genaue Timings berechnen, wenn Anweisungen unterschiedliche Zyklus-Ticks haben können (z. B. gemischte 32- und 16-Bit-Anweisungen). Müssen Timer auch über einen Prozessorbefehlszyklus inkrementiert werden, oder gibt es in HW eine Möglichkeit, ein Timer-Register streng synchron mit der Ausgabe der "Prescaler" -Einheit zu inkrementieren?

Timer laufen unabhängig vom Rest des uC. Sie sind dedizierte Hardware, die von der ausgewählten Quelle getaktet wird. Sobald sie zurückgesetzt werden, lösen Sie normalerweise einen Interrupt aus. Sie verwenden einfach die Uhr, die der Timer verwendet, um die erforderliche Anzahl zu berechnen.
@ user110971 Das war auch mein Verständnis. Aber mit dem oben erwähnten 8051-Beispiel (das Buch ist kostenlos) scheint der Unterrichtszyklus ins Spiel zu kommen, was mir neu war. Daher meine Frage.
so ist es gestaltet. Andere Prozessoren sind anders aufgebaut. Ein RISC-Prozessor, der intern mit 5 MHz läuft und die klassische 5-Stufen-Pipeline hat, kann mit einem 5-MHz-Takt betrieben werden. Intern benötigt jedoch jeder Befehl mehrere Taktzyklen. Der interne Takt, der mit PLLs erzeugt wird, kann viel schneller als 5 MHz sein. Dasselbe gilt für den 8051, aber Sie stellen den schnellen Takt extern bereit.

Antworten (1)

Die kurze Antwort lautet dann: "Es kommt darauf an." Unterschiedliche Prozessorfamilien verwenden unterschiedliche Ansätze. Es gibt nicht die eine Idee, die für alle Mikros geeignet ist. Außerdem können synchrone Interrupts (die von interner Hardware generiert werden, die mit einer internen Uhr synchronisiert wird) vorhersehbarer und anders als asynchrone Ereignisse (außerhalb des Mikros) bestätigt werden. Lesen Sie wie immer das Datenblatt und bleiben Sie aufgeschlossen.

Die Berechnung des genauen Timings hängt auch vom Prozessor ab. Selbst wenn ein Ereignis (Timer-Zählerübereinstimmung, extern, was auch immer) eintritt, wenn Ihr Prozessor mehrere Zyklen lang mit der Ausführung einer Anweisung beschäftigt ist, bricht er die Anweisung normalerweise nicht ab, um eine Interrupt-Routine zu starten. (Aber einige Prozessoren WERDEN EINIGE Anweisungen unterbrechen, obwohl ich gerade gesagt habe, dass sie dies normalerweise nicht tun. Also selbst das ist kein Evangelium und Sie müssen das Datenblatt und die Familienhandbücher lesen, um sicherzugehen.) Schlimmer noch, selbst wenn der Prozessor ausgeführt wird B. ein Einzelzyklusbefehl, kann es zu gewissen Schwankungen in der Interrupt-Antwort kommen. So könnten Sie beispielsweise die Dokumente finden, die sagen: „5 bis 6 Zyklen später“. Also selbst dann bist du dir nicht ganz sicher.

Andererseits sind manche Prozessoren so vorhersehbar wie eine Atomuhr. Der ADSP-21xx-Prozessor von Analog Devices (einzelner Zyklus für JEDES Befehlswort – von denen einige drei Befehle parallel ausführen können) hat IMMER genau die gleiche Interrupt-Antwortzeit, jedes Mal, auf ein Timer-Ereignis. Sie können damit fast Ihre Atomuhr stellen. Überhaupt keine Abwechslung. Nur saubere, perfekte, vorhersehbare Antworten. Jedes Mal.

Aber das ist selten.

Und wenn Ihr Prozessor eine schöne, lange Pipeline hat, müssen Sie möglicherweise warten, bis er "abgelassen" ist. Dies geschieht, damit nicht viele interne Zustände wiederhergestellt werden müssen, wodurch mehrere Anweisungen in verschiedenen Phasen der Ausführung neu gestartet werden.

Aber auch da gibt es Ausnahmen. Der DEC Alpha benötigt möglicherweise einige Takte, um zu Ihrer Interrupt-Routine zu gelangen. Aber wenn dies der Fall ist, wird es wahrscheinlich mehrere Anweisungen in verschiedenen Zuständen in den verschiedenen Pipelines haben – die alle nur da sitzen und darauf warten, fortzufahren. Ihr Interrupt-Code muss den gesamten Zustand speichern, seine Sache erledigen, diesen Zustand wiederherstellen und dann neu starten ... mit allen Pipelines wieder dort, wo sie waren, als sie unterbrochen wurden. Der Interrupt-Code ist schmerzhaft zu schreiben, wenn er zurückverfolgen und eine fehlerhafte Anweisung finden muss. Aber das Ding schrie. Sie würden nicht einmal Spurwechsel für die Byteauswahl vornehmen, da dies eine kombinatorische Verzögerung hinzufügen würde, die die Taktrate verringern würde.

Das ist also selten. Aber ja, auch das kann passieren.

ALSO...... LESEN SIE DAS DATENBLATT UND DAS FAMILIENHANDBUCH. Und auf ALLES vorbereitet sein. Designer können manchmal SEHR KREATIV sein.

Jetzt haben Sie mich erschreckt :-) Ich war mir der Probleme im Zusammenhang mit der "Interrupt-Latenz" bewusst (z. B. Ausbreitungsverzögerung, Identifizierung der Interrupt-Quelle, beteiligte Prioritätsschemata usw.), hatte mir aber vorgestellt, dass speziell Timer-Tick-Interrupts sehr einfach, vorhersehbar und präzise wären wobei die meisten Probleme durch das Design beseitigt wurden. Es scheint, dass es noch mehr Faktoren gibt, die das Problem erschweren.
@RamanathanR Hab keine Angst. Lesen Sie einfach die mitgelieferten Materialien. Unterschiedliche Mikros (und Prozessoren im Allgemeinen) haben unterschiedliche Ansätze. Einige von ihnen HABEN nicht einmal Interrupts (z. B. der RS08). In den meisten Fällen benötigen Sie keine genaue Zeitspanne zwischen dem Erkennen eines Interrupts und dem Starten der ersten Anweisung des Interrupt-Codes. Es gibt jedoch Zeiten, in denen Sie diese Funktion benötigen . Und das bedeutet, dass Sie genau hinsehen müssen. In einem meiner Messsysteme brauchte ich eine genaue Antwort. Das ADSP-21xx war die Lösung und es funktionierte wunderbar.