Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich hab mal wieder ein ziemlich großes problem.
Mein programm erfasst daten über einen com port (bluetooth) von einem beschleunigungssensor. Die Sampling Frequenz sollte 50 Hz sein (20ms delay) - und genau da ist das problem!!
Ich komm nur auf durchschnittlich 35 Hz.
Ich bin überzeugt, dass dieses an meiner PC auslastung liegt. Beim starten des Vi's geht meine Computerauslastung immer in die höhe (ca. 90% auf einem von zwei cores (2x2.2Ghz)).
Im Forum hab ich schon einiges über Performance gelesen und auch ziemlich viel zusammen gekürzt. Desweiteren hab ich auch das Performance tool mal drüber laufen lassen. Hab für diesen zweck extra noch verschiedene SubVi's gebildet, um die zeiten zu bekommen - ohne erfolg.
Das einzige was mich verwundert hat, war dass die "Draw" zeit ziemlich hoch war (ist das die average oder alles zusammen?)
Ich hab keine ahnung mehr, was ich noch versuchen kann - wenn von euch niemand ne idee hat, muss es an der hardware liegen!
Ich hoffe jemand von euch kann mir weiterhelfen!
Vielen Dank im voraus.
magnus
Ps.: hab mal ein paar screenshots angehängt, dass ihr euch ein bild machen könnt.
<blockquote>
</blockquote>
War der Tag nicht dein Freund, dann war er dein Lehrer!
Anzeige
25.04.2010, 09:04 (Dieser Beitrag wurde zuletzt bearbeitet: 25.04.2010 09:04 von IchSelbst.)
' schrieb:Beim starten des Vi's geht meine Computerauslastung immer in die höhe (ca. 90% auf einem von zwei cores (2x2.2Ghz)).
90% sind mindestens 70% zuviel.
Kommen die 90% sofort oder dauert es eine Weile, sagen wir mal 30 Sekunden, bis die 90% erreicht sind?
Zitat:muss es an der hardware liegen!
Nie und nimmer. Naja, vielleicht 1% Wahrscheinlichkeit.
Was sich besonders in schnellen While-Schleifen immer negativ auswirkt, ist das Element "Erstelle Array". Dieses Verfahren, Daten in einem Array zu speichern, belastet den Speichermanager extrem. Mit diesem Element erreicht die Prozessorauslastung sehr schnell höchste Prozentzahlen. Besser ist es, das Array vor der While-Schleife mit einer maximalen Anzahl an Elementen vorzubesetzen und in der While-Schleife dann "Ersetze Teilarray" zu machen. Das würde auch hier funktionieren.
In dem einen SubVI machst du mehrere Berechnungen. Möglicherweise werden die Berechnungen schneller, wenn du sie von einem Formelknoten berechnen lässt. Ob hier ein relevanter Zeitgewinn entsteht, weiß ich allerdings nicht.
Weiterhin kannst du folgendes probieren: Mach zwei While-Schleifen. Eine, die nur alleine die Serielle Schnittstelle abfragt. Und eine weitere While-Schleife, die die Daten im Schieberegister speichert, die Anzeige in den Graphen macht und das Speichern im File übernimmt. Zwischen den beiden While-Schleifen überträgst du die Seriellen Daten mittels Queue. Die Schleife mit dem Seriellen Lesen wird dann schnell genug sein. Die Queue dient als Zwischenpuffer. Die andere Schleife darf langsamer laufen als Lese-Schleife. Voraussetzung ist, dass die langsamere Schleife die Queue immer ganz ausliest, nicht elementweise.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
ich weiß was du meinst, aber ich hab keine gute lösung für die queue.
Was hast du dir da gedacht - ich muss ja quasi in der ersten schleife immer ein array bilden oder?
Hab dabei an eine definierte for-schleife in der while-schleife gedacht oder würdest du das queue - Vi bevorzugen?
Komm da aber nicht ganz klar - muss man dann in der zweiten schleife nur mit arrays arbeiten oder hab ich da was falsch verstanden ?
danke schon mal
gruß magnus
War der Tag nicht dein Freund, dann war er dein Lehrer!
' schrieb:ich muss ja quasi in der ersten schleife immer ein array bilden oder?
Nein, musst du nicht.
An der Stelle, an der sich jetzt der Konverter "String nach Bytearray" befindet, "schneidest" du das bisheriege Programm in zwei Teile. In der ersten Schleife befindet sich das VISA-Read, dessen Ausgang, also der String, per Queue an die zweite Schleife gesendet wird.
Die zweite Schleife "beginnt" mit dem Auslesen aller Strings aus der Queue. Die Strings werden als Array of String gelesen. Dieses Array wird nun in einer FOR-Schleife weiter verarbeitet. Die FOR-Schleife liefert dann ein 2D-Array, das an das Schieberegister angehängt (beachte: im Array ersetzt) wird.
Bau dein BD um, so wie du denkst, dass ich es meine, und poste Bild und VI.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
hab grad mein programm auf das minimalste zusammen gekürzt. Das heißt nur noch lesen und dann gleich die daten auf einem chart darstellen. lese mit 20ms delay in einer for schleife, um nur alle 200ms das ergebnis darstellen zu müssen.
-> hab dann wieder die zeit gestoppt (2min um ein gutes ergebnis zu bekommen) und durch die erfassten werte geteilt -> ergebnis wieder um die 35 Hz (cpu auslastung ist auch noch zu hoch!)
bin mit meim latein am ende - an den build arrays kanns ja nicht mehr liegen und sonst ist ja nur noch das Visa da - hab ich da was falsch gemacht!?!?
hat vllt noch jemand ne gute idee - häng auch noch den aktuellen screenshot an
<blockquote>
</blockquote>
War der Tag nicht dein Freund, dann war er dein Lehrer!
@mmh87: Bitte LVF-Regeln lesen (ganz bis zum Schluß) und beachten!
Eine Tastatur hat eine auch eine Shift-Taste, und die sollte man beim Schreiben von Beiträgen hier im LVF auch einsetzen. Dann sind die Beiträge nämlich besser lesbar.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
' schrieb:ich hab noch nicht ganz verstanden, wie du das mit der queue meinst.
Du musst dir nochmals die Konzepte "Datenfluss" und "Sequenzierung", zwei grundlegende Konzepte von LabVIEW, verinnerlichen.
Zitat:die gekürzte version braucht fast keine ressourcen
Warum wohl? Weil nur das VISA-Lesen gemacht wird. Die rechte While-Schleife wird praktisch nur ein einziges Mal ausgeführt. Die rechte Schleife wird erst dann ausgeführt, wenn die linke beendet wurde: Beide Schleifen sind nämlich durch einen Datenfluss sequenziert. Das, was du als Prozessorlast siehst, ist lediglich die linke While-Schleife.
Ich hab dir mal angehängt, wie ich das mit der Queue und dem "In Array ersetzen" gemeint habe. Was ich wieder nicht weis ist, ob der erste Indexeingang der richtige ist oder der zweite.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).