Forum: Mikrocontroller und Digitale Elektronik sdcc: Ein kleiner Überblick zu sdcc 3.4.0


von Philipp Klaus Krause (Gast)


Lesenswert?

Hier im Forum treten immer wieder Fragen zu sdcc auf, oft von Leuten, 
die gerade anfangen, sdcc zu verwenden, oder die im Betracht ziehen, 
sdcc zu verwenden. Da ich mich etwas mit sdcc auskenne, aber wohl nicht 
dauerhaft im Forum aktiv sein werden, möchte ich etwas dazu schreiben, 
was den sdcc nutzenden C-Programmierer zu Zeit (sdcc 3.4.0) so erwartet.

Vieles davon hängt vom Port ab, aber zuerst das allgemeine:
sdcc ist ein C-Compiler, der versucht, sich weitgehend an die Standards 
(ISO C90, ISO C99, ISO C11) zu halten. Innerhalb der Spielräume, die der 
Standard läßt, wird gelegentlich anders als bei gcc vorgegangen. 
Üblicherweise dürfte man im C99-Modus (Kommandozeilenoption --std-c99) 
arbeiten wollen. sdcc ist auf 8-Bit-Architekturen ausgelegt, und kann 
oft halbwegs effizienten Code für diese erzeugen. Mittels 
--opt-code-size bzw. --opt-code-speed läßt sich das Optimierungsziel 
wählen. Leider fehlen noch ein paar Features aus den Standards, 
allerdings hauptsächlich solche, die auf 8-Bit Microcontrollern eher 
selten verwednet werden. Details siehe:
http://sdcc.sourceforge.net/mediawiki/index.php/Standard_compliance

sdcc ist ausgereifte Software, es gibt selten schwere Bugs. Nächtlich 
laufen regression tests auf verschiedenen Plattformen, d.h. es werden 
kleine C-Programme mit sdcc auf verschiedenen Architekturen und 
Betriebssystemen für verschiedene Zielarchitekturen kompiliert, und dann 
im Simulator ausgeführt, um zu testen, ob sie sich korrekt verhalten. 
Ein paar der tests wurden bei der Implementierung von Features in sdcc 
geschrieben. Aber die meisten stammen aus Bug reports: Wenn ein Bug in 
sdcc behoben wird, wird ein regression test geschrieben, um 
sicherzustellen, das dieser Bug nicht wieder auftreten kann. Außerdem 
ahben wir viele regression tests von gcc übernommen.

von Philipp Klaus Krause (Gast)


Lesenswert?

mcs51 und ds390 sind relativ alte Ports. Soweit ich weiß, sind sie recht 
stabil, aber es gibt hie und da ein paar fehlende Features, die in 
anderen Ports drin sind. An  manchen Ecken wurde zugunsten von 
Speicherplatzeffizienz gegen Standardkompatiblität entschieden (bool als 
bit impementiert).

von Philipp Klaus Krause (Gast)


Lesenswert?

Auch hc08 und s08 sind etablierte, stabile ports. Da der s08 port aus 
dem hc08 port entwickelt wurde, mag es hie und da noch ungenutzes 
Optimierungspotential geben. Wie auch beim mcs51 und ds390, sind 
Funktionen nicht reeentrant, falls nicht explizit anders angegeben (per 
Schlüsselwort oder Kommandozeilenoption). Der erzeugte Code ist recht 
gut, aber üblicheweise etwas größer als bei den nichtfreien Compilern. 
Diese Ports verwenden den neuen Registerallokator (dazu später mehr).

Philipp

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mach doch bitte aus Deinem Beitrag hier einen Beitrag im Wiki. Da ist so 
etwas besser aufgehoben.

von Philipp Klaus Krause (Gast)


Lesenswert?

Kommen wir zum z80-Port und den verwandten (z180, gbz80, r2k, r3ka, 
tlcs90). Der Z80-Port ist recht alt, hat aber im Laufe der Zeit 
bedeutende Verbesserungen erfahren. Die anderen Ports sind daraus 
entwickelt worden. Der tlcs90-Port hat keinen Simulator, und wird daher 
von den regression tests nicht erfasst. Recht effizienter Code wird 
generiert für z80, z180, r2k. Bei den anderen gibt es noch etwas mehr 
ungenutzes Potential.
Im Vergleich zu den nicht-freien Compilern erzeugt sdcc üblicherweise 
besseren Code als CROSS-C und HITECH-C, aber etwas schlechteren als IAR.

Manche dieser Prozessoren haben ein paar komplexe Instruktionen, wie 
z.B. ldir. Für einen Compiler ist es nicht einfach, zu erkennen, wann 
z.B. eine Schleife mit Hilfe ldir effizienter implementiert werden 
könnte. Die Befehle werden aber in den Bibliotheksfunktionen (z.B. 
memmove()) genutzt. Und für manche Bibliotheksfunktionen (memcpy(), 
strcpy(), strncpy(), strchr(), memset()) wird, wo möglich, auch kein 
Funktionsaufruf erzeugt, sondern direkt Code generiert.

Da der Z80 nur ein Prozessor, kein ganzes System ist, gibt es ein paar 
Dinge, die der Programmierer erledigen muß (z.B. 
Speicherinitialisierung), die ihm bei anderen Ports von sdcc abgenommen 
werden. Dazu dient die crt0.

Auch diese Ports verwenden den neuen Registerallokator.

Philipp

von Philipp Klaus Krause (Gast)


Lesenswert?

Die pic-ports hinken den anderen Ports weit hinterher. Etwas die Hälfte 
der offenen Bugreports in sdcc bezieht sich auf pics.

Es gibt den pic14-port für die pics mit 14-bit Instruktionen (z.B. 
16Fxxx, 12Fxxx) und den pic16 für die pics mit 16-bit Instruktionen 
(z.B. PIC18Fxxx).

Wobei der pic16-port sich deutlich besser schlägt als der pci14 port. 
Der pic16 port ist kurz davor, in die nächtlichen regression tests 
aufgenommen zu werden. Der pic14-port ist weit davon entfernt. In beide 
ports müßte noch viel Arbeit reingesteckt werden.

Philipp

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich wiederhole mich:

> Mach doch bitte aus Deinem Beitrag hier einen Beitrag im Wiki. Da ist so
> etwas besser aufgehoben.

von Philipp Klaus Krause (Gast)


Lesenswert?

Ich habe die bisherigen Beiträge jetzt 'mal nach

http://www.colecovision.eu/sdcc.shtml

kopiert, und werde sie dort im Laufe des Tages vervollständigen (z.B. 
stm8 port) und überarbeiten.

Falls es Fragen zu sdcc gibt, hoffe ich, diese beantworten zu können, 
und würe je nachdem, die Antworten auch dort einarbeiten.

Philipp

--

link repariert
-rufus

: Bearbeitet durch User
von Simon K. (simon) Benutzerseite


Lesenswert?

Danke für die Infos. Ich habe vor kurzem angefangen den cc1111 mit dem 
sdcc zu programmieren und habe mich gewundert dass Funktionen 
Standardmäßig nicht reentrant sind. Wenn man das aber per 
compilerschalter aktiviert, funktionieren die Standard libs nicht mehr 
richtig.
Ansonsten lief das ganze echt problemlos. Da ich von der avr und stm32 
Seite kam habe ich erst nicht so ganz durchgeblickt bei den 
verschiedenen Speichermodellen, aber das scheint generell eine 8051 
Sache zu sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Philipp Klaus Krause schrieb:
> Ich habe die bisherigen Beiträge jetzt 'mal nach
>
> http://www.colecovision.eu/sdcc.shtml

Das wäre nicht nötig gewesen -- hier gibt es ein für derartige 
Informationssammelungen vorzüglich geeignetes Wiki:

http://www.mikrocontroller.net/articles/Hauptseite

: Bearbeitet durch User
von Harald N. (haraldn)


Lesenswert?

Die Seite gibt es nicht mal....

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Harald Nagy schrieb:
> Die Seite gibt es nicht mal....

Was magst Du meinen?

Ich habe ja nicht auf http://www.mikrocontroller.net/articles/Sdcc 
verlinkt ...

: Bearbeitet durch User
von DirkB (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Was magst Du meinen?

Den fehlerhaften Link von Philipp.


Da ist das http:// doppelt

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ah. Den hab' ich jetzt repariert.

von Harald N. (haraldn)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Ah. Den hab' ich jetzt repariert.

Ja exakt das. Hatte ich am Smartphone nicht bemerkt. Danke.

von tobias (Gast)


Lesenswert?

Hi, ich schätze die Frage passt hier ganz gut rein. Ich versuche mit dem 
sdcc FUZIX zu kompilieren (https://github.com/EtchedPixels/FUZIX) doch 
mit der 3.4.0er Version funktioniert das nicht. Unter anderem wegen dem 
long long bug. In der Readme für den FUZIX-Kernel steht, ich solle den 
3.4.2 benutzen, aber ich finde den auf sf nicht. Nur den 3.4.0 oder den 
3.4.4 im trunk. Ich habe den im trunk zwar mal ausprobiert, aber wie zu 
erwarten hat der natürlich nicht wirklich funktioniert. Ist auch nicht 
weiter verwunderlich ;)
Aber offensichtlich gibt es noch 3 Versionen nach dem 3.4.0 von dem sdcc 
im Umlauf, die scheinbar stable sind? Wo kann man sich den Code dazu 
runterladen?

MfG
Tobias

von Jens (Gast)


Lesenswert?

tobias schrieb:
> Wo kann man sich den Code dazu runterladen?
Ich verstehe die Frage nicht.

Hier sind alle offiziellen Versionen verfügbar:
http://sourceforge.net/projects/sdcc/files/sdcc/

Und wenn Du schon den 'trunk' hast, kannst Du mit
1
svn checkout --revision $VERSIONSNUMMER
 die gewünschte Version ins Verzeichnis holen.

Jens

von tobias (Gast)


Lesenswert?

In dem Readme steht eine explizite Version von dem sdcc ab wann sich die 
Quellen kompilieren lassen, weil die vorherigen Versionen eben den long 
long Bug besitzen.
Diese Version (3.4.2) ist jedoch wohl keine offizielle Releaseversion 
(die letzte Releaseversion ist 3.4.0), daher finde ich sie dort auch 
nicht.

Eine bestimmte Revision auschecken ist auch eine Möglichkeit, jedoch 
müsste ich dazu wissen, welche Revision denn nun eine stabile Version 
ist ;)

MfG
Tobias

von Leo C. (rapid)


Lesenswert?

tobias schrieb:
> Eine bestimmte Revision auschecken ist auch eine Möglichkeit, jedoch
> müsste ich dazu wissen, welche Revision denn nun eine stabile Version
> ist ;)

Ab welcher SVN-Revision die Versionsnr. 3.4.2 vergeben wurde, ist mit
"svn log .version" leicht herauszufinden.



(Und dann "svn update --revision 9143")

: Bearbeitet durch User
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.