Hallo zusammen, Ich stehe gerade einmal auf dem Schlauch, vielleicht kann mich jemand in die richtige Richtung schubsen: Ich möchte mit einem STM32F2 einen Zeitstempel in µS generieren, der von einem externen Takt kommt. Diesen Wert benötige ich nur unregelmäßig (z.B. beim Eintreffen eines Datensatzes auf einer Schnittstelle, vielleicht ein paar hundert mal in der Sekunde), die Zeit soll aber synchron zum externen 1MHz Signal sein. Bisherige Idee: Das Signal wird als externer Takt auf einen Zeitgeber gegeben, der bis 1.000.000 zählt und dann einen Interrupt auslöst. In diesem Interrupt wird eine Variable hoch gezählt, die die Sekunden enthält. Das sollte doch machbar sein. Wenn ich nun diesen Zeitstempel benötige lese ich den aktuellen Timerstand aus - bekomme also die µS - und nehme den Sekundenzähler dazu. So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja nicht atomar in einer Operation auslesen. Das bedeutet: Wenn ich erst den Timer auslese und danach den Sekundenzähler, dann kann zwischendurch ein Timer Interrupt aufgetreten sein und die beiden passen nicht mehr zusammen. Andersherum ebenso. Da war doch mal was mit einen Wert zwei mal auslesen und den anderen dann Korrigieren. So ähnlich wie: Timer auslesen, merken, Sekundenzähler auslesen, merken, Timer wieder auslesen, ist der nun kleiner als beim erstem mal Sekunde eins rauf. Aber was wenn zwischen den ersten beiden Schritten der Interrupt kam, dann ist der Sekundenzähler schon um eins hoch gegangen. Da stehe ich nun uns brauche den Schubs. Wie macht man das noch mal richtig? Danke und Gruß Martin
>So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja >nicht atomar in einer Operation auslesen. Gib deinem Interrupt die höchste Priorität. Dann ist das kein Problem.
holger schrieb: >>So, da kommt nun mein Problem ins Spiel: Ich kann die beiden Werte ja >>nicht atomar in einer Operation auslesen. > > Gib deinem Interrupt die höchste Priorität. Dann ist das kein Problem. Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich den "zeitstempel" brauche. Gruß Martin
>Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich >den "zeitstempel" brauche. Dann disable alle Interrupts. Wo ist dein Problem? Das wird seit hunderten von Jahren schon so gemacht.
holger schrieb: >>Der Interrupt ist nicht das Problem, sondern der Zeitpunkt an dem ich >>den "zeitstempel" brauche. > > Dann disable alle Interrupts. Wo ist dein Problem? > Das wird seit hunderten von Jahren schon so gemacht. Das mir dann vielleicht Takte verloren gehen. Gruß Martin
>> Dann disable alle Interrupts. Wo ist dein Problem? >> Das wird seit hunderten von Jahren schon so gemacht. > >Das mir dann vielleicht Takte verloren gehen. Hä? disable interrupts lese us Timer lese s Timer enable interrupts Dein Kram dauert bei einem STM32 gerade mal 4 Maschinenzyklen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.