Forum: Compiler & IDEs Anweisungszeilen von "Build" in AVR-Studio sind unklar


von A.W. (Gast)


Lesenswert?

Hallo Leute,
ich benutze zum programmieren von ATMega16 AVR-Studio.
Ich kommuniziere mit ATMEGA16 und Terminal mittels Funktionen.
D.h. ich gebe Text am Terminal aus.

Beim drücken im AVR-Studio auf "BUILD AND RUN" kommt folgende Meldung:

********************************************
AVR Memory Usage
----------------
Device: atmega16
Program:    2894 bytes (17.7% Full)
(.text + .data + .bootloader)
Data:        972 bytes (94.9% Full)
(.data + .bss + .noinit)
*********************************************

Mein Problem ist dass sobald die (oben angegebene) vorletzte Zeile fast 
voll ist gibt mein Terminal-Programm zunächst das richtige aus dann aber 
nur Schrott.
Sobald ich ein paar übergebene Strings lösche dann zeigt das 
Terminal-Programm was richtiges an.
Kann mir bitte jemand erklären was die Zeile bedeuten.
MFG

von Karl H. (kbuchegg)


Lesenswert?

Die Zeile hat an sich nichts mit deinem Pgm zu tun.
Das ist lediglich die Zusammenfassung des Compilers,
wie voll dein Prozessor ist, wie stark dein Program
den Speicher belastet.
DIe Data Sektion ist vom Compiler zu run 95% ausegnutzt.
Da kommt jetzt aber zur Laufzeit noch was dazu, so dass
du wahrscheinlich zur Laufzeit einen Stack Overflow
produziert. Mit anderen Worten: Dein Programm geht etwas
zu verschwenderisch mit dem Speicher um.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A.W. wrote:

> Sobald ich ein paar übergebene Strings lösche dann zeigt das
> Terminal-Programm was richtiges an.

Die Strings brauchen RAM (und ROM natürlich auch).

Guck bitte ins AVR-Tutorial um zu lernen, wie man sie in den ROM
auslagert.

von A.W. (Gast)


Lesenswert?

Kann ich mit den Anweisungen "new" und "delete" den reservierten 
RAM-Speicher freigeben? Ich kenne dies Befehle von c++.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

new und delete sind derzeit nicht implementiert.

Würde dir außerdem nichts nützen, da es sich ja bei den string
literals nicht um dynamische Objekte handelt.

Nein, es führt kein Weg dran vorbei, dass du dir um die Auslagerung
von Daten in den ROM im AVR Gedanken machst, so wie das ...zig
Programmierer vor dir tun mussten.  Dafür ist der AVR halt eine
(echte) Harvard-Maschine mit dem Vorteil, dass das Befehlslesen
und die Datenzugriffe gleichzeitig von statten gehen können (weil
es zwei getrennte Busse sind).

von Karl H. (kbuchegg)


Lesenswert?

Warum sträubst du dich so gegen die Umlagerung deiner
konstanten Strings in das Flash.

Hier
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Vereinfachung_f.C3.BCr_Zeichenketten_.28Strings.29_im_Flash
ist beschrieben was es damit auf sich hat und welche
Programmänderungen du machen musst.
Das ganze ist in null komma nichts durchgezogen und dann
hast du Ruhe.

Um es ganz klar zu sagen: Das ist deine einzige Möglichkeit
den RAM-Speicherverbrauch zu senken. Zumindest nach allem
was wir von deinem Pgm wissen. Da hilft kein malloc und
auch kein new. Deine einzige Chance ist es, Dinge nicht
im RAM anzulegen. Und die einfachste Variante dafür, ist
erst mal Sachen die eigentlich konstant sind (wie deine
Texte) aus dem RAM zu verbannen und direkt aus dem Flash
zu holen.

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.