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


von Claus (Gast)


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)
1
void setLed(uint8_t delay,uint8_t bit1,uint8_t bit2)
2
{
3
  PORTB=0xff;
4
  PORTB&= ~ ( 1 << bit1);
5
  if ( bit2 < 8 )
6
  {
7
    PORTB&=~(1<< bit2);
8
  }
9
  while (delay > 100 )
10
  {
11
    _delay_ms(100);
12
    delay-=100;
13
  }
14
  _delay_ms(delay);
15
}
16
17
void animate1(void)
18
{
19
  uint8_t i;
20
  for ( i = 0 ; i < 4 ; i++ )
21
  {
22
    setLed(200,0,7);
23
    setLed(200,1,6);
24
    setLed(200,2,5);
25
    setLed(200,3,4);
26
  }
27
}
28
29
void animate2(void)
30
{
31
  uint8_t i;
32
  for ( i = 0 ; i < 4 ; i++ )
33
  {
34
    setLed(200,0,1);
35
    setLed(200,1,2);
36
    setLed(200,2,3);
37
    setLed(200,3,4);
38
    setLed(200,4,5);
39
    setLed(200,5,6);
40
    setLed(200,6,7);
41
    setLed(200,7,0);
42
  }
43
}

Helft mir mal bitte auf die Sprünge - Danke

von Johannes M. (johnny-m)


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...

von ... (Gast)


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

von Claus (Gast)


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
1
void wait_tenth_second ( uint8_t count )
2
{
3
        uint8_t i=0;
4
        for ( ; i < count ; i++ )
5
        {
6
                _delay_ms ( 100 );
7
        }
8
}

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?repname=Remote+Board&path=%2Fsrc%2F#_src_

von Stefan B. (stefan) Benutzerseite


Lesenswert?

avr-libc
http://www.nongnu.org/avr-libc/user-manual/index.html

Warteschleifen
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

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

von Rolf Magnus (Gast)


Lesenswert?


von Falk B. (falk)


Lesenswert?

@ Claus (Gast)

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

Pöser Pursche!
1
void wait_tenth_second ( uint8_t count )
2
{
3
        uint8_t i=0, j;
4
        for ( ; i < count ; i++ )
5
        {
6
      for (j=0; j<10; j++)
7
                _delay_ms ( 10 );
8
        }
9
}

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

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.