Archiv verlassen und diese Seite im Standarddesign anzeigen : wieviele Befehle kann mein µC in einem Taktzyklus erledigen?
Hallo,
ìch hätte gerne eine Frage:
Ich verwende Mikrocontroller STM32F10xx, der mit 24 MHz tacktet. Mit dem möchte ich ein Signal erfassen, dessen Frequenz (Max. Frequenz) bei 200 KHz liegt. Ich möchte aber 2-Fach abtasten (Sowohl die Steigende als auch die Fallende Flanke= mehr Informationen rausholen). Dies möchte ich mittels Timmer-Interrupt/ capture realisieren. per Prescaler stelle ich den Timertackt auf 400 KHz ein.Somit wird das Eingangssignal 2-Fach abgetastet.
Nun, Darf ich davon ausgehen, dass der µc innerhalb 2,5µs (das ist der Abtastrat 1/ 400 KHz) 24 (auf diese Zahl bin ich aufgrund der MCU-Frequenz gekommen) Befehlen erledigen kann?
Ich hoffe, ich habe die Frage richtig gestellt.
Übrigens ich bin Student, der Null Erfahrung mit Programmierung von Mikrocontroller hat. Also bitte um Verzeihung wenn ich Blöde Frage stelle.
Vielen Danke im Voraus
Das sollte im Datenblatt stehen und hängt u.A. von der Breite des Befehlsregister (und der Taktrate) ab. 8 Bit Prozessoren können nur 1 Befehl pro Takt, 16,32,64 Bittige entsprechend mehr. Dazu kommt noch die Architektur des Prozessors da gibt es auch große Geschwindigkeits Unterschiede. Noch schneller würden speziell für Dein Problem "gestickte" FPGA's sein können. Dein Prozessor Typ sagt (mir) leider nichts, aber Du hast sicher ein Aktuelles Datenblatt.
Gruß Richard
Besserwessi
07.07.2011, 22:06
Auch die 32 Bit µCs können normal maximal 1 Befehl pro Takt. Nur sind die Befehle bei den 32 Bit µCs etwas mächtiger, halt eine 32 Bit Addition statt einer 8 Bit Addition. Bei den DSPs gibt es einige die etwas mehr können, weil der mehr als eine CPU parallel arbeitet.
Für die Erfassung des 200 kHz Signals reicht der µC aber wohl aus. Bei mir im Frequenzzähler schaft das auch ein 8 Bit AVR (Tiny2313) mit 20 MHz, bis knapp 300 kHz. Das sollte auch mit dem STM32 zu schaffen sein. Zur sicherheit aber noch mal ins Datenblatt schauen, denn die ARMs sind teilweise langsam beim Zugriff auf IO Register. Den Timer sollte man aber eher mit maximalem Takt laufen lassen damit man auch ein brauchbare Auflösung hat.
Auch die 32 Bit µCs können normal maximal 1 Befehl pro Takt.
Woher ich es habe ? Aber irgendwo hatte ich schon einmal mit Prozessoren zu tun welche mehrere Befehle mit/in einem Takt abarbeiten konnten. Leider ist (meine) Höchstform zu diesem Thema schon etwas länger zu Ende ich habe es schlicht vergessen (oder falsch in Erinnerung). Aderersteis wenn ein "Breiteres Register" pro Takt Parallel ver/be arbeitet werden kann, sollte es schneller gehen?
Gruß Richard
Besserwessi
07.07.2011, 22:38
Beim PC sind die Prozessoren so weit, das die mehr als einen Befehl pro Zyklus können. Die üblichen µCs können das aber nicht, da ist man eher noch bei mehreren Zyklen pro Befehl. Da gibt es aber ggf. welche die einem einige Aufgaben durch spezielle Hardware abnehmen können (z.B. UART, Input Capture mit FIFO, "DMA"-Funktionen ).
Durch die breiteren Register werden einige Aufgaben schneller, aber nicht alle. Hier hilft es vermutlich schon, weil die Auflösung des Timers auch eher bei 16-32 Bit liegt.
Ich kenn den konkreten Processor nicht, aber beim AVR könnte man folgende Abschätzung vornehmen:
Bei 1 MHZ Takt kann er in 1 µS einen Befehl ausführen.
bei 24 MHZ und deinen 2.5 µS könnten also 24 * 2.5 Befehle abgearbeitet werden => 60
Mit 60 Befehlen kannst du vielleich 5-6 mal Pin abtasten.
zum halbwegs genauem Flankenerwischen ist das eher wenig (IMHO)
Hallo,
ich danke allen für die Antwort.
Durch weitere Recherche bin ich darauf gekommen:
* 1-Zeile eines C-Code entspricht 5-Zeilen von Assembler-Code. Jede Zeile von Assebler-code bedeutet Ein Befehl.
* Die CCU arbeitet unabhängig von dem kern-prozessor. Das heisst; sie arbeitet quasi parallel
Schlussfolgerung besagt, dass der µc (Laut der og. Angabe) 24-Zeile Assebler-Code in millionstel Secunde erledigen kann.
Erst wenn CCPU einen Interrupt auslöst, dann wird 12 Taktzyklen für das Sprengen von dem Main-Programm ins ISR und 6 Taktzuklen für das Zurücksprengen (von ISR in Main-Programm) benötigt. Also Ingesamt 18 Taktzyklen für hin und her. Dann bleibt übrig nur ca. 6 Taktzyklen.
mit Ziffern heisst das:
Taktsystem 24MHz -> 41,6 ns oder 0,0416 µs
Psc-Takt(Prescaler) 400KHz -> 2,5 µs
D.h. innerhalb einem PSC-Takt macht das System ca. 60 Takten
von diesem 60 Takten wird 18 Takten für hin und her um sonst verschwunden (0,75 µs).
Übrig bleibt doch genung und zwar 42 Takten (1,75 µs).
D.h. Alles was zu rechnen etc. zu tun is, soll befor die Nächste steigende Flanke erledigen, nämmlich innerhalb von 1,75 µs oder 42 systemtakten.
Ist meine Schlussfolgerung Richtig? Ich brauche doch von euch als wissender Bestätigung?!
Da kommen wir ja eh mehr oder weniger auf das Gleiche.
Frage ist nun, WAS denn genau bei jeder Flanke zu rechnen oder zu tun ist. Eine FFT bringst du da nicht durch, logo
ISR ist auf jeden Fall besser als abtasten, da genau mit den Flanken ausgelöst wird.
btw: das C / assembler verhältnis mit 1:5 ist sehr theoretisch bzw reiner durchschnitt (und hängt auch vom eingestellten Optimizer ab). Bei sowas wie
(double)result = (double)Varia / 0.48
geht normalerweise das Licht aus und es ist doch nur eine Zeile.
Danke PicNic
ja, aber ich wolte es in details formulieren, damit ich sicher gehen kann "" die Tücke liegt immer in deitails.
Sorry! Was Meinst du mit FFT?
Das externe Interrupt wäre in meinem Fall nicht praktisch, praktischer wäre wenn ich die Impulsfolge mittels CCU erwiscche.
Denn der Geber kann mit 200KHz laufen.D.h pro 5µs ändert sich das Pagelstand des Signals. viel mehr wenn ich dieses Signal nicht nur bei Steigende oder Fallende Flanke erfassen möchte sonder sowohl als auch. D.h. Das Abtastrat soll mind. 2,5 µs schnell sein. noch Kompletierter wäre wenn nicht nur ein Signal sonder Zwei signale (cha-A und Cha-B), die der Drehgeber ausliefert und die von einander 90-Grad Phasig verschoben sind. So letzt endlich soll jede 1,25µs einen Interrupt ausgelöst werden.
Innerhalb dieser 1,25 µS soll folgendes erledigt werden:
* Integer aritmehtic: Ich soll aus den erfassten Signalen die Geschwindigkeit, Drehzahl und Drehrichtung rausfinden.
* Diese Werte sollen auch über SPI übertragen werden, falls der Master das SSL triggert.
* Zu guter letzt soll die Werte auf LCD angezeigt werde.
ohhhhhhhhhhhhhh das alles ist innerhalb einer 1,25 µs zu erledigen ???? viel zu viel denke ich mal.
Deswegen werde ich über ccu alle 10 steigende/fallende Flanke einen Interrupt auslösen.
Ah so, Drehgeber. Anschlussfrage: für Odometrie, also Wegmessung, oder für sowas wie einen Motor (der ja nicht einfach von einem Impuls zum nächsten die Richtung wechseln kann) ?
Im zweiten Fall ist das mit dem 90° Signalen nicht notwendig und das mit auf- und ab-Flanken eigentlich auch nicht.
Auch klar: Für Geschwindigkeit bzw. Drehzahl brauchst du eine Zeit, die du extra tickern lassen musst.
RP6conrad
10.07.2011, 23:00
So einen STM32F103 hat doch eine sehr schone Timerfunction : der A und B Ausgangen von encoder werden gleich an einen Hardwarecounter verbunden. Diese Timer/counter erfasst dan genau die exacte Zaehlerstand von encoder, ohne das den Processor sich da bemuht. Das Hauptprogram kan dan immer zugreifen auf diesen "Counter" wenn notig. Und das kan dan auch mehrmals gemacht werden, das Ding hat genugend Timer und Eingangen. Ich habe das so gemacht mit das Discovery board von STM. Functioniert problemlos !!Für in bestimmte Zeitpunkten eine ISR laufen lassen isst den 3"Systicktimer" gedacht.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.