www.mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC: Was ist denn an diesem Code so schlimm?


Autor: Claus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

bin gerade dabei mein altes Canda Starterkit-Board zu entsorgen
und verbaue damit auch einen alten Atmel 90S8515 ...
Lange rede kurzer Sinn wenn ich das folgende Code segment
verwende sind das mal locker 4000 Bytes die der Flash mehr
braucht...
Mag ein Anfängerfehler sein, doch irgendwie kapier ich's nicht
Wo braucht der soviel Speicher ?
(der restliche Code ist erheblich grösser braucht aber
summa summarum nur 2600 bytes)

Macht der die setLed routine inline ? (Compiler optimierung steht bei 
-Os)
void setLed(uint8_t delay,uint8_t bit1,uint8_t bit2)
{
  PORTB=0xff;
  PORTB&= ~ ( 1 << bit1);
  if ( bit2 < 8 )
  {
    PORTB&=~(1<< bit2);
  }
  while (delay > 100 )
  {
    _delay_ms(100);
    delay-=100;
  }
  _delay_ms(delay);
}

void animate1(void)
{
  uint8_t i;
  for ( i = 0 ; i < 4 ; i++ )
  {
    setLed(200,0,7);
    setLed(200,1,6);
    setLed(200,2,5);
    setLed(200,3,4);
  }
}

void animate2(void)
{
  uint8_t i;
  for ( i = 0 ; i < 4 ; i++ )
  {
    setLed(200,0,1);
    setLed(200,1,2);
    setLed(200,2,3);
    setLed(200,3,4);
    setLed(200,4,5);
    setLed(200,5,6);
    setLed(200,6,7);
    setLed(200,7,0);
  }
}

Helft mir mal bitte auf die Sprünge - Danke

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die _delay_XX-Funktionen mit Parametern aufgerufen werden, die zur 
Compile-Zeit nicht bekannt (konstant) sind, dann wird die komplette 
float-lib eingebunden, und die braucht Platz. Abgesehen davon 
funktionieren die _delay_XX-Funktionen dann nicht mehr korrekt. Es gibt 
zwei unabdingbare Voraussetzungen für die Verwendung von _delay_us und 
_delay_ms aus der util/delay.h:
1.: Parameter müssen konstant und zur Compiler-Laufzeit bekannt sein.
2.: Die Compiler-Optimierung muss eingeschaltet sein.

Steht alles auch in der libc-Dokumentation.

Übrigens: Falsches Forum...

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...

3.: Der Parameter darf nur einen bestimmten maximalen Wert haben, der 
von der Taktfrequenz abhängig ist.

Steht ebenfalls in der libc-Dokumentation.

CU

Autor: Claus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke erstmal
Sorry das mit dem falschen Forum -
außerdem muß ich gestehen ich hab die doku
zu libc nicht gelesen <-)
Link ?

Das heisst die alternative würde darin bestehen, die
die while schleife mit dem delay
durch einen aufruf von

void wait_tenth_second ( uint8_t count )
{
        uint8_t i=0;
        for ( ; i < count ; i++ )
        {
                _delay_ms ( 100 );
        }
}

zu ersetzen (und dementsprechen die zeiten anzupassen)?

Übrigens falls es hilfreich ist,
der ganze code befindet sich hier:
https://trex-online.no-ip.info/websvn/listing.php?...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr-libc
http://www.nongnu.org/avr-libc/user-manual/index.html

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

Die Idee mit der mehrfachen Schleife ist prinzipiell OK. Eine andere 
Lösung statt Zeitvertrödeln wäre ein Timer.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Claus (Gast)

>außerdem muß ich gestehen ich hab die doku
>zu libc nicht gelesen <-)

Pöser Pursche!
void wait_tenth_second ( uint8_t count )
{
        uint8_t i=0, j;
        for ( ; i < count ; i++ )
        {
      for (j=0; j<10; j++)
                _delay_ms ( 10 );
        }
}

So isses besser, weil die Funktion _delay_ms() nur maximal ~270ms bei 1 
MHz CPU Takt warten kann, bei 20 MHz nur noch 13ms!

MFG
Falk

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.