Forum: Compiler & IDEs avr-size und RAM Verbrauch anzeigen


von Gunb (Gast)


Lesenswert?

Hallo,

ich lese ca. 3000 Bytes über SPI in ein Array ein und sende diese erst 
dann über den UART an den PC. Als Controller kommt ein Mega128 zum 
Einsatz. Die Firmware funktioniert soweit.

Meine main sieht so aus:

void main (void)
{
  uint8_t byArr[3000];
  uint16_t wCnt=0;

  USART1_Init( 25 );
  Init_Slave();

  USART1_Transmit('C');

  while(wCnt<3000)
   byArr[wCnt++]=Slave_Receive();

  byArr[2999]='Z';

  wCnt=0;

  while(wCnt<3000)
   USART1_Transmit(byArr[wCnt++]);

  while(1);
}

Frage: Wenn ich nun mit avr-size -C --mcu=atmega128 <filename>.elf den 
RAM Verbrauch anzeigen lassen möchte, dann bekomme ich unter 'Program´ 
440bytes und unter 'Data' 0bytes angezeigt.

Setze ich 'static' vor das 3000 byte Array, dann stimmt die Anzeige mit 
3000bytes bei 'Data'.

Warum ist das so? Wo steckt der Compiler denn die 3000 Byte für das 
Array hin, wenn ich 'static' weglasse? Sie müssen doch irgendwo alle 
zwischengespeichert und damit auch von avr-size erfasst werden, oder?

Danke für Support.

von Ulrich (Gast)


Lesenswert?

Mit den genauen Begriffen kenne ich mich auch nicht so aus, aber alles 
was nicht außerhalb irgendeiner Funktion deklariert wird, wird erst bei 
betreten der Funktion auf dem Heap oder Stack gespeichert. Da dies 
dynamisch ist, wird dies nicht erfasst weil es davor nicht festgelegt 
ist.

Wenn man static davor schreibt werden die Daten direkt im sram an einer 
"statischen" Position gespeichert. Dort sind die Daten die ganze Zeit 
und werden deshalb bei der Ausgabe erfasst....

von Stefan (Gast)


Lesenswert?

Das RAM ist üblicherweise in ggf. RAM-Vektoren, initialisierte Daten 
(DATA), nichtinitialisierte Daten (BSS), ggf. je nach Library 
Heapbereich (für malloc(),...) und Stackbereich aufgeteilt.

Mit static und ohne Initialisierungswerte kommt das Array in die BSS 
Sektion. Ohne static landet es üblicherweise auf dem Stack.

von Skasko (Gast)


Lesenswert?

Hi,

schau Dir doch mal diese Seite an. Sie enthält eine nette Routinne, den 
dynamischen Speicherverbrauch zu messen.


http://www.roboternetz.de/wissen/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc

/Skasko

von Gunb (Gast)


Lesenswert?

OK,

Eure Beiträge haben mir weitergeholfen :-)

Danke für Euren super schnnellen Support!

Gruss
Gunb

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.