Wo subbutieren Sie Berechnungen?Innenunterbrecher oder Hauptschleife?(eingebettete Echtzeitanwendung)

StackOverflow https://stackoverflow.com//questions/9609882

Frage

Ich entwickle eine eingebettete Anwendung für die Motorsteuerung und ich habe Zweifel daran, mit einigen Berechnungen, die ADC-numerische Werte in signierte physikalische Werte (AMPs) umwandeln.

Wenn ich die Berechnungen im Interrupt-Handler vornehmen soll oder sollte ich einfach den Handler verwenden, um ein globales Flag festzulegen, und die Berechnungen in der Hauptschleife vornehmen, wenn das Flag gesetzt ist?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Es gibt keine One-Size-Fits-ALL-Antwort dafür.Es hängt von Ihren Timing-Anforderungen, vorhandenen Interrupt-Ladungen usw. ab.

Wenn es sich um ein ziemlich einfaches Multiplikat oder etwas handelt, würde ich es einfach in der Interrupt tun und weitergehen.

Stellen Sie einfach sicher, dass Sie wissen, was Sie tun, und geben Sie nicht mehr Zeit in Ihrem Interrupt aus, als Sie sollten.

Andere Tipps

Die weniger Arbeit, die Sie in Ihrem Interrupt-Handler tun können, desto besser.Im Moment ist es möglicherweise keine große Sache für Ihre Anwendung, aber es wird eine Zeit kommen, wenn Ihre Systemlast höher ist, und Sie möchten nicht andere Aufgaben mit höherer Priorität abhalten, um Interrupts zu handhaben.Sie möchten vielleicht in Semaphoren und ordnungsgemäßes Multithreading suchen, anstatt globale Flaggen einzustellen.

Es hängt davon ab, was Sie mit den ADC-Werten tun möchten, und wie schnell Sie tun müssen. Wenn Sie basierende zeitkritische Maßnahmen basierend auf den ADC-Werten annehmen müssen, sollten Sie mit dem in der Interrupt umgehen. Wenn dies jedoch der Fall ist, um sich selbst den Aufwand der ersten Berechnung des "echten" analogen Werts von den ADC-Zählern zu sparen, sollten Sie einfach Ihre kritischen Schwellenwerte in Bezug auf die ADC-Zählungen ausdrücken.

Beispielsweise, wenn Ihr ADC-Ausgängen 8 Zählungen pro Volt ausgibt, und Sie müssen einen Notstopp abfeuern, wenn der ADC größer als 1,5 Volt berichtet, schreiben Sie Ihren Interrupt-Code, um den E-Halt mit 12 Zählungen zu feuern. Sie könnten dann den ADC weiterhin übergeben, zählt der Hauptschleife für die Übersetzung in benutzerfreundliche Einheiten für Benutzeroberflächenzwecke usw.

Das allgemeine Grundsatz ist, dass Sie Ihre Termine erfüllen können, Sie strukturieren Ihre Anwendung und alle Einstellungen, um es so einfach wie möglich zu machen, um diese Fristen zu erfüllen. Wenn etwas keine harte Frist hat, setzen Sie es in die Hauptschleife (wiederum im Allgemeinen).

Eine Sache, darüber nachzudenken, ist Datenkonsistenz.Wenn Sie mehrere verwandte Werte aus dem ADC (Position, Spannung, Strom usw.) erhalten, möchten Sie möglicherweise etwas tun, um sicherzustellen, dass Sie mit einem konsistenten Set arbeiten.Dies kann bedeuten, dass ein Hintergrundaktualisierung besser ist als ein Update im ISR.Sogar Konsistenz eines einzelnen Lesens für einen bestimmten Durchgang des Algorithmus kann wichtig sein.Betrachten Sie diesen Hintergrundcode. generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top