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:benötigt 76 % des Datenbereichs. Da ich noch einige Variablen für die Programmerweiterung einbringen muss, ist eine Optimierung erforderlich.Code:AVR Memory Usage ---------------- Device: atmega168 Program: 4324 bytes (26.4% Full) (.text + .data + .bootloader) Data: 782 bytes (76.4% Full) (.data + .bss + .noinit)
Was habe ich bisher getan?
Mir schien der File *.map
am vielversprechendsten. Leider verstehe nicht nicht alles (das ist leicht übertrieben - sollte heissen: verstehe fast nix).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
Ich erkenne
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 dataCode:Memory Configuration Name Origin Length Attributes text 0x00000000 0x00020000 xr data 0x00800060 0x0000ffa0 rw !x eeprom 0x00810000 0x00010000 rw !x *default* 0x00000000 0xffffffff[-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
undCode:sendUSART("Motor dreht links, Drehzahl läuft hoch.\r\n"); sendUSART("PWM-Stellwerte\r\n"); sendUSART("_n__li__re\r\n");
auskommentiert. Und ein erfrischendes Ergebnis nach dem Compilieren bekommen: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");
Sorry, das hätte ich wirklich vor dem Fragen machen können.Code:AVR Memory Usage Device: atmega168 Program: 2522 bytes (15.4% Full) (.text + .data + .bootloader) Data: 36 bytes (3.5% Full) (.data + .bss + .noinit)







Zitieren
Lesezeichen