avr-size und RAM Verbrauch anzeigen

Gast #484289
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.
Gast #484301
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....
Gast #484330
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.