gcc-avr geht nicht unter debian 4.0

Gast #703228
Lesenswert?

Es fehlt wohl eher der avr-gcc, bzw. steht er nicht in eimem bekannten 
Pfad. Also. erst einmal prüfen, ob überhaupt ein avr-gcc installiert 
ist, und wenn ja, die Pfade richtig einstellen.

Oliver
Persönliche Seite #704161
Lesenswert?

Beim ersten Kompilierversuch gibt AVR-GCC aus WINAVR-20070525 einen 
internen Fehler:
1
avr-gcc -mmcu=atmega32 -Wall -Werror -Wstrict-prototypes -Os -mcall-prologues -DF_CPU=3686400 -DF_CAN=8000000 -DCAN_SPEED=125000 -I. -I../../canix -I../.. -I../../include -DMCU_atmega32 -DCANIX_SYSLOG -DCANIX_HMS -DCANIX_RTS -DCANIX_EDS    -c -o ../../canix/mem_check.o ../../canix/mem_check.c
2
../../canix/mem_check.c:26: internal compiler error: in start_function, at c-decl.c:6035
3
Please submit a full bug report,
4
with preprocessed source if appropriate.
5
See <URL:http://sourceforge.net/tracker/?atid=520074&group_id=68108&func=browse> for instructions.
6
MAKE.EXE: *** [../../canix/mem_check.o] Error 1

Die Source (../../canix/mem_check.c) sieht wie folgt aus:
1
#include <canix/mem_check.h>
2
#include <avr/io.h>
3

4
#define MASK 0xaa
5

6
extern uint8_t __heap_start;
7

8
uint16_t get_mem_unused(void)
9
{
10
  uint16_t unused = 0;
11
  uint8_t *p = &__heap_start;
12

13
  do
14
  {
15
    if (*p++ != MASK)
16
      break;
17

18
    unused++;
19

20
  } while (p <= (uint8_t*) RAMEND);
21

22
  return unused;
23
}
24

25
void __attribute__ ((naked, section (".init8"))) __init8_mem(void)
26
{ // hier ist Zeile 26
27
  __asm volatile (
28
      "ldi r30, lo8 (__heap_start)" "\n\t"
29
      "ldi r31, hi8 (__heap_start)" "\n\t"
30
      "ldi r24, %0" "\n\t"
31
      "ldi r25, hi8(%1)" "\n"
32
      "0:" "\n\t"
33
      "st Z+,r24" "\n\t"
34
      "cpi r30, lo8(%1)" "\n\t"
35
      "cpc r31, r25" "\n\t"
36
      "brlo 0b"
37
      :
38
      : "i" (MASK), "i" (RAMEND+1)
39
      );
40
}

Auslöser für den Fehler ist der Teil
1
__attribute__ ((naked, section (".init8")))

Kommentiert man den ganz oder teilweise (den naked Teil) aus, klappt das 
Übersetzen. Das ist aber möglicherweise nicht der Sinn des Ganzen.

Man kann das Problem durch einen Funktionsprototypen umgehen:
1
#include <canix/mem_check.h>
2
#include <avr/io.h>
3

4
#define MASK 0xaa
5

6
extern uint8_t __heap_start;
7

8
uint16_t get_mem_unused(void)
9
{
10
  uint16_t unused = 0;
11
  uint8_t *p = &__heap_start;
12

13
  do
14
  {
15
    if (*p++ != MASK)
16
      break;
17

18
    unused++;
19

20
  } while (p <= (uint8_t*) RAMEND);
21

22
  return unused;
23
}
24

25
void __init8_mem(void) __attribute__ ((naked, section (".init8")));
26
void __init8_mem(void) 
27
// void __attribute__ ((naked, section (".init8")))  __init8_mem(void)
28
{
29
  __asm volatile (
30
      "ldi r30, lo8 (__heap_start)" "\n\t"
31
      "ldi r31, hi8 (__heap_start)" "\n\t"
32
      "ldi r24, %0" "\n\t"
33
      "ldi r25, hi8(%1)" "\n"
34
      "0:" "\n\t"
35
      "st Z+,r24" "\n\t"
36
      "cpi r30, lo8(%1)" "\n\t"
37
      "cpc r31, r25" "\n\t"
38
      "brlo 0b"
39
      :
40
      : "i" (MASK), "i" (RAMEND+1)
41
      );
42
}

Das HEX-File ohne sonstige Änderungen ist im Anhang.
Angehängte Dateien:
Moderator Persönliche Seite #705264
Lesenswert?

Stefan "stefb" B. wrote:

> ../../canix/mem_check.c:26: internal compiler error: in start_function,
> at c-decl.c:6035
> Please submit a full bug report,
> with preprocessed source if appropriate.

Der Bug ist bereits bekannt.  Interessant, dass du ihn auch bekommst,
ich habe ihn bislang nur gegen die WinAVR-Version des Compilers
berichtet gesehen, konnte ihn aber auf FreeBSD und Linux nicht
nachvollziehen.

Seltsamerweise finde ich den Bugreport im GCC-Bugzilla nicht.
Möglicherweise ist er ja inzwischen repariert.

> Auslöser für den Fehler ist der Teil
>
1
> __attribute__ ((naked, section (".init8")))
2
>

Genau.

> Man kann das Problem durch einen Funktionsprototypen umgehen:

Ja, das ist der sinnvolle workaround.

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