mikrocontroller.net

Forum: Compiler & IDEs Code zu groß, Attiny13, WinAVR+AVR Studio


Autor: Julian L. (julianl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Vorneweg: µC-Anfänger
Software:
AVR Studio 4.13.571  Service Pack 2
AvrPluginavrgccplugin  1, 0, 0, 9 (WinAVR-20071221)

Mit dieser Ausstattung versuche ich untenstehenden Code zu compilieren, 
jedoch kommt dabei eine viel zu große Datei heraus.
An welcher falschen Einstellungen könnte es liegen?

Vielen Dank für eure Hilfe.

mfg
julian

Build started 23.2.2008 at 14:09:42
avr-gcc.exe  -mmcu=attiny13 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF dep/test.o.d  -c  ../test.c
In file included from ../test.c:3:
c:/winavr-20071221/bin/../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
avr-gcc.exe -mmcu=attiny13 -Wl,-Map=test.map test.o     -o test.elf
avr-objcopy -O ihex -R .eeprom  test.elf test.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex test.elf test.eep || exit 0
avr-objdump -h -S test.elf > test.lss

AVR Memory Usage
----------------
Device: attiny13

Program:    3760 bytes (367.2% Full)
(.text + .data + .bootloader)

Data:        266 bytes (415.6% Full)
(.data + .bss + .noinit)


Build succeeded with 1 Warnings...

#define F_CPU  8000000        // Quarzfrequenz 8MHz
#include <avr/io.h>
#include <avr/delay.h>
unsigned char f, i;
unsigned char led_abfrage(unsigned char zeit) {
   
  PORTB &= ~(1<<PB3);         //  Portb.3 auf Masse schalten
  PORTB |=  (1<<PB4);         //  Portb.4 auf +Ub schalten, um die LED zu 'laden'
  _delay_us(10);              // Ladezeit 10 (1) µs, kann ggf. noch verkleinert werden
  DDRB  &= ~(1<<PB4);         // Portb.4 nun zwecks Abfrage der LED-Ladung auf 'Eingang' schalten
  PORTB &= ~(1<<PB4);         // Pullup abschalten, sonst geht's nicht!
  _delay_ms(zeit);            // Entladezeit zeit_ms (1500 µs) - je kleiner, je unempfindlicher
  i = (PINB & (1<<PINB4));    // Ladezustand einlesen
  DDRB  |=  (1<<PB4);         // Portb.4 wieder auf Ausgang schalten
  PORTB &= ~(1<<PB4);         // Portb.4 auf Masse schalten
   
  return i;
}
int main(void) {
  DDRB  = 0b00011000;         // Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
  PORTB = 0b11100111;         // Pullups zuschalten, außer für Pinb.3 und .4
 
  while (1) {
    if ( led_abfrage(6) == 0) {          // LED durch Licht entladen?
      for (f = 0; f < 10 ; f++) {        // 10x blinken
        PORTB |=  (1<<PB3);               // PB3 auf Vcc schalten
        _delay_ms(32);                    // 32 ms Blitz
        PORTB &= ~(1<<PB3);               // PB3 auf GND schalten
        for (i = 0; i < 10 ; i++) 
          _delay_ms(32);      // ca. 320ms Pause (workaround wegen 8MHz Quarz)
      }
    }
  }
  return 0;
} 

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem liegt hier
  _delay_ms(zeit);            // Entladezeit zeit_ms (1500 µs) - je 

Die Delay Zeit ist keine Konstante. Dadurch ist es dem Optimizer
nicht mehr möglich die Berechnung komplett zu optimieren und
du ziehst dir damit die komplette Floating Point Library ins
Programm hinein.

ersetzte das durch
  _delay_ms(6);

und deine Programmgröße schrumpft auf 180 bytes.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
Wenn du eine variable Wartezeit brauchst, dann mach es so,
dass das Argument zu _delay_ms auf jeden Fall eine Konstante
ist
#define F_CPU  8000000        // Quarzfrequenz 8MHz
#include <avr/io.h>
#include <avr/delay.h>
unsigned char f, i;

void delay( unisgned char ms )
{
  unsigned char i;

  for( i = 0; i < ms; ++i )
    _delay_ms( 1 );
}


unsigned char led_abfrage(unsigned char zeit) {
   
  PORTB &= ~(1<<PB3);         //  Portb.3 auf Masse schalten
  PORTB |=  (1<<PB4);         //  Portb.4 auf +Ub schalten, um die LED zu 'laden'
  _delay_us(10);              // Ladezeit 10 (1) µs, kann ggf. noch verkleinert werden
  DDRB  &= ~(1<<PB4);         // Portb.4 nun zwecks Abfrage der LED-Ladung auf 'Eingang' schalten
  PORTB &= ~(1<<PB4);         // Pullup abschalten, sonst geht's nicht!
  delay( zeit );              // Entladezeit zeit_ms (1500 µs) - je kleiner, je unempfindlicher
  i = (PINB & (1<<PINB4));    // Ladezustand einlesen
  DDRB  |=  (1<<PB4);         // Portb.4 wieder auf Ausgang schalten
  PORTB &= ~(1<<PB4);         // Portb.4 auf Masse schalten
   
  return i;
}
int main(void) {
  DDRB  = 0b00011000;         // Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
  PORTB = 0b11100111;         // Pullups zuschalten, außer für Pinb.3 und .4
 
  while (1) {
    if ( led_abfrage(6) == 0) {          // LED durch Licht entladen?
      for (f = 0; f < 10 ; f++) {        // 10x blinken
        PORTB |=  (1<<PB3);               // PB3 auf Vcc schalten
        _delay_ms(32);                    // 32 ms Blitz
        PORTB &= ~(1<<PB3);               // PB3 auf GND schalten
        for (i = 0; i < 10 ; i++) 
          _delay_ms(32);      // ca. 320ms Pause (workaround wegen 8MHz Quarz)
      }
    }
  }
  return 0;
} 


Autor: Julian L. (julianl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahnsinn, so schnell eine Antwort. Hut ab!

Vielen Dank, nun wird mir einiges klarer.

mfg
Julian

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab eine ähnliches Problem.
Ich verwende AVR Studio 4.12.490  Service Pack 3 (WinAVR 20060421)
und bei mir wird die die selbe Warnung angezeigt. Der Fehler trat erst 
auf, als ich in mein Programm die stdlib.h eingefügt habe und diese für 
die Ausgabe einer Float-Variabel verwendet habe. Das Programm wird viel 
zu groß und passt gar nicht mehr auf den Atmega8 drauf.
 
#include <avr/delay.h>
#include <avr/io.h>
#include "definitions.h"
#include "stdlib.h"
.
.
.
void wert_send(void)
{
  unsigned short i;
  float a;
  char s[8];
  i=start_adc();
  a=i*0,0025;
  dtostrf(a,5,3,s);
  lcd_string(s);
}



void lcd_string(char *data)
{
    while(*data) {
        data_send(*data);
        data++;
    }
}

Ich hoffe, ihr könnt mir helfen.
Vielen Danke schonmal im Voraus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:

> auf, als ich in mein Programm die stdlib.h eingefügt habe und diese für
> die Ausgabe einer Float-Variabel verwendet habe.

Da haben wir's doch schon.
Du ziehst dir die komplette Floating Point Library rein und die
braucht eben Platz.

-> Auf floating point verzichten und auf Fixkomma umsteigen.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:
> Der Fehler trat erst
> auf, als ich in mein Programm die stdlib.h eingefügt habe und diese für
> die Ausgabe einer Float-Variabel verwendet habe. Das Programm wird viel
> zu groß und passt gar nicht mehr auf den Atmega8 drauf.

Tja, die Floating Point Lib ist nun mal so groß. Versuche, mit 
Integer-Arithmetik auszukommen...

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
vielen Danke für die schnelle Antwort. Ich werde mich dann wohl 
demnächst mit den zwei genannten Methoden beschäftigen müssen. Nochmal 
vielen Dank.
Gruß Christoph

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deinem Fall würde es sich anbieten, einfach die Berechnung * 10000
zu machen und dafür bei der Ausgabe an der 10000-er STelle das Komma
einzuschmuggeln
void wert_send(void)
{
  unsigned short i;
  int a;
  char s[10];

  i = start_adc();
  a = i * 25;
  sprintf( s, "%d.%04d", a / 10000, a % 10000 );
  lcd_string( s );
}

sprintf ist zwar teuer, weil es eine eierlegende Wollmilchsau
ist, aber wenn sich das vom Platz her noch ausgeht, warum nicht?
Wenn das immer noch zu gross ist, dann müsste man einen Ersatz
für sprintf schreiben.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Sprintf hat recht gut funktioniert. Ich bin jetzt bei 6,22Kbyte. Das ist 
zwar noch recht groß, geht aber auf den Atmega drauf und reicht für den 
Zweck aus^^. Vielen, vielen Dank für die Hilfe, Karl Heinz.

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.