Gast
#851510
Hi, Freunde der Nacht, Entwicklungssoftware: WinAvr und AVRStudio. Hardware: ATMEGA128@16MHz, 4k int.RAM und 60K externes RAM. Eigentlich wollten wir der Einfachheit Heap UND statisch deklarierte Variable ins externe RAM packen und fertig. Unsere Firmware muss aber einen einen schnellen Sampling-Job (10µs/Sample)erledigen. Die gesampelten Daten kommen in ein 512Byte großes Array. Und jetzt das Problem: Die Zeit wird auch bei 16MHz, d.h. 160 Takte für ein Sample etwas knapp. Internes RAM benötigt lt. Datenblatt 2 Takte für einen Zugriff, externes RAM ohne Waitstates 4 Takte. Arbeitsvariable und Sampling-Array im externen RAM: ZU langsam. Also müssen die statischen Var. doch ins interne RAM (4K). Und das ist langsam voll. Stackkollision droht. Also versuche ich, zu optimieren. Dazu die Memorymap mit avr-nm generiert: E:\Programme\WinAVR\bin\avr-nm.exe --print-size --demangle --numeric-sort RLX_ExtMem_IntRam.elf>RLX_ExtMem_IntRam.map Beachte: Numerisch, also nach Adressen aufsteigend sortiert! Und hier sind seltsame Unstimmigkeiten, die ich nicht verstehe. Hier ein Beispiel: ......... 00800966 00000002 D ucHeaderLen 00800b26 00000001 D LCD240_DisplayMode 00800b27 00000001 D LCD240_CurSize d.H. - jetzt mal ohne den 800000-Offset: LCD240_DisplayMode wird ab B26h abgelegt, ist 1 Byte lang, und das nächste Datum heißt LCD240_CurSize und wird ab B27h abgelegt. Soweit stimmt die Rechnung Aaaaaaaaaber: ucHeaderLen liegt bei 966h und ist 2Byte groß. Nächstes Datum LCD240_DisplayMode läge also bei 968h. Wieso gehts hier bei B26 weiter? Und wo verschwinden die Differenz von (B26h-966h) = 488d Byte? Anderes, ähnliches Beispiel: ........... 00800583 00000014 D pe1 008005a5 00000014 D pe2 008005c7 00000014 D pe3 008005e9 00000014 D peBack 008006c7 0000000e d C.0.2509 00800962 00000002 D ucIndexLen Wieso liegen z.B. die pe.. Variable mit Länge 14h nicht 14h Byte sondern 22h Byte auseinander? Und was ist das Symbol "C.0.2509" für ein seltsames Ding, das scheinbar 962h-6C7h = 296h(667d!) Byte verbraucht, bis die nächste Var. ucIndexLen kommt? Wenn mir das jemand erklären könnte wärs klasse. Vielen Dank schonmal im voraus.