PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : volatile static const char *sram_data; ist das richtig?



Marten83
21.09.2009, 10:39
Hallo Zusammen,

ich schreibe gerade eine Routine um ein serielles SRAM per Interrupt im Page-Mode zu beschreiben.
Dabei will ich in einer routine "sram_write_array(volatile static const char *sram_data) aufrufen in der der eben deklarierte Pointer mit einer Anfangsadresse eines structs geladen wird.
Das Interrupt flag wird aktiviert und die ISR bedient sich dann dieses Pointers.
Geht das so?
Und warum ist es eigentlich sinnvoll den Modifier "const" zu benutzen?
(habe das von der UART-Routine)

Vielen Dank!

MfG,
Marten83

p_mork
21.09.2009, 13:20
Hallo Marten83,

'const' signalisiert dem Compiler, dass die Funktion keine Veränderungen an den Chars machen wird auf die 'sram_data' zeigt, sodass er in bestimmten Fällen effizienteren Code produzieren kann. 'static' ist komplett sinnlos, weil 'static' ein Qualifier ist und nichts damit zu tun hat, wie man auf die Variable zugreift, auf die 'sram_data' zeigt.

Warum da zusätzlich 'volatile' benutzt wird ist mir unverständlich, weil es ja bedeuten würde, dass sich die Daten hinter 'sram_data' jederzeit ändern könnten, was aber wohl nicht der Fall ist, wenn die Funktion in einer ISR aufgerufen wird.

MfG Mark

Marten83
22.09.2009, 06:54
Hi p_mork,

danke für die Antwort.
Das mit 'const' ist gut zu wissen, allerdings denke ich, dass zumindest 'volatile' doch einen Sinn hat gerade weil 'sram_data' in einer ISR benutzt wird und sonst einfach wegoptimiert werden würde, nicht?
Eigentlich war ich mir bisher nur über das 'static' nicht ganz sicher. Aber ich denke es wird benötigt, weil ja sonst beim Verlassen der Funktion die Variable (Pointer) wieder aus dem RAM verschwindet, oder?

MfG, Marten83

askazo
22.09.2009, 09:31
Wenn Du const benutzt, sind sowohl volatile als auch static völlig überflüssig.

volatile benötigst Du nur dann, wenn eine Variable in einer ISR verändert wird, nicht wenn sie nur ausgelesen wird.

static brauchst Du hier auch nicht, da Konstanten entweder in einen reservierten Speicherbereich des RAMs oder ins Flash geschrieben werden und dort auch fest stehen bleiben.


Wenn ich das richtig verstehe, willst Du den Pointer erst zur Laufzeit des Programms initialisieren. Dann kannst Du natürlich nicht mit const arbeiten. const kannst Du nur dann verwenden, wenn der Compiler schon weiß, auf welche Adresse der Zeiger zeigen soll. In Deinem Fall würde ich den Zeiger dann mit
static char *sram_data
deklarieren.


Gruß,
askazo