Hallo, ich möchte ein LCD am eZ430 mit dem msp430F2013 in Betrieb nehmen und teste daher mit einer Schleife Zeiten aus, die ich über einen Pin am Oszi ansehe: while (1) { P1OUT |= 0x40; //*** E-Pin setzen (Pin 6) for (_counter1_Delay=0; _counter1_Delay<80; _counter1_Delay++); P1OUT &= 0xBF; //*** E-Pin ruecksetzen (Pin 6) } Übersetzt habe ich dies mit MSPGCC und Eclipse. Folgende Zeiten habe ich gemessen: i=10: 4.8us high, 6.8us low i=20: 4.8us high, 6.8us low i=30: 4.8us high, 6.8us low i=40: 22us high, 6.8us low i=50: 22us high, 6.8us low i=60: 22us high, 6.8us low i=80: 37us high, 6.8us low i=10000: ca 32000us high Gibt es eine Erklärung, warum die Laufzeiten scheinbar so wenig mit der Schleifenvariablen zu tun haben? Wie soll ich so zu einigermaßen vorhersehbaren und reproduzierbaren Zeiten kommen?
nun habe ich dasselbe Programm mit dem brandneuen CCE3 von TI übersetzt: Hier die Zeiten: i=10 120us high, 6.4us low (also viel langsamer als mit MSPGCC) wenn ich die Zeile for (_counter1_Delay=0; _counter1_Delay<10; _counter1_Delay++); auskommentiere ergibt sich: 4us high, 6us low. Kann mir jemand sagen, woher diese enorme Streuung kommt? Matthias
Matthias W. wrote: > Gibt es eine Erklärung, warum die Laufzeiten > scheinbar so wenig mit der Schleifenvariablen > zu tun haben? Weil man als gewissenhafter Programmierer sowas nimmer, nie nicht und auf keinen Fall macht !!! > Wie soll ich so zu einigermaßen vorhersehbaren > und reproduzierbaren Zeiten kommen? Nimm einen Timer oder die Delayfunktion aus der Bibliothek oder Assembler. Diese Methoden haben außerdem den Vorteil, daß man den Oszi in die Ecke stellen kann und nur die Quarzfrequenz für die Berechnungsmacros definieren muß. Ich würd ja wahnsinnig werden, wenn ich für jedes Delay erstmal nen Oszi anschmeißen müßte. Und wenn ich dann den Code in nem anderen Projekt mit anderem Quarz nachnutzen will oder ein Compilerupdate mache, geht das ganze Theater von vorne los. Ne ne, geh mir weg. Mein Arbeitgeber bezahlt mich ja nicht für sinnloses Oszi gucken. "Trial and Error" hat beim Programmieren nichts verloren. Peter
@Peter: Danke für den Hinweis auf Timer oder Delay-Routinen. Das leuchtet mir durchaus ein. Ich fange gerade mit dem MSP430 an, habe noch keine große Erfahrung damit. Kannst Du mir sagen wo ich diese Delay-Routinen finden kann? Gibt es da eine Beschreibung dazu? Gibt es vielleicht ein Beispielprogramm. Dennoch würde ich gerne verstehen, warum sich ein und dasselbe Programm scheinbar so unterschiedlich verhält bei 2 Compilern. Matthias
>Dennoch würde ich gerne verstehen, warum sich >ein und dasselbe Programm scheinbar so unterschiedlich >verhält bei 2 Compilern. Jeder Compiler verwendet andere Mechanismen für die Optimierung des Maschinencodes. Was bei deinem Code vermutlich von Bedeutung ist, ist das folgende Verfahren: http://en.wikipedia.org/wiki/Loop_unrolling Der generierte Maschinencode gibt Aufschluss darüber, was der Compiler tatsächlich aus deinem Code gemacht hat. Wenn die Laufzeit der Schleife von äußeren Faktoren (z.B. Portzuständen) abhängt, kann es schon eher sein, dass sich die Ergebnisse mit deinen Erwartungen decken. Aber wie bereits genannt, sind die Delay- oder Timer-Funktionen eigentlich dafür gedacht.
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.