Hallo, ich nutze eine Berechnungsroutine sowohl im Hauptprogramm als auf in einem Interrupt des Timers. Wäre halt blöde, wenn ich die zweimal gleich schreiben müsste. Versteht der gcc das und trifft Maßnahmen? Oder muss ich da was beachten? Gruss, Christian
Kein Problem. Zugriffe auf externe/statische Variablen müssen allerdings atomar erfolgen.
Christian J. schrieb: > Versteht der gcc das und trifft Maßnahmen? Oder muss ich da was > beachten? was soll er den für Maßnahmen beachten? Das ist doch etwas normales. Aber du solltest beachten, das ein Funktionsaufruf in der ISR dafür sorgt, dann alle Register gesichert werden müssen, das macht das ganze etwas langsamer (ob es stört musst du wissen)
Peter II schrieb: > Aber du solltest beachten, das ein Funktionsaufruf in der ISR dafür > sorgt, dann alle Register gesichert werden müssen, das macht das ganze > etwas langsamer (ob es stört musst du wissen) Na, ich erwarte doch, dass er den Stackframe richtig bedient. Notfalls kann ich bei Aufrufen aus dem Main ja noch __disable_IRQ() eingeben. Die Routine benutzt keine externen Daten, nur lokale und die Parameter der Funktion.
Christian J. schrieb: > Na, ich erwarte doch, dass er den Stackframe richtig bedient. es werden aber mehr Register gesichert als notwendig sind.
Peter II schrieb: > es werden aber mehr Register gesichert als notwendig sind. Macht nix, bei einem 180 Mhz Motor des Cortex M4 stört mich das nicht.
Christian J. schrieb: > Macht nix, bei einem 180 Mhz Motor des Cortex M4 stört mich das nicht. dann ist ja gut
Beitrag #5130905 wurde vom Autor gelöscht.
Peter II schrieb: > Aber du solltest beachten, das ein Funktionsaufruf in der ISR dafür > sorgt, dann alle Register gesichert werden müssen, das macht das ganze > etwas langsamer (ob es stört musst du wissen) Das betrifft nur die Scratch-Register, also jene, die von einer aufgerufenen Funktion verändert werden dürfen. Bei AVRs sind das recht viele, daher fällt das bei denen auf. Wenn es sich allerdings um einen Cortex M handelt, dann werden diese Register sowieso schon vollständig als Teil des Interrupt-Verfahrens von der Hardware gesichert. Bei den Cortex M ergibt sich also durch Funktionsaufrufe innerhalb einer ISR keinerlei Nachteil. Hintergrund: Bei den Cortex M sind ISRs normale Funktionen mit normalem ABI, keine speziellen Exception-Handler. Folglich sichern sie weder Scratch- noch Status-Register. Das geschieht automatisch als Teil des Interrupt-Ablaufs des Cores. Es gibt daher auch keinen "Return from Interrupt" Befehl, sondern eine spezielle Return-Adresse signalisiert einen anderen Ablauf. Da diese 5 Store-Operationen parallel zum Vektor- und Code-Zugriff auf das Flash-ROM erfolgen, hat das in der üblichen Konfiguration auch kaum Folgen für die Interrupt-Latenz. Zudem entfallen sie, wenn ein Return-From-Interrupt gleich in den nächsten Handler springt.
:
Bearbeitet durch User
Beitrag #5131014 wurde vom Autor gelöscht.
A. K. schrieb: > Kein Problem. Zugriffe auf externe/statische Variablen müssen allerdings > atomar erfolgen. Atomarer Zugriff ist notwendig für reentrant Code, aber nicht hinreichend.
Christian J. schrieb: > Die Routine benutzt keine externen Daten, nur lokale und die Parameter > der Funktion. Wenn die lokale Daten nicht 'static' sind, ist alles i.O.
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.