Hallo, ich arbeite jetzt schon seit einiger Zeit mit AVR Mikrocontrollern (ATMega8 und Mega16). Jetzt hab ich mal ein paar grundlegende Fragen zur C Programmierung. Gibt es irgendwo eine genaue Erläuterung zu den Datentypen? Also was bedeute z.B. uint8t -- ein 8Bit Wert unsigned also ohne Vorzeichen Integer also ein Ganzzahl wert, aber wofür steht das letzte t? was bedeutet volatile und wann benutze ich es? Welche Werte kann ich noch definieren? MFG Herbert
und wann benutze ich eine globale Variable? ich hab mal ein Beispiel:
1 | uint8_t x; |
2 | |
3 | void unterroutine(void); |
4 | |
5 | int main (void) |
6 | {
|
7 | while(1) |
8 | {
|
9 | unterroutine(); |
10 | }
|
11 | }
|
12 | |
13 | void unterroutine(void) |
14 | {
|
15 | x = 1; |
16 | }
|
wann muss ich da jetzt volatile uint8_t x; machen
Volatile uint8_t x; void unterroutine(void); int main (void) { while(1) { unterroutine(); PORTB = x; } } void unterroutine(void) { x = 1; } Globale Variablen sind von jeder Funktion sichtbar und können von jeder Funktion verändert werden. Lokale Variablen sind nur innerhalb einer Funktion sichtbar. Steht auch in jedem C Buch. http://www.pronix.de/pronix-925.html
@M80: Ja, aber das Volatile muss da nicht hin. Globale Variablen müssen erst volatile deklariert werden, wenn man ISR (interrupt service routine) deklariert und diese auf die variable zugreifen.
ah super, danke jetzt wird mir das ganze auch schlüssig. Ein Bekannter von mir hat mir nämlich mal was geschrieben wo volatile Werte vorkamen. Vielen Dank
Um genau zu sein bedeutet volatile, das der Compiler so codiert, das die Varibale vor Benutzung aus dem Speicher geladen wird. Das ist wie geschrieben bei ISR, aber auch bei Multithreading nützlich.
Und um noch genauer zu sein, teilt das volatile dem Compiler mit, dass er auf dieser Variablen keine Optimierungen machen darf. volatile heist im Englischen 'flüchtig, vergänglich, unbeständig' Und genau so soll der Compiler den Inhalt einer Variablen auch behandeln: Den Wert der jetzt gerade in einer Variablen gespeichert ist, kann im nächsten Moment schon ein ganz anderer sein. Und zwar ohne dass der Compiler die Ursache dafür herausfinden könnte. Denk einfach mal an eine Hardwareuhr, die im Speicher wie eine Variable gemappt ist. Jedes mal, wenn diese Variable ausgelesen wird, kriegst du einen anderen Wert. Und zwar ohne daß man das im restlichen Programm irgendwie erkennen könnte. Daher darf der Compiler nicht hergehen und sich sagen: "Oh, diese Variable hab ich gerade vorher schon ausgelesen. Der Wert lungert da noch in einem Register herum. Wenn ich den Wert gleich vom Register wiederverwende anstatt ihn aus dem Speicher zu lesen, kann ich eine Menge Zeit einsparen."
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.