Microchip Studio, XC8, AVR-GCC und Speicherbedarf

#7458501
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.

Angehängte Dateien:
Gast #7458545
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren