RedBaron
25.10.2013, 14:23
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):
register unsigned char Data asm("r6");
int main(void)
{ while(1)
{ Data++;
}
}
führt zu Assembler-Code:
int main(void)
{ while(1)
30: ff cf rjmp .-2 ; 0x30 <main>
Deklariere ich "Data" als
volatile unsigned char Data;
erhalte ich das erwartete Ergebnis (Assembler):
int main(void)
{ while(1)
{ Data++;
40: 80 91 60 00 lds r24, 0x0060
44: 8f 5f subi r24, 0xFF ; 255
46: 80 93 60 00 sts 0x0060, r24
44: fa cf rjmp .-12 ; 0x40 <main>
Wenn man bei der Register-Deklaration ein "volatile" hinzufügt, ändert sich außer einer zusätzlichen Compiler-Warnung nichts.
Benutzen möchte ich solch einen Code in einem Projekt, bei dem eine in Assembler geschriebene ISR einen Wert in einem Register ablegt. Die Speicherzugriffe möchte ich mir deshalb -besonders in der ISR- ersparen.
Ich benutze das Atmel-Studio in der Version 6.1. Das komplette Projekt habe ich als Datei angefügt.
Wie kann ich den Compiler dazu überreden, den Registerinhalt zu ändern?
Viele Grüße RedBaron
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):
register unsigned char Data asm("r6");
int main(void)
{ while(1)
{ Data++;
}
}
führt zu Assembler-Code:
int main(void)
{ while(1)
30: ff cf rjmp .-2 ; 0x30 <main>
Deklariere ich "Data" als
volatile unsigned char Data;
erhalte ich das erwartete Ergebnis (Assembler):
int main(void)
{ while(1)
{ Data++;
40: 80 91 60 00 lds r24, 0x0060
44: 8f 5f subi r24, 0xFF ; 255
46: 80 93 60 00 sts 0x0060, r24
44: fa cf rjmp .-12 ; 0x40 <main>
Wenn man bei der Register-Deklaration ein "volatile" hinzufügt, ändert sich außer einer zusätzlichen Compiler-Warnung nichts.
Benutzen möchte ich solch einen Code in einem Projekt, bei dem eine in Assembler geschriebene ISR einen Wert in einem Register ablegt. Die Speicherzugriffe möchte ich mir deshalb -besonders in der ISR- ersparen.
Ich benutze das Atmel-Studio in der Version 6.1. Das komplette Projekt habe ich als Datei angefügt.
Wie kann ich den Compiler dazu überreden, den Registerinhalt zu ändern?
Viele Grüße RedBaron