Forum: Compiler & IDEs in C (gcc) eingebundene asm funktion


von seacrash (Gast)


Lesenswert?

Hallo,

Bei folgendem Code von Dirk Broßwick aus der Codesammlung:
1
void __attribute__ ((naked, section (".init8")))
2
__init8_mem (void)
3
{
4
  __asm volatile (
5
    "ldi r30, lo8 (__heap_start)"  "\n\t"
6
    "ldi r31, hi8 (__heap_start)"  "\n\t"
7
    "ldi r24, %0"                  "\n\t"
8
    "ldi r25, hi8 (%1)"            "\n"
9
    "0:"                           "\n\t"
10
    "st  Z+,  r24"                 "\n\t"
11
    "cpi r30, lo8 (%1)"            "\n\t"
12
    "cpc r31, r25"                 "\n\t"
13
    "brlo 0b"
14
    :
15
    : "i" (MASK), "i" (RAMEND+1)
16
  );
17
}

wird mit dem GCC Compiler immer folgende Fehlermeldung ausgegeben
1
hardware/mem-check.c:54: internal compiler error: in start_function, at c-decl.c:6014

Leider kann ich nicht nachvollziehen, was in dieser Codesequenz im 
Einzelnen geschieht und kann deshalb in keinster Weise sinvolle 
Änderungen machen. Aus dem Kontext konnte ich erkennen, das es sich um 
eine Art in Assembler realisierten Zähler handelt, der den freien 
Speicher bestimmen soll und einer c Funktion zur Verfügung stellt.
Kann jemand genaueres über die Funktion und ihre Realisierung sagen?

Danke

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Es nullt den Platz oberhalb von __heap_start bis RAMEND aus.
Da es sich um einen internal compiler error (ICE) handelt, darfst du
das gern bei GCC als Bugreport einreichen, sofern es sich um eine
hinreichend aktuelle Compilerversion handelt (also GCC 4.1.x
wenigstens).

Allerdings ist das Ding grottig geschrieben, da es die Register
24, 25, 30 und 31 benutzt, ohne dies dem Compiler mitzuteilen.
Auch ist nicht wirklich einzusehen, warum er das nicht gleich in
C geschrieben hat, sondern sich mühevoll einen in inline asm
dafür abgebrochen hat.

Ich würde dir eher zu Dean Camera's Lösung raten:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=305626#305611

Last but not least darf der sterbliche Nutzer keine Namen erfinden,
die mit zwei Unterstrichen beginnen.  Solche Namen sind für Compiler
und Bibliothek reserviert.

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.