Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
pianoman
Anmeldungsdatum: 28.10.2008 Beiträge: 5
|
Verfasst am: 29.10.2008, 00:27 Titel: Unterbrechungszeiten durch Windows verkürzen ?? |
|
|
Guten Tag,
mich stören die die sporadischen Programmunterbrechungen durch Windows-XP bei einer zeitkritischen Programmschleife in FreeBasic.
Die mit dem Timer gemessene Durchlaufzeit liegt bei nominal ca. 0,3 ms. Sie verlängert sich aber durch die Windows-Interrupts leider sporadisch auf bis zu 70 ms.
Gibt es eine Möglichkeit diese unerwünschten Unterbrechungen auf z.B. 5 - 10 ms zu verkürzen? Wenn sie dafür öfters auftreten, würde mich das bei meiner Anwendung weniger stören.
Vielen Dank im Voraus und
Grüsse von Pianoman |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 29.10.2008, 00:36 Titel: |
|
|
Nein. Nutze DOS oder ein anderes RealTime Betriebssystem mit ausschliesslich einem Thread. Nämlich deinem eigenen.
Es ist leider unumgänglich das Betriebssysteme mit Mehreren Threads unterbrochen werden müssen, um auch anderen Threads etwas zeit zur Verfügung zu stellen.
Oder schreib dir selbst eines: http://www.freebasic-portal.de/index.php?s=projekt&id=26
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
pianoman
Anmeldungsdatum: 28.10.2008 Beiträge: 5
|
Verfasst am: 29.10.2008, 10:28 Titel: |
|
|
Danke für deine Antwort.
In meinem Programm spreche ich über USB einen Joystick an (über Gameport Adapter). Geht das überhaupt mit FreeBasic für DOS ?
Oder sollte ich auf Visual Basic umsteigen um CPU-Zeit in kürzeren Abständen anzufordern ?
Gruss pianoman |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 29.10.2008, 10:44 Titel: |
|
|
das was du mit VB schreiben kanst, kannst duauch mit FB schreiben. Wenn du "nur" mehr zeit brauchst,könntest du alternativ die ThreadPriority höher schrauben, aber das ist immer noch kein RealTime. Windows unterbricht immernoch deinen Prozess, auch wenn die abstände kürzer werden.
was bitte möchtest du den via USB machen, das sooo zeitkritishc ist?
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 29.10.2008, 11:37 Titel: |
|
|
solange du getjoystick verwendest (oder wie der befehl hieß) und der passende treiber installiert ist und es den befehl auch in FBDOS gibt, kannst du damit auch den joystick abfragen. beachte aber, dass es in MS-DOS keinen USB-Support gibt. FreeDOS hat glaub ich welchen. aber spiele für dos schreiben lohnt sich eh nicht.
In diesem Fall ist eher dein code schlecht designt, denn ein Spiel sollte auch mit unterbrechnungen funktionieren. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
pianoman
Anmeldungsdatum: 28.10.2008 Beiträge: 5
|
Verfasst am: 29.10.2008, 11:42 Titel: |
|
|
Ich möchte Impulse zählen, die von einer externen Quelle kommen. Diese speise ich an dem entsprechenden PIN eines USB-Gameport Adaptors ein.
Die Impulslänge beträgt ca. 10-15 ms und der minimale Impulsabstand beträgt ca. 100 ms.
In FB frage ich zyklisch den Joystick-Schalter (PIN am Stecker) ab und zähle so die eingehenden Impulse. Diese Programmschleife darf ruhig unterbrochen werden, aber eben nicht länger als ca. 10 ms, sonst werden Impulse "übersehen", bzw nicht gezählt.
Ein Realtime-System verlange ich doch nicht, aber die Unterbrechungen sollten halt nicht länger als 10 ms sein. Wie oft sie eintreten interessiert nicht!
Im Taskmanager von XP habe ich schon versucht die Priorität meines Programms von "Normal" auf "Hoch", oder auf "Echtzeit" zu stellen. Das reduziert zwar die längsten Unterbrechungen etwas, aber leider nicht genug.
Wenn ich in meine Schleife ein SLEEP 1 (Programmunterbrechung von 1 ms) einbringe, funktioniert es noch am besten.
Bevor ich z.B. auf VB umsteige, hätte ich halt gerne gewusst, ob man dort mehr Einfluss auf das Multithreading hat.
MfG. pianoman |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 29.10.2008, 12:10 Titel: |
|
|
Wie schon gesagt: Unter Windows funktioniert das nicht. Windows entscheidet selbst, wann es einem Thread die Zeitscheibe zuteilt. Darauf hast Du keinen Einfluß. "Echtzeit" bedeutet in Windows nur, daß Du zwischen einem Mausklick und der darauf folgenden Reaktion keine Zeitverzögerung siehst. Bei der natürlichen Trägheit des Auges kann das schon mal 20 ms ausmachen, und selbst das ist nicht immer gewährleistet. Je nachdem, was das System noch alles zu tun hat (Laufwerk ansprechen, Daten in Auslagerungsdatei schreiben z. B.) kann die Verzögerung sogar mehrere Sekunden dauern.
Gleiches gilt übrigens für die DOS-Box in älteren Windosen. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 29.10.2008, 12:52 Titel: |
|
|
Zitat: | Bevor ich z.B. auf VB umsteige, hätte ich halt gerne gewusst, ob man dort mehr Einfluss auf das Multithreading hat. |
Egal, ob du hier FB, VB, PB, Delphi, C/C++ oder was auch immer benutzt, es bleibt das Problem mit Windows .
Du kannst mit entsprechenden API-Befehlen immer nur den gleichen (beschränkten) Einfluss darauf erzielen. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 29.10.2008, 16:57 Titel: |
|
|
Treiber können Timeslice unabhängig agieren  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 29.10.2008, 23:11 Titel: |
|
|
@pianoman
wie wäre es denn, wenn du dir einfach einen wirklich keinen AVR (24, 44, 64) oder was ähnliches, als zähler zusammen lötest, und den an deine Serielle schnitstelle klemmst?. Der Zählt sehr genau und Windows unabhängig. Die übertragung des messwertes erfolgt daraufhin zeitunkritisch. ( da kann schonmal ne sekunde vergehen, oder mehr, und deine Messwerte sind immernoch konstant).
Das Bauteil kostet dich 2 Euro, eventuell noch 1 oder 2 widerstände, und (da du nur eine Monodirectionelle verbindung brauchst (in eine richtung)), reicht auch ein einfacher pegelumsetzer aus einem transistor und nem widerstand aus. (Dein PC wird die 5V auch als HIGH, und die 0V als LOW erkennen, udn braucht nicht zwansläufig die +-12V, [zumindest die meisten]).
Andernfalls bleibst dir eventuell nur noch die möglichkeit einen Treiber zu schreiben, welcher einen Interrupt auf einen der vom Motherboard zur Verfügung gestellten Timer nutzt. Aber ich bezweifle auch hier den erfolg stark)
Die wohl einfachste udn nerfenschonenste Variante ist die nutzung des externen Zeitmessinstruments (klingt auch gleich professioneller, wenn man einen AVR als Zeitmessinstrument bezeichnet)
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|