www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit While Schleife und Codegröße Mega8


Autor: Crispy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

ich habe ein Problem welches ich weder verstehen noch lösen kann. Ich 
habe schon viel im Forum gesucht aber leider keine Lösung gefunden.

Ich habe folgende Funktion:
char * test_func(char * buf, int val )
{
  while(val > 2)
  {
    val = val - 2;
  }
  return buf;
}

Das Programm mit dieser Funktion benötigt Flash speicher: 3172 Bytes.

wenn ich in der while Bedingung (val = 2) schreibe braucht das Programm 
nur 150 Bytes.

Ob ich val als volatile deklariere bringt keinen Unterschied!?

Achso, der Code wird für einen Mega8 Compiliert.

Ich hoffe auf Hilfe und bedanke mich im Voraus.

Autor: egberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
val=2 ist immer wahr ! (oder meintest du val==2? ;-)

Da es immer wahr ist, wird der Compiler das ganze zeugs rausoptimieren.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und da die Schleife dann nie verlassen wird, lässt der Compiler
auch gleich den Code, der nach dem Aufruf von test_func kommt, weg. Du
rufst dort sicher fette Bibliotheksfunktionen auf, die jetzt nicht
mehr benötigt werden.

PS: Warum überkommt mich nur dieses bange Gefühl, dass eine dieser
aufgerufenen Funktionen _delay_ms oder _delay_us heißt?  ;-)
Sollte ich Recht haben, musst du noch die Optimierungsstufe des
Compilers hochsetzen.

Autor: Felix Bonjour (e-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist mir auch schon aufgefallen mit _delay_ms oder _delay_us..
Falls die eingebunden werden ist der Code viel grösser. Warum 
eigentlich?
Ist ja nicht viel Code für diese Funktionalität.

Einer ne Ahnung?

Cheers,
Felix

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Felix Bonjour wrote:

> Einer ne Ahnung?

Jeder der die Beschreibung dazu gelesen hat...

Siehe hier:
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: Felix Bonjour (e-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thanks..

Jetzt ist alles klar. Wenn FP ins Spiel kommt wird's halt gross auf den 
Megas.

Cheers,
Felix

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Felix Bonjour (e-b)

>Jetzt ist alles klar.

Nicht wirklich.

> Wenn FP ins Spiel kommt wird's halt gross auf den Megas.

Ja, aber die delay Funktionen sind nur sinnvoll, wenn sie mit

- Konstanten und
- aktivierter Optimierung

genutzt werden. Und dann braucht es auch keine Floatingpoint Mathematik. 
Und dann stimmts auch wieder mit der Codegrösse und Verzögerungszeit.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

MFG
Falk

Autor: Felix Bonjour (e-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk

ist doch klar.. Ich hab nicht gesagt das ich solche Routinen so benutze. 
Seit mehr als 20 Jahren schiebe ich nun Bits und Bytes. In dieser Zeit 
hatte ich noch nie einen Gedanken bzw. Bedürfnis an FP in Makros oder 
Lowlevel Funktionen. Bei mir erledigen das immer IRQ's etc.

Desshalb auch meine Frage und die entsprechende Antowrt.

Cheers,
Felix

Autor: Crispy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank für die zahlreichen Antworten. Bin gerade nach Hause 
gekommen und ich denke mein Problem beruht auf einer Mischung der von 
euch angesprochenen Problemen.

Grundsätzlich meinte ich natürlich == und nicht = in der der while 
Bedingung. Wobei sogar beides den gleichen Effekt hatte :D.

Nachdem ich jetzt nochmal über den Code geschaut habe muss ich wohl zu 
dem Schluss kommen, das es tatsächlich die FP Operationen waren, welche 
die eigentliche Codegröße verursachen und wie von yalu angemerkt, in 
Abhängigkeit von der meiner schleife wohl "wegoptimiert" wurden.

So ganz klar mir mir das zwar noch nicht, weil ich eigentlich nicht 
glaube, das meine Schleifen die ich getestet hab, endlos sind. Bin etwas 
verwirrt.

Aber ich werde mir Morgen den Code nochmal in aller anschauen und mich 
gegebenenfalls nochmal melden.

Vielen Danke!
Gruß Crispy

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.