Forum: Compiler & IDEs Microchip Studio, XC8, AVR-GCC und Speicherbedarf


von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe zwei kleine aber interessante Fragen.

1. Warum ist der vom XC8 erzeugte Maschinencode wesentlich größer als 
beim AVR-GCC?
2. Was bedeutet "Data Memory Usage: 22 bytes", wenn sich im Quellcode 
ein mehrere hundert Byte großes Array befindet?


MPLAB XC8 C Compiler:
1
Program Memory Usage: 3996 bytes   48,8 % Full
2
Data Memory Usage:      22 bytes    2,1 % Full

AVR-GCC Compiler:
1
Program Memory Usage: 1958 bytes   23,9 % Full
2
Data Memory Usage:      20 bytes    2,0 % Full



USART printf test (TINY824):
1
#define F_CPU 3333333UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <stdio.h>
5
6
static void USART0_sendChar(char c)
7
{
8
  while(!(USART0.STATUS & USART_DREIF_bm)) {}
9
  USART0.TXDATAL = c;
10
}
11
12
static int USART0_printChar(char c, FILE *stream)
13
{
14
  USART0_sendChar(c);
15
  return 0;
16
}
17
18
static FILE USART_stream = FDEV_SETUP_STREAM(USART0_printChar, NULL, _FDEV_SETUP_WRITE);
19
20
int main(void)
21
{
22
  stdout = &USART_stream;
23
24
  PORTB.DIRSET = PIN2_bm;          // PB2 output (USART0 TxD)
25
  USART0.BAUD = 231;               // 57600 Bd @ 3.33MHz
26
  USART0.CTRLB = USART_TXEN_bm;    // enable transmitter
27
28
  char strng[681];
29
  for(int i=0;i<681;i++)
30
  {
31
    strng[i] = 32;
32
  }
33
  for(int j=0;j<10;j++)
34
  {
35
    for(int i=0;i<10;i++)
36
    {
37
      strng[i+68*j] = i+48;
38
    }
39
    for(uint8_t i=0;i<26;i++)
40
    {
41
      strng[i+68*j+12] = i+65;
42
    }
43
    for(uint8_t i=0;i<26;i++)
44
    {
45
      strng[i+68*j+40] = i+97;
46
    }
47
  }
48
  for(int i=0;i<10;i++)
49
  {
50
    strng[66+68*i] = 13;
51
    strng[67+68*i] = 10;
52
  }
53
  strng[680] = 0;
54
55
  _delay_ms(5000);
56
57
  while(1)
58
  {
59
    printf("%s\r\n", strng);
60
    _delay_ms(1000);
61
  }
62
}


Für den AVR-GCC Compiler muss die Zeile
1
static FILE USART_stream = FDEV_SETUP_STREAM(USART0_printChar, NULL, _FDEV_SETUP_WRITE);
durch
1
static FILE USART_stream = { 0, 0, _FDEV_SETUP_WRITE , 0, 0, USART0_printChar, NULL, 0 };
ersetzt werden.

von Peter D. (peda)


Lesenswert?

Georg M. schrieb:
> 2. Was bedeutet "Data Memory Usage: 22 bytes", wenn sich im Quellcode
> ein mehrere hundert Byte großes Array befindet?

Nicht globale Variablen werden erst bei Funktionseintritt im Stack 
angelegt.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Georg M. schrieb:
> 1. Warum ist der vom XC8 erzeugte Maschinencode wesentlich größer als
> beim AVR-GCC?

Vermutlich, weil du den Compiler mit einer andere Optimierungsstufe 
verwendest. Die Optionen -O2, -O3, -Os, -flto, -fwhole-program, 
-fuse-linker-plugin stehen beim XC8 nur zur Verfügung, wenn du extra 
bezahlt.

von Oliver S. (oliverso)


Lesenswert?

Meines Wissens nach fehlen bei der kostenlosen Version dem XC8-Compiler 
die Optimierungen.

Oliver

von Peter D. (peda)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

Peter D. schrieb:
> Sollte aber gehen.
>
> 
https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaea2b6be92ead4673bc487b271b7227fb

Diese Doku bezieht sich auf Version 2.1.0 der avr-libc.

Schon Atmel lieferte mit seiner IDE eine modifizierte Version der 
Bibliothek aus. Im XC8 ist wiederum geändert worden.

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.