Hallo zusammen,
mal angenommen ich haette einen Microcontroller, dessen Assemblerbefehle
ich kenne. Allerdings ist der C-Compiler nicht frei verfuegbar und
ziemlich teuer.
Jetzt bin ich auf die Idee gekommen, ich koennte ja meinen eigenen
Compiler schreiben, um den Controller nicht nur in Assembler sondern
auch in C programmieren zu koennen.
Da man das Rad nicht unbedingt jedesmal neu erfinden muss waere doch
eine Moeglichkeit einen Freeware-Compiler wie beispielsweise den GCC als
Vorlage zu nehmen und 'nur' die Optimierungs- und Assemblierungsphase
durch meine eigene zu ersetzen, oder? Dann braeuchte ich mir
beispielsweise keine Gedanken ueber Parsing etc. von C zu machen,
sondern koennte direkt auf die Tokens, die der GCC verwendet
zurueckgreifen.
Funktioniert das grundsaetzlich, oder uebersehe ich dabei etwas?
Bitte keine Antworten a la "Wieso willst Du den Controller in C
programmieren, nimm doch Assembler". Ich will es einfach (zumindest wenn
es sich mit vertretbarem Aufwand realisieren laesst) :-)
Danke schonmal vorab fuer Antworten und viele Gruesse
Ampfing wrote:
> Funktioniert das grundsaetzlich, oder uebersehe ich dabei etwas?
Ja, das geht. Haben andere ja auch schon so gemacht. Wird etwas
leichter, wenn die Maschine registerorientiert ist, denn dafür ist GCC
gebaut, aber auch Akkumulatorarchitekturen wie 68x12 hat man schon in
GCC reingewürgt.
SDCC könnte als Basis evtl. einfacher sein.
Der GCC ist für so was "ideal" da er genau für so was vorbereitet ist
und Du nur das so genannte "Backend" schreiben müstest. Das "Frontend",
sprich Parsing, Code-baum und Teile der Optimierung sind für alle
Targets gleich. Das entsprechende Backend übersetzt dann eine Art
intermediär-Code in die Anweisungen des Ziel-µCs. Allerdings habe ich
keine Ahnung, wie komplex die Programierung eines eigenen Backends ist.
http://archiv.tu-chemnitz.de/pub/2004/0107/index.htmlhttp://en.wikipedia.org/wiki/GNU_Compiler_Collection
Hast du den entsprechenden Hintergrund? Vorlesungen in Theoretischer
Informatik und Compilerbau belegt und auch genug Kenntnisse ueber die
Architektur? Hast Du Dich in GCC soweit eingearbeitet? Ansonsten kannst
das mal getrost wieder vergessen ;)
Theoretische Informatik und Compilerbau braucht man nicht um GCC
anzupassen; aber es ist viel Arbeit, und die Binutils wollen ja auch
noch angepasst werden.
Um welchen Controller geht es denn?
Michael G. wrote:
> Hast du den entsprechenden Hintergrund? Vorlesungen in Theoretischer> Informatik und Compilerbau belegt
Nützlich, aber für Portierung von GCC oder SDCC auf eine andere
Zielarchitektur nicht unbedingt nötig.
> Nützlich, aber für Portierung von GCC oder SDCC auf eine andere> Zielarchitektur nicht unbedingt nötig.
Das sehe ich auch so. Vor allem wird man fast immer eine CPU finden die
der bisher vom GCC noch nicht unterstuetzten CPU sehr aehnlich ist, so
kann man dann da auch noch viel abschreiben oder wenigstens den groben
Aufbau uebernehmen.
Olaf
Die Frage klingt so ein bisschen wie: "Ich würde gerne Auto fahren, aber
Autos sind so teuer. Jetzt bin ich auf die Idee gekommen, mir einfach
schnell selbst eins zu entwerfen und zu bauen."
Auf GCC-Basis kannst du dir natürlich einen Riesenbatzen Arbeit sparen,
aber es bleibt dann doch noch einiges übrig. Insbesondere muß man viel
über die GCC-Interna wissen. Wenn du sehen willst, wieviel Arbeit es ist
und wieviel du wissen mußt, kannst du dir mal die GCC-Quellen
runterladen und die Implementierung eines Target (avr düfte ein recht
einfaches sein) anschauen und versuchen zu verstehen. Die Targets sind
im GCC-Sourcetree im Unterverzeichnis gcc/config zu finden. Ich will
nicht sagen, es sei nicht möglich (wie schon erwähnt wurde, haben andere
das auch schon gemacht), aber es ist eben doch ziemlich viel, was man
lernen muß, vor allem, wenn man sich vorher noch nie mit Compilerbau
beschäftigt hat.
> Bitte keine Antworten a la "Wieso willst Du den Controller in C> programmieren, nimm doch Assembler". Ich will es einfach (zumindest> wenn es sich mit vertretbarem Aufwand realisieren laesst)
Kommt darauf an, wieviel Aufwand für dich vertretbar ist. Die
Programmierung des Controllers in Assembler ist möglicherweise deutlich
schneller und einfacher.
Olaf wrote:
>> Nützlich, aber für Portierung von GCC oder SDCC auf eine andere>> Zielarchitektur nicht unbedingt nötig.>> Das sehe ich auch so. Vor allem wird man fast immer eine CPU finden die> der bisher vom GCC noch nicht unterstuetzten CPU sehr aehnlich ist, so> kann man dann da auch noch viel abschreiben oder wenigstens den groben> Aufbau uebernehmen.>> Olaf
Ohne tiefe Kenntnisse von der Materie macht sowas allerdings keinen
Sinn... und den internen Aufbau und die Arbeitsweise von GCC muss man
ebenfalls kennen. Ich hoffe soweit kann man mir folgen ;)
Hallo alle,
wow mit so viel Resonanz haette ich nicht gerechnet muss ich gestehen.
Der Reihe nach:
@ Micha
Vielen Dank fuer die Links, hab den Inhalt bis jetzt natuerlich nur
ueberflogen, hoert sich aber sehr interessant an!
@ all
Nachdem es leider keine Vorlesung Compilerbau bei uns gab hab ich sie
auch nicht besucht...
Es ging aber auch erstmal nur grundsaetzlich darum, ob ich in meiner
einfachen Denke einen groben Fehler drin habe oder ob ich schonmal auf
dem richtigen Weg bin.
Leider wurde mir gerade auch schon mitgeteilt, dass ich ab morgen wieder
an einem anderen Projekt arbeiten darf. Da sich das ja nicht innerhalb
eines Tages erledigen laesst mit dem Compiler (was mir durchaus klar und
bewusst ist, mein Zeithorizont ging eher so gegen halbes Jahr bis Jahr)
muss das erstmal warten. Aber ich weiss zumindest, dass ich auf einem
gangbaren Weg bin und werde mich nochmal melden, wenn ich naeheres zum
Zielsystem weiss und das neue Projekt angelaufen ist - der Erfahrung
nach tendieren die Projekte gerade am Anfang dazu sehr zeitintensiv zu
sein...
DANKE fuer jede Antwort, sie hat mir sehr geholfen und mir Mut gemacht.
Und wie gesagt, ich weiss auch, dass das sicher kein Spaziergang wird,
aber das ist ja auch nicht das Ziel.
Schoene Gruesse
Ein C-Compiler ist eine ziemlich komplexe Software, deswegen kann man
ohne sehr gute Grundkenntnisse so ein Projekt fast nicht schaffen. Eine
Alternative wären hier bestehende Compiler, die sich vergleichsweise
leicht an andere Architekturen anpassen lassen.
Zum einen wäre da der GCC, den schon einige genannt haben, aber der
erscheint mir für so einen Zweck fast schon zu komplex.
Für 8-Bitter wäre eventuell SDCC interessant:
http://sdcc.sourceforge.net/
Ebenfalls nicht schlecht ist LCC:
http://www.cs.princeton.edu/software/lcc/
LCC hat den Vorteil, daß es dazu ein Buch gibt, wodurch man einen
besseren Einblick in den Compiler bekommt, was bei GCC und SDCC
wahrscheinlich etwas schwieriger ist.
LCC hat außerdem den Vorteil, daß Scanner und Parser handcodiert (d.h.
nicht durch Lex und Yacc generiert) sind, wodurch dieser Teil des
Compilers sehr effizient ist und die Fehlermeldungen sehr gut sind.
Die Nachteile will ich auch nicht verschweigen:
- Die globale Codeoptimierung fehlt, d.h. der erzeugte Code ist nicht
ganz so gut.
- Es fehlt ein Präprozessor, aber die meisten Portierungen nehmen
einfach den vom GCC oder den von K&R.
- Es fehlen logischerweise noch Codebibliotheken, aber das ist
eigentlich bei den anderen Compilern das gleiche Problem.
Nur mal so interessehalber, Welcher Mikrocontroller soll es denn sein ?
Bei dem zu erwartenten Aufwand, wird es wahrschienlch das sinnvollste
sein , einen anderen Mikrocontroller auszuwählen, für den freie Software
verfügbar ist.