Speicher richtig nutzen

OP Persönliche Seite #5605785
Lesenswert?

Hi,
ich muss zur später Stunde noch eine dumme Frage loswerden :)

AVR Memory Usage
----------------
Device: atmega16
Program:   15716 bytes (95.9% Full)
(.text + .data + .bootloader)
Data:        327 bytes (31.9% Full)
(.data + .bss + .noinit)
EEPROM:        6 bytes (1.2% Full)
(.eeprom)

Abgesehen davon, dass ich
-  20% Testroutinen mit zusätzlichem Display drin habe
-  einige Strings auf den Eprom auslagern kann.
-  sehr bald auf einen atmega32 oder 664 umsteingen werde.

Was ist noch anständige Programmiertechnik, um den Flash weniger und 
dafür das Eprom mehr zu nutzen?



Grüße Oekel
#5605867
Lesenswert?

Ben B. schrieb:
> Angesichts der geringen Größe des EEPROMs? Nichts.

Außerdem ist das EEPROM langsam, und man kann keinen Code dort 
ausführen. Es ist nur dazu gedacht, um sich über Aus-/Ainschaltzyklen 
hinweg ein paar Werte merken zu können.
Prinzipiell könnte man sich aber Initialwerte von Variablen darin 
merken. Man muss die Werte dann allerdings alle selbst in die Variablen 
schreiben, was wieder zusätzlichen Code produziert, der den Vorteil 
wieder verschlingt.
Gast #5605885
Lesenswert?

D a v i d K. schrieb:
> Was ist noch anständige Programmiertechnik, um den Flash weniger und
> dafür das Eprom mehr zu nutzen?

Das hängt von deinem Programm ab. Was hast du an evtl. unnötig 
luxoriösen Blbliotheksroutinen verwendet (Float, formatierte Ausgaben), 
was kann von den Daten ins EEPROM verlagert werden, ...
Nur du kennst dein Programm.
#5605892
Lesenswert?

D a v i d K. schrieb:
> Was ist noch anständige Programmiertechnik, um den Flash weniger und
> dafür das Eprom mehr zu nutzen?

Für weniger Flash:
Copy&Paste Monster durch Schleifen, Tabellen und Unterfunktionen 
ersetzen.

Ich finde es immer wieder nervend, wenn man haufenweise Codesequenzen 
lesen muß, die zu 90% identisch sind. Ich komme mir dabei vor, wie bei 
Sport1: Finden sie die 4 Unterschiede.
#5605954
Lesenswert?

Peter D. schrieb:
> Wolfgang schrieb:
>> Was hast du an evtl. unnötig
>> luxoriösen Blbliotheksroutinen verwendet (Float, formatierte Ausgaben)
>
> Bibliotheken kosten immer nur beim ersten Aufruf was.

Dann aber ggf. recht viel. Anders ausgedrückt: Es reicht nicht, einen 
einzelnen Aufruf einer großen Bibliotheksfunktion zu entfernen, sondern 
es müssen schon alle sein.

> Sie machen selten den Hauptteil des Flashverbrauchs aus.

Ja, wenn man weiß, welche zu vermeiden sind.
Persönliche Seite #5606006
Lesenswert?

D a v i d K. schrieb:
>
> Was ist noch anständige Programmiertechnik, um den Flash weniger und
> dafür das Eprom mehr zu nutzen?
>
Welches Problem willst du lösen? Wenn ich einen 4k-Mikrocontroller zu 
90% fülle, habe ich die richtige Flash-Größe verbaut. Wenn ein 
8k-Mikrocontroller zu teuer ist, der Code aber 4,1k Größe hätte, würde 
ich in Hektik ausbrechen und etwas ändern.

Grundsätzlich kannst du den EEPROM auf zwei Arten verwenden:
1. Kalibrierung bei der Programmierung
2. Zustandsgröße(n) über Ausschaltung retten.

Den 1. Fall hast du, wenn du den ADC verwendest und irgendwie 
kompensieren musst (Stichwort Gain-Error, Offset, Linearität). Du legst 
dort einmal für jeden Controller spezifische Werte ab. Während der 
gesamten Lebenszeit ändern sich die Daten nicht. Der Vorteil: das 
Programm bleibt dasselbe, nur der EEPROM-Teil muss je Controller 
geändert werden.

Im 2. Fall wird es komplizierter, da es mit der Anzahl der Schreibzyklen 
weitere Einschränkungen gibt, der EEPROM ist nicht unbegrenzt oft 
schreibbar. Es fällt Zusatzaufwand wie ein Ringspeicher an, den EEPROM 
gleichmäßig zu nutzen. Dabei wird ein deutlich kleinerer Datensatz im 
EEPROM fortlaufend verteilt und ein Adressring im EEPROM zeigt die 
aktuelle Adresse an. Das verkleinert den Speicher weiter.
Gast #5606137
Lesenswert?

Peter D. schrieb:
> Bibliotheken kosten immer nur beim ersten Aufruf was. Sie machen selten
> den Hauptteil des Flashverbrauchs aus.

Das kommt auf das Programm an.
Bei einem simplen 'printf("Hello World %.3f",3.14/pi()'-Programm kann 
das anteilig schnell ausarten und das Programm vom TO kennt nur er 
selber.

Er könnte natürlich mal in seinen LST-File gucken, um zu ergründen, wo 
der Speicher bleibt.
Gast #5606181
Lesenswert?

Wolfgang schrieb:
> 'printf("Hello World %.3f",3.14/pi()'
sprintf und sscanf mit float Unterstützung kosten auf einem AVR schnell 
mal eben 3,5k Flash

Das sind bald 25% dieses µC

--------
> Was ist noch anständige Programmiertechnik,
Ohne den Code zu sehen ist das alles nur stochern im Nebel.

Wie soll man vergleichen und entscheiden können, wenn man nichts sieht?
OP Persönliche Seite #5609567
Lesenswert?

Jetzt ist G. schrieb:
>> Device: atmega16
> Program:   15716 bytes (95.9% Full)
>
> Raus mit dem unnoetigen Muell. zB weg mit
> - printf()
> - floating point
> - stringlibraries
> - andere libraries

Hab ich alles erst gar nicht drin...

Arduino Fanboy D. schrieb:
> Ohne den Code zu sehen ist das alles nur stochern im Nebel.

Ging mir auch nur um grundlegende Dinge.

DPA schrieb:
> Auf jeden fall mit "-Os -ffunction-sections -fdata-sections
> -Wl,-gc-sections" kompilieren & linken.

Hat tatsächlich noch 2% gebraucht! Danke

Wolfgang schrieb:
> Er könnte natürlich mal in seinen LST-File gucken, um zu ergründen, wo
> der Speicher bleibt.

Kannst du da evtl. genauer drauf eingehen. Klingt nach einer weiteren 
Wissenslücke bei mir.
Gast #5610321
Lesenswert?

D a v i d K. schrieb:
> Wolfgang schrieb:
>> Er könnte natürlich mal in seinen LST-File gucken, um zu ergründen, wo
>> der Speicher bleibt.
>
> Kannst du da evtl. genauer drauf eingehen. Klingt nach einer weiteren
> Wissenslücke bei mir.

Das hört sich danach an das readelf, nm, size und objdump nicht wirklich 
bekannt sind?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren