einige Fragen zu Grundlagen der C-Programmierung
Hi,
ich mach gerade das mir empfohlene Tut durch und kapier einiges nicht:
1. Was ist ein Register?
2. ein Code-Beispiel aus dem Tut:
Code:
#include <avr/io.h>
#include <stdint.h>
uint8_t foo;
int main (void) {
foo = PINB;
}
Warum werden die Packete io.h aud stdint.h hinter # eingebunden? Ich dachte # markiert Kommentare !?
Warum gibt main ein int zurück? Ich komme von Java, und da gibt main nix zurück, warum auch !? Andereseites steht in Klammern "void", was bei Java heißt, dass eine Methode nix zurückgibt. (das versteh einer :S)
Was soll dieses PINB ? Ist das ne Variable, die in dem Codeausschnitt nicht definiert wurde, oder eine feste Variable aus einem der Packete? Hä?
Hmm, ich glaubt das wäre es bis jetzt. Mehr fällt mir im Moment nicht ein.
Ich hoffe ihr könnt meinem verwirrten Gehirn helfen.
mfg
jagdfalke
Re: einige Fragen zu Grundlagen der C-Programmierung
Zitat:
Zitat von jagdfalke
Warum werden die Packete io.h aud stdint.h hinter # eingebunden? Ich dachte # markiert Kommentare !?
Kommentare in C werden mit /* begonnen und mit */ wieder beendet. Es gibt auch die Kurzform // um bis zum Zeilenende auszukommentieren, aber das ist kein ANSI-C. Geht aber mit avr-gcc (ohne Option -ansi natürlich ;-))
# gehört eigentlich nicht zu C. Das kennzeichnet Präprozessor-Dirktiven wie
#include
#define
#undef
#if
#ifdef
#else
#endif
#error
#warning
#pragma
Bevor der eigentliche Compiler zum Zuge kommt rauscht ein Präprozessor über die Quelle und macht Textersatz.
Wenn du zB hinschreibst PINB (ein in avr/ioxxxx.h definiertes Makro), macht der Präprozessor so was draus:
(*(volatile uint8_t *)((0x16) + 0x20))
Für nen Compiler ist das verständlich, für Menschen weniger. Es bedeutet so viel wie "Inhalt der Speicherstelle an Adresse 0x36". An dieser Adresse liegt das ober werklärte PINB-Register -- zumindest beim ATMega8. Über das Makro PINB kann man besser leserlich auf dieses Register zugreifen.
Zitat:
Zitat von jagdfalke
Warum gibt main ein int zurück? Ich komme von Java, und da gibt main nix zurück, warum auch !? Andereseites steht in Klammern "void", was bei Java heißt, dass eine Methode nix zurückgibt. (das versteh einer :S)
In Java bedeutet das nicht, daß eine Funktion nix zurückgibt, sondern daß sie keine Parameter hat. In C ist das genauso. main() hat keine Eingabeparameter -- woher auch.
main() gibt allerdinge einen int zurück. Das ist Konvention in C, um Werte an eine shell zurück zu liefern. In Java müsste man das mit System.exit(xxx) machen. Auf einem embedded System läuft keine shell, daher ist das return int unnötig. Wenn man aber hinschreibt
void main()
bekommt man eine lästige Compiler-Warnung. Diese vermeidet man mit der gcc-Option -ffreestanding, die sagt, daß das Programm alleine läuft, also nicht in einer Umgebung mit shell.
Zitat:
Zitat von jagdfalke
btw: kann der avr Rekursion? (ist ja sehr ram-intensiv)
Der AVR kann alles, was ein Compiler ihm in der Lage ist zu verklickern :-)
Für avr-gcc heisst das: Rekursion geht.
Speicherverbrauch ist ein kritisches Thema auf nem Hänfling wie AVR. Da muss man schon ein Auge drauf haben...