Forum: Compiler & IDEs Anfängerfrage bzgl. Toolchain und C


von Peter M. (petermueller)


Lesenswert?

Hallo,

ich bin ein absoluter Einsteiger im Bereich ATMEGA8 und bin noch ein 
bißchen überfordert, was die Abgrenzung einiger Begriffe angeht:

Habe ich es richtig verstanden? Die beiden verbreiteten Möglichkieten, 
ein Programm zu schreiben sind: AVR Studio und Win AVR? Und beide 
greifen auf den Compiler AVR GCC zurück? Heißt das also, dass ich Code, 
der in AVR Studio geschrieben wurde, in Win AVR kopieren kann und sofort 
(ohne Anpassungen) kompilieren kann?

Ich habe zunächst das Assembler Tutorial gelesen und dann aber auf das 
AVR-GCC Tutorial umgeschwenkt, da ich vermute, dass das im 'echten 
Leben' eine größere Relevanz hat...?! Oder werden große Projekte auch 
schon mal in ASM geschrieben?

Und dann noch meine größte Sorge: Gibt es DIE EINE Sprache C? Oder gibt 
es da Dialekte?

Ich habe irgendwie eine Problem beim Erlernen des Programmierens (mir 
fehlt da wohl ein Gen). Trotzdem fasziniert es mich und ich versuche mit 
Fleiß weiterzukommen. Daher habe ich Sorge, dass ich irgendwie am 
falschen Ende/ mit der falschen Sprache/ Toolchain anfange. Mir fehlt 
vermutlich der wirkliche Überblick.

So habe ich z.B. ein Paket zur LCD Ansteuerung gefunden, in dem sbi und 
cbi noch benutzt werden. Wie ich gelesen habe, ist das nicht mehr 
angesagt und so meckert der Compiler auch. Aber wie kann das sein, wenn 
es DIE EINE Sprache C gibt?

Oder ein anderes Beispiel, das mich daran zweifeln lässt, dass ich alles 
verstanden habe: Wenn ich den Kernighan/Ritchie aufschlage, lese ich von 
Variablen vom Typ int. Wenn ich mich in den AVR GCC Tutorials umgucke, 
tauchen dann Dinge wie

'unsigned int i;' oder

'typedef signed char        int8_t;'
'typedef unsigned char      uint8_t;'

'typedef short              int16_t;'
'typedef unsigned short     uint16_t;'

auf. Naja und wenn dann Pointer auftauchen, dann wird es sowieso 
unheimlich. Ich vermute, dass das Zeiger sind, wenn * im Code 
auftauchen...?

Ihr seht, ich stehe auf dem Schlauch und bin daher dankbar für jeden 
kleinen Stoß in die richtige Richtung :-)

Danke
Peter

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Peter Mueller wrote:

> Habe ich es richtig verstanden? Die beiden verbreiteten Möglichkieten,
> ein Programm zu schreiben sind: AVR Studio und Win AVR? Und beide
> greifen auf den Compiler AVR GCC zurück? Heißt das also, dass ich Code,
> der in AVR Studio geschrieben wurde, in Win AVR kopieren kann und sofort
> (ohne Anpassungen) kompilieren kann?

AVR Studio alleine => Assembler
WinAVR alleine => C (oder Assembler für Hardcore-Leute)
AVR Studio + WinAVR => C oder Assenbler

Codeaustausch zwischen AVR Studio+WinAVR und WinAVR alleine ist möglich. 
In WinAVR alleine brauchst du u.U. ein angepasstes Makefile. Die 
Erstellung des Makefile nimmt dir AVR Studio ab.

> Ich habe zunächst das Assembler Tutorial gelesen und dann aber auf das
> AVR-GCC Tutorial umgeschwenkt, da ich vermute, dass das im 'echten
> Leben' eine größere Relevanz hat...?! Oder werden große Projekte auch
> schon mal in ASM geschrieben?

Bei manchen µC geht es sogar nur in ASM. Das sind die keinen AVRs, die 
keinen SRAM haben. Man sagt, Kenntnisse in ASM erleichtern das 
Verständnis, was auf der untersten Hardwareebene abgeht.

> Und dann noch meine größte Sorge: Gibt es DIE EINE Sprache C? Oder gibt
> es da Dialekte?

Es gibt einen Standard und µC spezifische und Compilerbauer-spezifische 
Erweiterungen. Die erlernt man aber relativ rasch.

> Ich habe irgendwie eine Problem beim Erlernen des Programmierens (mir
> fehlt da wohl ein Gen). Trotzdem fasziniert es mich und ich versuche mit
> Fleiß weiterzukommen. Daher habe ich Sorge, dass ich irgendwie am
> falschen Ende/ mit der falschen Sprache/ Toolchain anfange. Mir fehlt
> vermutlich der wirkliche Überblick.

Die erste Programmiersprache ist die schwierigste. Wenn du das Konzept 
einmal begriffen hast, ist das Umlernen einfach. Man sagt gelegentlich, 
ein Programmierer sollte alle x Jahre eine neue Sprache lernen, um fit 
zu bleiben ;-)

> So habe ich z.B. ein Paket zur LCD Ansteuerung gefunden, in dem sbi und
> cbi noch benutzt werden. Wie ich gelesen habe, ist das nicht mehr
> angesagt und so meckert der Compiler auch. Aber wie kann das sein, wenn
> es DIE EINE Sprache C gibt?

s. oben. Das sind Erweiterungen. Die wechseln von µC-Familie zu 
µC-Familie und mit der Zeit sogar innerhalb einer µC-Familie, weil es 
besseres gibt.

> Oder ein anderes Beispiel, das mich daran zweifeln lässt, dass ich alles
> verstanden habe: Wenn ich den Kernighan/Ritchie aufschlage, lese ich von
> Variablen vom Typ int. Wenn ich mich in den AVR GCC Tutorials umgucke,
> tauchen dann Dinge wie
>
> 'unsigned int i;' oder
>
> 'typedef signed char        int8_t;'
> 'typedef unsigned char      uint8_t;'
>
> 'typedef short              int16_t;'
> 'typedef unsigned short     uint16_t;'
>
> auf. Naja und wenn dann Pointer auftauchen, dann wird es sowieso
> unheimlich. Ich vermute, dass das Zeiger sind, wenn * im Code
> auftauchen...?

Peanuts. Das lernst du einmal, was dahinter steckt und dann geht das in 
Fleisch und Blut über.

von Matthias N. (vbchaos)


Lesenswert?

Peter Mueller wrote:
> ich bin ein absoluter Einsteiger im Bereich ATMEGA8 und bin noch ein
> bißchen überfordert, was die Abgrenzung einiger Begriffe angeht:

Willkommen in unserer kleinen, verrückten Welt :)

> Habe ich es richtig verstanden? Die beiden verbreiteten Möglichkieten,
> ein Programm zu schreiben sind: AVR Studio und Win AVR? Und beide
> greifen auf den Compiler AVR GCC zurück? Heißt das also, dass ich Code,
> der in AVR Studio geschrieben wurde, in Win AVR kopieren kann und sofort
> (ohne Anpassungen) kompilieren kann?

Theoretisch: Ja! Praktisch kann es da einige Ecken geben, die 
Programmspezifisch sind, und an denen sich der eine Texteditor stört, 
der andere aber nicht. Generell kannst du zum Schreiben des Codes 
natuerlich auch Wordpad verwenden, aber das wuerde jetzt den Rahmen 
sprengen.

> Ich habe zunächst das Assembler Tutorial gelesen und dann aber auf das
> AVR-GCC Tutorial umgeschwenkt, da ich vermute, dass das im 'echten
> Leben' eine größere Relevanz hat...?! Oder werden große Projekte auch
> schon mal in ASM geschrieben?

Vermutlich nicht, wird zu unübersichtlich. Assembler nutzt man gerne im 
C eingebettet, um spezielle Registervorgänge zu machen (PUSH&POP zB)

> Und dann noch meine größte Sorge: Gibt es DIE EINE Sprache C? Oder gibt
> es da Dialekte?

Hehe, nein. Es gibt C, kein bayrisch-C, oder plattdeutsch-C oder 
sächsisch-C... keine Angst... Oder anders gesagt: mir sind keine 
Abnormitäten von C bekannt (von C# mal abgesehen), lasse mich aber gerne 
eines Besseren belehren :)

> Ich habe irgendwie eine Problem beim Erlernen des Programmierens (mir
> fehlt da wohl ein Gen). Trotzdem fasziniert es mich und ich versuche mit
> Fleiß weiterzukommen. Daher habe ich Sorge, dass ich irgendwie am
> falschen Ende/ mit der falschen Sprache/ Toolchain anfange. Mir fehlt
> vermutlich der wirkliche Überblick.

Nein, das ist am Anfang normal. Sich damit auseinanderzusetzen, wie die 
Toolchains funktionieren, ist sehr sinnvoll, wenn auch zu Beginn 
vielleicht wirklich viel Input. Controllerprogrammierung erfolgt sehr 
viel in C, also hast du dir schonmal nicht die falsche Sprache 
ausgesucht, und AVR Studio und WinAVR sind sehr beliebte 
Entwicklungsumgebungen, fuer die du auch sehr viel support in den Weiten 
des Internet finden kannst/wirst.


> Oder ein anderes Beispiel, das mich daran zweifeln lässt, dass ich alles
> verstanden habe: Wenn ich den Kernighan/Ritchie aufschlage, lese ich von
> Variablen vom Typ int. Wenn ich mich in den AVR GCC Tutorials umgucke,
> tauchen dann Dinge wie
>
> 'unsigned int i;' oder
>
> 'typedef signed char        int8_t;'
> 'typedef unsigned char      uint8_t;'
>
> 'typedef short              int16_t;'
> 'typedef unsigned short     uint16_t;'

Das liegt daran, dass C auf sehr vielen Plattformen einsetzbar ist. Der 
Datentyp "int" ist zB nicht immer 32 Bit, auf 64Bit Processoren ist er 
nämlich 64 Bit lang. Um aber einen genauen überblick zu behalten, hat 
man sich das so ausgedacht. int8_t ist dann immer 8 bit lang, egal auf 
welche Maschine. Je nach Prozessor variieren diese "typedef", also 
Typdendefinitionen. und das u vorweg beschreibt das "unsigned". Das 
wiederrum sagt dir, ob die Variable vorzeichenbehaftet ist oder nicht. 
Bei vorzeichenbehafteten Datentypen (signed) ist das MSB (most 
significant Bit), also das höchstwertige bit das Vorzeichen, wobei 0= 
Plus und 1=minus. 1111|1111 ist dann entweder 255 (unsigned) oder -127 
(signed), wenn ichs jetzt richtig zusammenbekomme ausm Kopf. Die genaue 
Laenge einer Variable ist auf uControllern teils sehr wichtig, zB auf 
kleinen ATTinys mit sehr wenig RAM wärs blöde, aus Gewohnheit immer 
32Bit Variablen anzulegen, obwohl 8Bit ausreichen würden. Bei 
Bitmanipulation generell ist die genaue Länge unabdingbar.

> auf. Naja und wenn dann Pointer auftauchen, dann wird es sowieso
> unheimlich. Ich vermute, dass das Zeiger sind, wenn * im Code
> auftauchen...?

Ja. Dazu musst du das stack prinzip verstehen. Jede Variable ist an 
einer bestimmten Addresse anzufinden, und ein Pointer zeigt auf diese 
Addresse. Wenn man einen Pointer auf eine Addresse setzt, kann man den 
Inhalt dieser Addresse auslesen oder auch manipulieren. Pointer sind 
aber ein großes Thema fuer sich, dass du in einschlägiger Fachliteratur 
nachlesen solltest, möglichst in der C-Bibel "The C programming 
language", dass von den C-"Erfindern" verfasst ist.

> Ihr seht, ich stehe auf dem Schlauch und bin daher dankbar für jeden
> kleinen Stoß in die richtige Richtung :-)
>
> Danke
> Peter

Ich hoffe, ich konnte etwas helfen

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter Mueller schrob:
> Hallo,
>
> ich bin ein absoluter Einsteiger im Bereich ATMEGA8 und bin noch ein
> bißchen überfordert, was die Abgrenzung einiger Begriffe angeht:
>
> Habe ich es richtig verstanden? Die beiden verbreiteten Möglichkieten,
> ein Programm zu schreiben sind: AVR Studio und Win AVR? Und beide
> greifen auf den Compiler AVR GCC zurück? Heißt das also, dass ich Code,
> der in AVR Studio geschrieben wurde, in Win AVR kopieren kann und sofort
> (ohne Anpassungen) kompilieren kann?

AStudio kannst du betrachten als einen besserer Editor ;-) Du kannst 
dort die Programme schreiben und von dort aus übersetzen, es zeigt dir 
Fehlermeldungen an, verwaltet Projekte, ermöglicht Registeranzeigen beim 
Debuggen, vereinfacht den Build-Prozess, ...

Aber ein C-Programm kannst du auch mit einem Allerweltseditor wie 
TextPad schreiben.

ASTudio greift auf die Toolchain zurück: Compiler (avr-gcc), Assembler 
(avr-as) Linker (avr-ld), Tool zum Disassemblieren (avr-objdump) und 
anzeigen von Infos (avr-nm, avr-size) und um Formate ineinander 
umzuwandeln (avr-objcopy), ...

All dieses Zeug kannst du aber auch von Hand aufrufen. Für den Anfang 
ist das vielleicht sogar besser um zu verstehen, wie ein normaler 
Compilelauf funktioniert.

gib einfach auf der Kommandozeile ein

avr-gcc

und er meckert "no input files", weil er gerne ne Quelldatei hätte zum 
verdauen.

> Ich habe zunächst das Assembler Tutorial gelesen und dann aber auf das
> AVR-GCC Tutorial umgeschwenkt, da ich vermute, dass das im 'echten
> Leben' eine größere Relevanz hat...?! Oder werden große Projekte auch
> schon mal in ASM geschrieben?

Heute nicht mehr, zumindest nicht im professionellen Bereich. Da wird 
C/C++ eingesetzt, Ada, Java, ... letztere aber kaum auf AVR.

> Und dann noch meine größte Sorge: Gibt es DIE EINE Sprache C? Oder gibt
> es da Dialekte?

Ja. Aber es gibt Standarts, zB ISO-C89, C99, GNU-C99, ...

> Ich habe irgendwie eine Problem beim Erlernen des Programmierens (mir
> fehlt da wohl ein Gen). Trotzdem fasziniert es mich und ich versuche mit
> Fleiß weiterzukommen. Daher habe ich Sorge, dass ich irgendwie am
> falschen Ende/ mit der falschen Sprache/ Toolchain anfange. Mir fehlt
> vermutlich der wirkliche Überblick.

Das kommt. gcc gibt's auch für deinen PC, da funktioniert alles 
prinzipiell genauso, nur daß es etwas bequemer ist: Man kann Ausgaben 
machen, braucht kein Programm zu brenne, kann einfacher Debuggen, 
braucht sich keine Sorgen um Speicherplatz zu machen, ... Am simpelsten 
bekommst du nen gcc mit nre IDE wie Code::Blocks. (Musst ihn aber, wie 
bei AStudio, nicht gezwungenermassen von der IDE aus benutzen).

> So habe ich z.B. ein Paket zur LCD Ansteuerung gefunden, in dem sbi und
> cbi noch benutzt werden. Wie ich gelesen habe, ist das nicht mehr
> angesagt und so meckert der Compiler auch. Aber wie kann das sein, wenn
> es DIE EINE Sprache C gibt?

sbi und cbi gehörten noch nie zum Sprachumfang von C.


> Oder ein anderes Beispiel, das mich daran zweifeln lässt, dass ich alles
> verstanden habe: Wenn ich den Kernighan/Ritchie aufschlage, lese ich von
> Variablen vom Typ int. Wenn ich mich in den AVR GCC Tutorials umgucke,
> tauchen dann Dinge wie

> 'unsigned int i;' oder
>
> 'typedef signed char        int8_t;'
> 'typedef unsigned char      uint8_t;'
>
> 'typedef short              int16_t;'
> 'typedef unsigned short     uint16_t;'

Programmierer sind tippfaul. Am faulsten sind Linuxprogrammierer. Die 
definieren sich ein u8 damit sie nicht das endlos lange uint8_t 
eintippen müssen. Wenn C Bezeichner der Länge Null zulassen würde, 
würden sie den auch verwenden...

> auf. Naja und wenn dann Pointer auftauchen, dann wird es sowieso
> unheimlich. Ich vermute, dass das Zeiger sind, wenn * im Code
> auftauchen...?
Kann auch ein Produkt sein: c = a * b

Aber eins nach dem anderen...Und nicht das Buch von hinten anfangen zu 
lesen. Sonst ist die ganze Spannung weg, ob's der Gärtner war oder nicht 
;-)

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.