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!
Im Map file sollten genaurere Informationen zu den 387 Bytes stehen.
Hallo Jim Meba! Hab mal das produzierte .map File angehängt. Antonin
>> 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.
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
--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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.