Forum: Mikrocontroller und Digitale Elektronik Kontrollerregister R16 bzw R17 in Variable speichern (inline-assembler?)


von Detlev Neumann (Gast)


Lesenswert?

Hallo Zusammen

Kann ich den Inhalt ein Kontrollerregister (assembler) R16 bzw. R17 
mittels Ansi-c in eine Variable speichern. Meine Idee wäre 
inline-assembler aber ich weis nicht wie und ich finde auch keinen 
Forums Beitrag zu diesem Thema

Danke für die Hilfe

Detlev

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Für welchen µC in welchem Compiler?

von Detlev Neumann (Gast)


Lesenswert?

ATMega128 --> IAR aber ich bin auch mit einer Lösung für gcc (WinAVR) 
zufrieden ich benutze beiden

Danke

Detlev

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


Lesenswert?

"ANSI-C" kennt keinen Inline-Assembler, auch sein Nachfolger, ISO-C99
kennt sowas nicht.

Die Inline-Assembler zwischen IAR und GCC unterscheiden sich dramatisch,
und in diesem Falle schlägt der GCC den IAR um Längen: beim IAR hat
man keinerlei Möglichkeit, dass der Compiler einem irgendwelche
Parameter des umgebenden C-Codes (wie bspw. die Stelle, an der sich
eine lokale Variable befindet) mit in die Inline-Asm-Anweisung hinein
gibt.  Man muss einfach wissen, wo der Compiler gerade was abgelegt
hat, und dieses Wissen könnte natürlich bereits mit der nächsten
Compilerversion zu Halb- oder Unwissen verkümmert sein.

Beim GCC geht das ungefähr so:
1
#include <stdint.h>
2
...
3
  uint8_t save_r16, save_r17;
4
5
  asm volatile("mov %[sr16], r16" "\n\t"
6
               "mov %[sr17], r17"
7
               : [sr16] "=r" (save_r16), [sr17] "=r" (save_r17)
8
               );

Details unter:

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

Denk aber auch dran, dass das, was für den IAR die Register r16 und
r17 sind, für den AVR-GCC in der Regel die Register r24 und r25
sind.  Vielleicht beginnst du ja lieber damit, dein eigentliches
Problem zu beschreiben.

von Detlev Neumann (Gast)


Lesenswert?

Danke sollte helfen wenn ich noch fragen habe komme ich zurück und 
stelle Sie

von Detlev Neumann (Gast)


Lesenswert?

Kennt jetzt jemand eine Seite indem ich asm inline für den IAR Kompiler 
abkupfer oder erlernen kann

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


Lesenswert?

Detlev Neumann schrieb:
> Kennt jetzt jemand eine Seite indem ich asm inline für den IAR Kompiler
> abkupfer oder erlernen kann

Frag' doch bei IAR's Support nach, hast schließlich eine hübsche
Stange Geld für den Compiler bezahlt.

Aber wie schon geschrieben, dort ist das nichts weiter als:
1
   asm("mov r12, r16");
2
   asm("mov r13, r17");

Irgendwelche Parameter kennt der meines Wissens nicht.

von Detlev Neumann (Gast)


Lesenswert?

Und die Lösung ist z.B.

      asm ("STS LWRD((save_R16)),R16");
      asm ("STS LWRD((save_R17)),R17");

wer suchet der findet :-)

Apropo Support meine Version ist so alt da gibt es keinen Support aber 
man muss sich nur zu helfen wissen


Danke für den denk anstoss

Gruß

Daniel

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


Lesenswert?

Detlev Neumann schrieb:
> Und die Lösung ist z.B.
>
>       asm ("STS LWRD((save_R16)),R16");
>       asm ("STS LWRD((save_R17)),R17");

Das geht aber natürlich nur für globale Variablen.

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.