www.mikrocontroller.net

Forum: GCC seltsame Laufzeit Schleife bei eZ430

Autor: Matthias W. (matt007)
Datum: 01.05.2008 20:36

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: 01.05.2008 22:40

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: 01.05.2008 23:22

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: 02.05.2008 06:55

@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 Giebeler (runtimeterror)
Datum: 02.05.2008 07:48

>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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net