Forum: Compiler & IDEs Datenaustausch C-Assembl funktioniert nicht


von Günther (Gast)


Lesenswert?

Hallo,
weiß jemand, wie man Daten von
einem C-Programm mit dem inline-Assemblercode
austauscht?

Ich hatte im Tutorial von Christian Schifferle
erfreut gelesen, wie einfach das ist.
Aber pustekuchen, es funktioniert nicht.

Am liebsten wäre mir
  x = inp (0x1B);
Da mault  der avr-gcc-Compiler:
invalid lvalue in unary &. (Was das wohl soll?)

Hingegen wird
  x = inp (PORTA);
nicht beanstandet, obwohl PORTA = 0x1B.

Aber PORTA wollte ich gar nicht, ich wollte
von beliebigen Speicherstellen, die per Assembler
beschrieben sind, im C-Programm lesen (und schreiben).

Es geht auch nicht, wenn ich in die avr/iom16.h
hineinschmuggle
#include  AAA = r16  oder eine normale Adresse.

Bei
  x = inp (AAA); kommt die Fehlermeldung
r16 undeklariert.

Das gleiche lese ich, wenn ich aus Chr. Schifferles
Tutorial abschreibe:
 x = inp (USR);  -- undeklariert.

IOm16.h ist nicht direkt, sondern über io.h eingebunden
und der Compiler verwendet die Datei auch, wie die
Fehlermeldung zeigt.

Was mache ich denn da falsch?

von Matthias (Gast)


Lesenswert?

Hi

da der AVR ja alles in den SRAM mappt (inkl. Register und IO-Speicher)
sollte ein Pointer reichen. Für R16 also etwa so:

x = *(unsigned char *)0x15;

Matthias

von Matthias (Gast)


Lesenswert?

Hi

wobei das natürlich
x = *(unsigned char *)0x10;
für R16 heißen sollte. Mift.

Matthias

von Jörg Wunsch (Gast)


Lesenswert?

@Günther:

> Am liebsten wäre mir
>   x = inp (0x1B);

inp() ist `deprecated'.  Don't use it.  Schreibe

    x = PORTA;

> Hingegen wird
>   x = inp (PORTA);
> nicht beanstandet, obwohl PORTA = 0x1B.

Wie kommst Du auf diese Idee?  PORTA ist vielmehr definiert als
(*(volatile unsigned char *)0x3b).  Kannst Du Dir einfach angucken,
indem Du auf die Ausgabe des C-Präprozessors schaust (avr-gcc -E ...).
Spätestens an dieser Stelle sollte Dir auch klar sein, warum Deine
inp(0x1B) Variante nicht funktioniert.

Für ein aktuelles inline assembler tutorial nimm bitte das inline
assembler cookbook, das der avr-libc Doku beiliegt.  Wenn Du WinAVR
hast, liegt das auf Deiner Platte...  (Wenn Du kein WinAVR hast, aber
Windows, dann solltest Du wahrscheinlich besser erstmal einen Upgrade
machen.)

Online:
http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

Hier aber besser noch 1...2 Tage warten, so daß dort 1.0.3 oben drüber
steht als Release.  Diese Version hat Ted Roth gestern veröffentlicht,
aber wir sind noch nicht dazu gekommen, die Doku auf dem Webserver zu
aktualisieren.

inp() hat übrigens mit r16 nix am Hut...  Du verwechselst working
registers mit IO registers.

von Jörg Wunsch (Gast)


Lesenswert?

> Online:
> http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

> Hier aber besser noch 1...2 Tage warten, so daß dort 1.0.3 oben
> drüber steht als Release.

Ist inzwischen aktualisiert.

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.