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
Für welchen µC in welchem Compiler?
ATMega128 --> IAR aber ich bin auch mit einer Lösung für gcc (WinAVR) zufrieden ich benutze beiden Danke Detlev
"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.
Danke sollte helfen wenn ich noch fragen habe komme ich zurück und stelle Sie
Kennt jetzt jemand eine Seite indem ich asm inline für den IAR Kompiler abkupfer oder erlernen kann
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.