mikrocontroller.net

Forum: Compiler & IDEs .data @ RAM ?


Autor: Alexander Höller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

im avr-libc-Manual findet man folgendes:

"
7.7.2 The .data Section
This section contains static data which was defined in your code.
Things like the following would end up in .data:
char err_str[] = "Your program has died a horrible death!";
"
(avr-libc-user-manual-1.0.4, Seiet 125)


Nur hab ich mit nem Test-Beispiel, folgende Erfahrungen gemacht:

char text[] = "Kuhle Kuehe sind kuhl";
belegt 22 Byte in .data

char text[] = "Kuh";
belegt aber 0 Byte in .data

Nun 3 Fragen:
1) Warum belegt "Kuh" 0 Byte, wenn die Doku. doch meint, das gehört
in .data?

2)Warum brauchen 21 Zeichen "Kuhle Kuehe sind kuhl" im Speicher 22
Byte?

3) Wo werden Variablen, die wie folgt in der Main-Fkt. deklariert
werden hingespeichert:
char text[512];
Weil auch wenn der komplette Array später noch beschrieben wird, werden
0% des RAMs verwendet (512 von 4k Byte (ATMega64) sind aber etwa 12%)


Vielen Dank für eure Bemühungen schon mal im Voraus ;)

mit freundlichen Grüßen,
Alex

Autor: Alexander Höller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla ...

den Dateianhang vergesst bitte einfach - der g'hört da nicht dazu! ;)

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck Dir am besten den compilierten Assemblercode an, dann siehst Du,
wo Deine Strings landen.

"char text[512];" landet im .bss.  Die Gesamtgröße vom .bss siehst
Du
erst in der gelinkten Datei, nicht in den einzelnen .o's.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>2)Warum brauchen 21 Zeichen "Kuhle Kuehe sind kuhl" im
>Speicher 22 Byte?

Weil diese Zeichenkette (mit Hilfe der Gänsefüßchen) als String
markiert wurde und damit den Terminator (Abschluss) der Zeichenkette
einschliesst (= \0, 0x00).

Autor: Alexander Höller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

@OldBug:
Danke ... wenn man drüber nachdenkt, klingt das eigentlich eh logisch
;)

@Jörg:
Source:

  char text_1[] = "Coole Kuehe sind toll";

  char text_2[] = "Kuh";

Hab das Listing mal angeschaut:
Beim normalen Optimierungs-Level "s" wird die 2. Zeile einfach
ignoriert.
Bei Optimierungs-Level 0 wird die 2. Zeile auch brav übersetzt und im
.data Speicher sind 26 Byte belegt: 21 Zeichen + 3 Zeichen + 2x 1
Stringende = 26 Byte.

Hab nur immer noch keine Ahnung was mit der 2. Zeile passiert. - Aber
so lang das Programm funktioniert ist es mir halt mal egal ;)

Was aber eher stört, dass avr-sizex nicht die entgültige
Speicherauslastung anzeigt - gibt es dafür irgendeine Möglichkeit?


mfG,
aleX

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.