Hallo,
ich bin am verzweifeln! Google und auch die Suche hier im Forum hat mir
nicht weiter geholfen.
Ich möchte Variablen in einem Register ablegen. Leider optimiert der
Compiler die Zugriffe auf die Variable komplett weg. Hier das auf das
Minimum reduzierte Testprogramm (Optimierungseinstellung -Os, wie bei
µC-Programme üblich):
1 | register unsigned char Data asm("r6");
|
2 |
|
3 | int main(void)
|
4 | { while(1)
|
5 | { Data++;
|
6 | }
|
7 | }
|
führt zu
1 | int main(void)
|
2 | { while(1)
|
3 | 30: ff cf rjmp .-2 ; 0x30 <main>
|
Deklariere ich "Data" als
1 | volatile unsigned char Data;
|
erhalte ich das erwartete Ergebnis:
1 | int main(void)
|
2 | { while(1)
|
3 | { Data++;
|
4 | 40: 80 91 60 00 lds r24, 0x0060
|
5 | 44: 8f 5f subi r24, 0xFF ; 255
|
6 | 46: 80 93 60 00 sts 0x0060, r24
|
7 | 4a: fa cf rjmp .-12 ; 0x40 <main>
|
Die Speicherzugriffe möchte ich mir aber gern ersparen. Wenn man bei der
Register-Deklaration ein "volatile" hinzufügt, ändert sich außer einer
zusätzlichen Warnung nichts.
Ich benutze das Atmel-Studio in der Version 6.1. Das komplette Projekt
habe ich als Datei angefügt.
Benutzen möchte ich solch einen Code in einem Projekt, bei dem eine in
Assembler geschriebene ISR einen Wert in einem Register ablegt.
Wie kann ich den Compiler dazu überreden, den Registerinhalt zu ändern?
Viele Grüße
Ulrich