Forum: Compiler & IDEs WINARM: Problem mit Optimierungsstufe?


von Bernd (Gast)


Lesenswert?

Hi,
mache gerade meine ersten Schritte mit WINARM + LPC2148.

Ich habe folgendes Hauptprogramm:

int main(void)
{
…
uart_Puts("test\r\n");
print_int(1245);

while(1);
{

  /*FIO0SET = ( 1<<11); // Pin 11 auf HIGH schalten
  f = sinf(1.6);
  f *= 100;

  print_int((int) f);
  FIO0CLR = ( 1<<11); // Pin 11 auf low schalten


  for (x=0; x<1000000; x++)
  {
     asm("nop");
  }*/

return (1);
}

Wenn ich alles mit 0 Optimiere funktioniert alles bestens.
Bei s Optimierung habe ich bei einer leeren Endlosschleife (wie oben) 
ein komisches Verhalten: print_int(1245) wird nicht einmal ausgeführt 
sonder ständig. Dann kommt es zum Überlauf meines UART Puffers
Erst wenn ich wieder den auskommentierten Code in der while Schleife 
aktiviere, funktioniert wieder alles einwandfrei mit s Optimierung.
Bei 0 Optimiere funktioniert es einwandfrei egal ob leere while Schleife 
oder nicht.

Hat jemand eine Idee woran das liegen könnte?

Gruß
Bernd

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> uart_Puts("test\r\n");
> print_int(1245);
>
> while(1);
          ^
> {

von Andreas K. (a-k)


Lesenswert?

Von dem while-Problem mal abgesehen: Deine "Warteschleife" wird als 
überflüssig erkannt und wegoptimiert. Infolgedessen startet das 
Hauptprogramm in steter Folge neu.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich bereue inzwischen meine erste Antwort ;-)

Das vermeintliche "Listing" ist kein Listing. Es etwas 
zusammengehacktes. Und das genau dieses Etwas hat nie einen Compiler 
geschweige denn einen µC gesehen.

Die Zeile mit ..., sporadische ; die obskure /* */ Ausklammerung des 
ganzen Schleifenrumpfs, komplett fehlende Codeteile für 
selbstgeschriebene Funktionen sowie die fehlende } sprechen eigentlich 
eine klare Sprache:

Es ist nicht die Mühe wert, dass man Hirnschmalz in diese Ansammlung von 
Zeichen reinsteckt.

Schade, Bernd. Garbage in => Garbage out. Das gilt auch für Fragen und 
Antworten. Meiner Meinung nach wird dich keine der obigen Antworten bei 
deinem eigentlichen Problem weiterbringen.

Ich muss mir einen Knoten ins Ohr machen, nicht mehr auf solche Sachen 
zu antworten. Andere sind hier offensichtlich schlauer gewesen.

von Bernd (Gast)


Lesenswert?

Also mein Programm hat natürlich keine richtige Funktion.
Es ging nur darum die Geschw. für Sinusberechnung zu ermitteln und uart 
Ausgabe zu testen


OK es muss heißen:
int main(void)
{
...
...
 uart_Puts("test\r\n");
 print_int(1245);

 while(1)
 {
  for (x=0; x<10; x++)
  {
    asm("nop");
  }
 }

return (1);
}

Die While Schleife darf nicht leer sein, sonst kommt es zu dem oben 
beschrieben Fehlverhalten.
Von daher finde ich es schon ein ernstzunehmende Frage.

Trotzdem danke für eure Antworten.

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.