www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit Stackptr und sbic bei GCC-Inline-ASM


Autor: David Reis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salute,

hab hier momentan ein Problem mit dem AVR-GCC 3.4.1 und der inline
ASM-Funktion, genauer gesagt mit dem Schreiben von Registern. Zwei
Codestellen erzeugen Fehler:

asm("ldi R16, 0x5F"
"out SPL, R16"
"ldi R16, 0x08"
"out SPH, R16"::)

( wobei 0x5F == LOW(RAMEND) und 0x08 == HIGH(RAMEND); Einsatz der
beiden Konstanten ebenfalls Fehler. Das Ganze laesst sich mit SPH =
0x08; SPL = 0x5F; in C loesen, ist aber trotzdem nicht normal - oder?
)

ebenso:
asm("sbic PORTB, data"::)

( wobei .equ data, 1 und im Funktionsaufruf davor ein sbic PORTB, clock
einwandfrei funktioniert; am .equ oder dem Namen liegts ebenfalls nicht
)

erzeugen

<linInASM>: Error: Constant value required

Jemand eine Idee? uC ATMega32, WinAVR von gestern unter Windwos 2000.

Danke,
David

PS: ".def" ergibt "unknown pseudo-op: .def". Evtl. ein Hinweis? Und
wie krieg ich .def zum Laufen?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe ich das richtig, daß Du den Stackpointer verändern möchtest?

Ist dafür nicht der Startup-Code verantwortlich, der eh' zum Programm
gelinkt wird?

Autor: David Reis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, sicher? In saemtlichen Tutorials steht, dass vor der Verwendung von
Unterprogrammen manuell der Stack-Ptr initialisiert werden muss. Mir
gings aber auch eher darum, dass nicht geht, was eigentlich gehen
sollte. Ebenso grade passiert:

sbi PORTD, 2
...
cbi PORTD, 2

Error: Constant value required

Kryptisch...

Danke,
David

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Inline-ASM und GCC ist etwas, naja, gewöhnungsbedürftig. Ließ dazu
bitte in der AVRLibc Doku den entsprechenden Abschnitt.

Aber am SP mußt du nicht (und sollst auch nicht) manuell rumhantieren.
Das macht der Compiler bzw. der Start-Up Code für dich.

Und du setzt nicht zufällig einen Mega128 ein und Unterprogramme
funktionieren nicht?

Matthias

Autor: David Reis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ist ein Atmega32, wie gesagt, und der Code nicht arg kompliziert. Werd
mir jedenfalls mal die Libc-Doku ansehen, danke...

David

Autor: David Reis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grade nachgesehen, war bereits bekannt und so implementiert. Nur nicht
gewusst, dass das Dokument offiziell ist. Mir gefaellts jedenfalls :)

David

Autor: David Reis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry fuer TP, aber:

in R21, PORTB

Error: constant value required

Keiner eine Idee? :/

David

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schau mal in die docu der avrlib-c:

asm("in r21, %0" : : "I"(_SFR_IO_ADDR(PORTB)));


Gruß
Andreas

Autor: David Reis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, das muss so? blush
Sorry fuer die Vergeudung eurer Zeit, hatte ich wohl nicht richtig
gelesen...

duck,
David

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles, was Du da schreibst, geht doch viel einfacher in C.

Man fängt sich mit Assembler immer Portabilitätsprobleme ein, sollte
ihn daher nur dann benutzen, wenn es auch wirklich notwendig ist.

Und einfach so auf Register zu schreiben ist in der Regel tödlich, wenn
man sie vorher nicht gepusht hat.
Der Compiler sichert nur die Register, die er auch selber verwendet.


Die einzige Notwendigkeit für Assembler sind eigentlich nur
superschnelle Interrupts, wo das unsägliche R0,R1-Geraffel zu lange
dauert (9 unnütze Zyklen).


Peter

Autor: David Reis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das, was ich schrieb, waren natuerlich nur Teile von ASM-Code, an
Stellen, wo ich die Struktur nicht durch C aufbrechen wollte.
Inzwischen allerdings ist das Programm auf C umgebaut, mit ASM-Includes
und Unterfunktionen, das funtioniert viel besser. Sind jetzt nur noch
Dinge wie Shifts u ae in ASM, auf der Ebene einfacher zu verstehen und
wohl auch schneller.
Zugegebenermaszen versuche ich grade ein Problem mit der
Ueberschreibung von Registern zu loesen :) Ist auch eher ein
Lernprojekt fuer mich.

David

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schieben kann man auch in C, sogar mit mehreren Schreibweisen und auch
16 oder 32 Bit.

nach links:

i <<= 1;
i += i;
i *= 2;

nach rechts:

i >>= 1;
i /= 2;

Such Dir eine aus.
Beim Rechtsschieben Typ (signed/unsigned) beachten !


Das mit den Registern ist alles andere als trivial.
Mit etwas Glück faßt der Compiler R2...R11 nicht an, die kannst Du dann
selber verwenden.

Aber es gibt keinen Mechanismus, es dem Compiler zu verbieten oder ihm
wenigtens ne Warnung zu entlocken, falls er es doch versucht.

Es bleibt also nur, im gesamten Programmlisting danach zu suchen, ob
die Register wirklich nur an den gewünschten Stellen verwendet werden.


Peter

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.