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.