Forum: Mikrocontroller und Digitale Elektronik SDCC --mcs8051 unnötiger Code? vs Keil


von Antonin (Gast)


Lesenswert?

Hallo!

Bin Keil C51 Nutzer,würde aber gerne auch eine opensource Alternative 
haben, deshalb schiele ich immer Richtung SDCC .

Wenn ich beim Keil C51 folgenden Code compiliere:

void main (void){ }

dann erhalte ich eine Codesize von 16Byte;

Compiliere ich denselben Code mit SDCC 3.2.0a erhalte ich 387Byte! 
Codesize.

Auch der Keil includiert eine a51.startup, SDCC macht das auch.

Nur was macht jetzt der Keil besser oder anderst, bzw. was lässt Keil 
weg bzw. welchen unnötigen Code schreibt hier SDCC.
Hab auch probiert beim SDCC die startup funktion lt. Datenblatt 
einzubinden damit der Startup benutzerdefiniert und somit(bei mir) 
nichts hinzugefügt wird.
Doch das verringert den Code um lediglich 12Byte auf 375 Byte.

Hab vor ein paar Jahren als ich verschiedene Compiler getestet habe, 
dieses Verhalten beim SDCC nicht in Erinnerung.

Weiß ein SDCC Nuter Rat? Meine Fragestellung findet sich von einem 
anderen User so ähnlich im SDCC Forum, wurde aber nicht beantwortet.
Und ja, ich weß der Keil kostet  Geld, also bitte keine " you get what 
you pay for" Antworten.
Würde gern den Code-Überhang sinnvoll reduzieren nur wie?
Danke!

von Jim M. (turboj)


Lesenswert?

Im Map file sollten genaurere Informationen zu den 387 Bytes stehen.

von Antonin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Jim Meba!

Hab mal das produzierte .map File angehängt.

Antonin

von Bernd N (Gast)


Lesenswert?

>> Programme\SDCC\bin\..\lib\small-stack-auto/mcs51.lib

--stack-auto All functions in the source file will be compiled as 
reentrant, i.e. the parameters and local variables
will be allocated on the stack. See section 3.7 Parameters and Local 
Variables for more details. If
this option is used all source files in the project should be compiled 
with this option. It automatically
implies --int-long-reent and --float-reent

http://sdcc.sourceforge.net/doc/sdccman.pdf

Also lass mal das --stack-auto weg dann sollte es weniger Code sein.

von Antonin (Gast)


Lesenswert?

Hallo Bernd!

--stack-auto hab ich sowieso weg gelassen, das Manual hab ich auch 
gelesen.

Habs gefunden: mit dem Schalter --no-xinit-opt erhält man annähernd 
gleich großen startup Code. Mit der startup extern Funktion wie im 
Manual beschrieben konnte ich keine Änderung erzielen. Wobei aber bei 
0010 JZ ersichtlich wäre, dass bei einem (return 1;) der extern startup 
() der LJMP auf 003 erfolgen sollte. Warum der Compiler dann soviel 
unnützen Code reinschreibt welcher nie angesprungen wird??-->(unless 
--no-xinit-opt case)

      ORG 0000H
0000|   LJMP 0008H
0003|   LCALL 001EH
0006|   SJMP 0FEH
0008|   MOV 81H,#07H
000B|   LCALL 001FH
000E|   MOV A,82H
0010|   JZ 03H
0012|   LJMP 0003H
0015|   CLR A
0016|   MOV R0,#0FFH
0018|   MOV @R0,A
0019|   DJNZ R0,0FDH
001B|   LJMP 0003H
001E|   RET
001F|   MOV 82H,#00H
0022|   RET
        END

einstweilen Danke
Antonin

von Antonin (Gast)


Lesenswert?

--stack-auto, habs mal drinnen gehabt und somit das falsche map file 
gepostet, machte aber in meinem fall keinen Unterschied;

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.