P
synchronisator schrieb:
Wie meinst Du das?
pointercrash() schrieb:
Natürlich ist Vorsicht geboten, wenn man die Zieladresse der Hardware in einen Pointer lädt und den dereferenziert, da hat der Compiler keine Chance, einzugreifen ...
synchronisator schrieb:
Mit Note meinst Du wohl einen Kommentar im Quellcode?
Wenn das Projekt, Compiler und Hardware für immer und ewig verheiratet sind, stört's keinen. Ich muß ab und an downsizen, also z.B. vom 16- Bitter runter auf 8 Bit, da sind mir solche Hints die Tipperei wert.
synchronisator schrieb:
Also, es geht darum, dass ich einen Strom- und einen übergeordneten Drehzahlregler hab. Der Stromregeler läuft häufiger als der Drehzahlregler, allerdings war das bisher so implementiert, dass der Stromregler "wichtiger" ist und deshalb zuerst ausgeführt wurde (beide waren in einer einzigen Timer-ISR verbaut). Das heißt, wenn der Drehzahlregler auch auszuführen ist, wurde bisher trotzdem zuerst der Stromregler (mit alten Stromvorgaben) ausgeführt, bevor der Drehzahlregler neue Stromvorgaben machen konnte. Von daher denke ich, dass ich argumentieren kann "das muss so sein" und bisher hats ja auch funktioniert.
Meine Frage war: Wenn man das ganze "sauberer" implementieren möchte, welche Möglichkeiten gibt es da?
Das Problem bei Threads ist, daß Du nicht genau weißt, wann die Auswertung wirklich "dran" ist. Also Thread 1 beschreibt Dir timergesteuert eine Variable und Thread 2 kommt mit so 5- fachem Oversampling zur Auswertung. In der Folge jittert die Reaktion des Reglers je nach Systemlast unterschiedlich. Bei einem Zweipunktregler ziemlich egal, aber ein PID mit hohem D- Anteil kann sowas übel nehmen.
Alles über eine timergesteuerte ISR zu fahren, ist prinzipiell die sauberste Lösung, Du kannst sie ja "Aufbrechen". Gilt aber nur, wenn Du die Meßwertgewinnung entsprechend synchronisieren kannst. Bei festem 5:1- Verhältnis gibt der Stromregler seinen Output zwar regelmäßig ab, aber erst im 5. Durchlauf auch an den Drehzahlregler weiter, der nach seinem Output wieder vier Durchläufe lang "schlafen" kann. Gibt ein sauberes Timing ab.
Wenn der Drehzahlregler eher unkritisch ist, kannst Du den natürlich auch in einen Thread auslagern, aber über die grundlegende Abfolge mußt Du Dir keine größeren Sorgen machen. Zum Zeitpunkt t bekommt der Drehzahlregler die zu t gültigen Werte, er weiß ja nicht, daß es ein t-1, t-2 ... t-4 gab, weil die unterhalb seiner Erfassungszeitscheibe liegen, er kriegt nur t, t-5, t-10 usw. zu sehen. Das ist aber völlig in Ordnung für einen isochronen Regler. Der Versuch, ihm "irgendwie" ein t-4 in die Auswertung zu drücken, würde das Ergebnis verschlimmbessern. Er kann halt als Folge nur auf jedes t5 reagieren.
Komplizierter wird es natürlich, wenn die Meßwerte zeitlich völlig unzusammenhängend reinkommen, aber ich glaube, das war nicht Dein Problem