mikrocontroller.net

Forum: Compiler & IDEs seltsame Laufzeit Schleife bei eZ430


Autor: Matthias W. (matt007)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias W. (matt007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias W. (matt007)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.