Forum: Compiler & IDEs AVR Portzugriffe Warum kein volatile notwendig?


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Wie macht der GCC die Portzugriffe, das diese nicht wegoptimiert werden?

1
 DDRB &= ~(1 << PB0);
So ist es ausreichend.

Von der C Sprache ist es ein Speicherzugriff, der nicht optimiert werden 
darf und dadurch ist volatile als Schlüsselwort notwendig. Ich habe 
gerade das Problem bei einem anderen Compiler und will es verstehen, wie 
der GCC es hinbekommt.
1
 *((volatile int*)0x2)=0x2;

:
von (prx) A. K. (prx)


Lesenswert?

Es macht es genau so wie du selbst hinschreibst.

von Ntldr -. (ntldr)


Lesenswert?

Der gcc hat im Makro DDRB ein volatile versteckt. Wenn man sich mal 
durch die Definitionen durchklickt erhält man (für einen Mega):
1
#define DDRB    _SFR_IO8(0x04)
2
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
3
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))

Und da taucht volatile dann wieder auf.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Ntldr -. schrieb:
> Der gcc hat im Makro DDRB ein volatile versteckt. Wenn man sich mal
> durch die Definitionen durchklickt erhält man (für einen Mega):
>
>
1
> #define DDRB    _SFR_IO8(0x04)
2
> #define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
3
> #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
4
>
>
> Und da taucht volatile dann wieder auf.

Das erste define hatte ich noch gesehen. Ich dachte alle Variablen mit 
beginnenden Unterstrich sind Positionen im Linkerscript und hatte nicht 
nach weiteren defines gesucht.
Was sind die __SFROFFSET beim ATMEL. Wann kommen die Offsets noch hinzu?

von (prx) A. K. (prx)


Lesenswert?

René D. schrieb:
> Was sind die __SFROFFSET beim ATMEL. Wann kommen die Offsets noch hinzu?

Das ist eine Besonderheit des Adressraums der AVR Prozessoren. 
Verschiedene Befehle adressieren ihn mal mit mal ohne Offset. Und um das 
Leben interessanter zu gestalten, dokumentiert Atmel die Adressen mal 
mit und mal ohne Offset.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

A. K. schrieb:
> René D. schrieb:
>> Was sind die __SFROFFSET beim ATMEL. Wann kommen die Offsets noch hinzu?
>
> Das ist eine Besonderheit des Adressraums der AVR Prozessoren.
> Verschiedene Befehle adressieren ihn mal mit mal ohne Offset. Und um das
> Leben interessanter zu gestalten, dokumentiert Atmel die Adressen mal
> mit und mal ohne Offset.

ICh habe schon im Datenblatt die Adressen und die Adressen in Klammern 
gesehen. das muss ich ausprobieren ob ich bei meinem Compiler noch den 
Offset brauche.

Beitrag #5727747 wurde von einem Moderator gelöscht.
Beitrag #5727828 wurde von einem Moderator gelöscht.
Beitrag #5727853 wurde von einem Moderator gelöscht.
Beitrag #5727857 wurde von einem Moderator gelöscht.
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.