Forum: Mikrocontroller und Digitale Elektronik Wie richtig: avrgcc inline assemler


von daniel (Gast)


Lesenswert?

Hallo zusammen,

ich bin ziemlich ratlos. Nach langem hin und her probieren
weiß ich leider nicht wie das gehen soll
1
int main(void) {
2
  uint8_t tmp;
3
  uint16_t addr = 0;
4
  while(1) {
5
    //__asm volatile("ldi r31, %B0" : : "0" ((addr >> 8) 0xFF));
6
    //__asm volatile("ldi r30, %1" : : "I" (addr & 0xFF));
7
    __asm volatile("lpm");
8
    __asm volatile ("ld %0, r0" : "=l" (tmp));
9
    addr += 1;
10
    PORTD = ~tmp;
11
    _delay_ms(100);
12
  }
13
}

Ich will Z pointer (r31:r30) mit addr laden, um danach mit lpm Befehl
den Flash auszulesen und das Ergebnis in r0 in tmp zu schieben und
am Port auszugeben.

Wie zum Teuf** lautet die richtige Syntax dafür?
Ich verstehe wohl nicht ganz was die "constraints" bewirken.
Mir scheint das gcc inline assembly "kind of" vermurkst ist.
Das was aktuell in den kommentierten Zeilen steht, ist mein letzter 
Versuch gewesen.

Mein Dank im Voraus.
Daniel

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Also ich würd dir glatt anraten das als Funktion in eine Assemblerdatei 
auszulagern.

GCC Registerkonventionen kennste?

von (prx) A. K. (prx)


Lesenswert?

daniel schrieb:
> Wie zum Teuf** lautet die richtige Syntax dafür?

#include <pgmspace.h>
... = pgm_read_byte(addr);

von daniel (Gast)


Lesenswert?

A. K. schrieb:
> daniel schrieb:
>> Wie zum Teuf** lautet die richtige Syntax dafür?
>
> #include <pgmspace.h>
> ... = pgm_read_byte(addr);

Der Vorschlag hilft sicher vorübergehend.

>Also ich würd dir glatt anraten das als Funktion in eine Assemblerdatei
>auszulagern.
>GCC Registerkonventionen kennste?

Nicht wirklich. Ich müsste mir das anlesen.

Ich halte gcc inline asm insofern für bessere Lösung, weil ich dieses
Wissen auch bei ARM einsetzen gedenke.

Kennt jemand vielleicht die "inline" Lösung?

Gruß,
Daniel

von (prx) A. K. (prx)


Lesenswert?

daniel schrieb:
> Kennt jemand vielleicht die "inline" Lösung?

Herrje. Der Source-Code von pgm_read_byte:
http://www.nongnu.org/avr-libc/user-manual/pgmspace_8h.html

von Andreas B. (andreasb)


Lesenswert?

daniel schrieb:
> Ich halte gcc inline asm insofern für bessere Lösung, weil ich dieses
> Wissen auch bei ARM einsetzen gedenke.
>
> Kennt jemand vielleicht die "inline" Lösung?

Beitrag "Re: Source von pgm_read_byte"


mfg Andreas

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Egal ob avr-gcc oder arm-elf-gcc das ist ähnlich, wenn nicht sogar 
gleich.

Es ist einfach so, dass man mit inline asm total in die sch**e rennen 
kann und nichmal weis warum.

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.