www.mikrocontroller.net

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


Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Bei folgendem Code von Dirk Broßwick aus der Codesammlung:
void __attribute__ ((naked, section (".init8")))
__init8_mem (void)
{
  __asm volatile (
    "ldi r30, lo8 (__heap_start)"  "\n\t"
    "ldi r31, hi8 (__heap_start)"  "\n\t"
    "ldi r24, %0"                  "\n\t"
    "ldi r25, hi8 (%1)"            "\n"
    "0:"                           "\n\t"
    "st  Z+,  r24"                 "\n\t"
    "cpi r30, lo8 (%1)"            "\n\t"
    "cpc r31, r25"                 "\n\t"
    "brlo 0b"
    :
    : "i" (MASK), "i" (RAMEND+1)
  );
}

wird mit dem GCC Compiler immer folgende Fehlermeldung ausgegeben
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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&f...

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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.