Neuerliche Bitte um Hilfe bei C, diesmal geht es um Optimierung des Datenbereiches. Ich glaube, das passt hier unter diesen Titel; ein neuer Thread scheint mir nicht nötig.
Aufgabe: RAM im mega168 optimieren bei AVR-Studio/WINAvr.
Grund: die derzeitige Memoryaufteilung:
Code:
AVR Memory Usage
----------------
Device: atmega168
Program: 4324 bytes (26.4% Full)
(.text + .data + .bootloader)
Data: 782 bytes (76.4% Full)
(.data + .bss + .noinit)
benötigt 76 % des Datenbereichs. Da ich noch einige Variablen für die Programmerweiterung einbringen muss, ist eine Optimierung erforderlich.
Was habe ich bisher getan?
Mir schien der File *.map
Code:
Archive member included because of file (symbol)
c:/programme/winavr-20070525/bin/../lib/gcc/avr/4.1.2/avr5\libgcc.a(_exit.o)
Rest gestrichen - wegen zu großer Länge des postings und weil es nicht mehr relevant ist, siehe Nachtrag
.debug_macinfo
*(.debug_macinfo)
OUTPUT(2drehzmess-168.elf elf32-avr)
LOAD linker stubs
am vielversprechendsten. Leider verstehe nicht nicht alles (das ist leicht übertrieben - sollte heissen: verstehe fast nix).
Ich erkenne
Code:
Memory Configuration
Name Origin Length Attributes
text 0x00000000 0x00020000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
*default* 0x00000000 0xffffffff
diesen Memory-Abschnitt. Offenbar geht der Datenbereich ab 0x00800060 los. Geht der bis 0x00810000?? Vermutlich ist die 0x0081 ein compilerinterner offset. Trotzdem - das wären ja 64 KByte data [-X das stimmt doch nicht - das Datenblatt sagt, dass das SRAM von 0x0100 bis 0x04FF geht - und das sind die 1024 Bytes die ich im Kopf habe (nein, das ist nicht die Anzahl meiner Synapsen, sondern die Anzahl der SRAM-Bytes des m16.
Ok, dann gibt es den Bereich "COMMON". In diesem Abschnitt der map stehen dann auch die Variablennamen drinnen, von denen ich denke, dass sie optimierbar sind. Statt int16 eben int8 - wenn das geht. Aber ich brauche auch Werte +/- 64000 (wenn ich beim Überlauf den int16 auf Null setze und den neuen Wert vom alten abziehe - bekomme ich etwas zwischen minus64000 und minus63000, so in der Art) für meine Zeitrechnung. Und dann komme ich leider auf die speicherfressenden signed long
Die Wertebereiche entnehme ich dem C-Tutorial. Daraus entnehme ich, dass uint16_t eben ein unsigned short ist und int16 ein signed short - entsprechend den Angaben im AVR-GCC-Tutorial.
BEVOR ich die Schere (und mein analytisches Gehirn) hier ansetze, wollte ich wissen, woran ich wirklich bin. Daher diese ausführliche Beschreibung.
Meine Fragen:
1) Kann ich Daten NUR im SRAM ablegen (doch wohl nicht)?
2) Kann ich es steuern, ob Daten im SRAM abgelegt werden?
3) Kann ich Daten ins Flash bringen?
4) Wie kann ich Daten (Zahlenwerte) in den Flashbereich bringen? Sind die dort langsamer zugreifbar? Mir ist klar, dass im Datenblatt steht: "– Write/Erase cyles: 10,000 Flash/100,000 EEPROM".
5) Vermutlich ist es unsinnig, Daten für ISR ins EEPROM zu schreiben, weil das Schreiben und wieder holen zeitaufwendig ist ! ? ! ?
Danke im Voraus,
Nachtrag : Mi.. - ich war schon wieder viel zu voreilig. Hab mal die ganzen
Code:
sendUSART("Motor dreht links, Drehzahl läuft hoch.\r\n");
sendUSART("PWM-Stellwerte\r\n");
sendUSART("_n__li__re\r\n");
und
Code:
utoa(Izeit_1, wortiz1, 10);
sendUSART(wortiz1);sendUSART(" ");
utoa(Iz_diff1, wortzd1, 10);
sendUSART(wortzd1);sendUSART(" ");
sendUSART(worti);sendUSART(" "); //PWM-Stellwerte
sendUSART(wortkli);sendUSART(" ");
sendUSART(wortkre);sendUSART("\r\n");
auskommentiert. Und ein erfrischendes Ergebnis nach dem Compilieren bekommen:
Code:
AVR Memory Usage
Device: atmega168
Program: 2522 bytes (15.4% Full) (.text + .data + .bootloader)
Data: 36 bytes (3.5% Full) (.data + .bss + .noinit)
Sorry, das hätte ich wirklich vor dem Fragen machen können.
Lesezeichen