Forum: Compiler & IDEs seltsame Laufzeit Schleife bei eZ430


von Matthias W. (matt007)


Lesenswert?

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?

von Matthias W. (matt007)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Matthias W. (matt007)


Lesenswert?

@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

von Kai G. (runtimeterror)


Lesenswert?

>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
Noch kein Account? Hier anmelden.