Ich fange gerade an mein ATMega32 mit AVRStudio in Verbindung mit WinAVR zu programmieren. Als Optimierung ist -Os eingestellt. Wenn ich nun meinen Quellcode compiliere sagt gcc, dass der Code 906 Bytes groß ist. Wenn ich jetzt in die Disassembly Ansicht gehe, geht mein Code aber nur bis 0x1C4 das würde also nur 382 Bytes entsprechen (code fängt ja erst ab 0x47 an). Wenn ich das HexFile aber jetzt in Ponyprog lade geht der Code aber bis 0x389 was also tatsächlich der Aussage von GCC entspricht. Wieso kann ich das aber nicht im Disasseber sehen? Im listfile ist das auch alles richtig. Oder ist AVRStudio dafür einfach nicht ausgelegt?
> Wenn ich jetzt in die Disassembly Ansicht gehe, geht mein Code aber > nur bis 0x1C4 das würde also nur 382 Bytes entsprechen Das ist eine 16-Bit-Adresse: Musst Du *2 nehmen. > (code fängt ja erst ab 0x47 an). Mhhh ... und davor? IR-Vektoren brauchst Du nicht, deshalb darf man den Speicher nicht zählen? Gruß, Stefan
?? Ui, das irretiert aber. Ich hatte mich so an Hexeditor gewöhnt. Naja, dann hätte sich das ja geklärt. Zu der Größe, Mein Code fängt nach diesem Kram an: +00000000: 940C002A JMP 0x0000002A Jump +00000002: 940C0045 JMP 0x00000045 Jump +00000004: 940C0045 JMP 0x00000045 Jump +00000006: 940C0045 JMP 0x00000045 Jump +00000008: 940C0045 JMP 0x00000045 Jump +0000000A: 940C0045 JMP 0x00000045 Jump +0000000C: 940C0045 JMP 0x00000045 Jump +0000000E: 940C0045 JMP 0x00000045 Jump +00000010: 940C0045 JMP 0x00000045 Jump +00000012: 940C0161 JMP 0x00000161 Jump +00000014: 940C0045 JMP 0x00000045 Jump +00000016: 940C0045 JMP 0x00000045 Jump +00000018: 940C0045 JMP 0x00000045 Jump +0000001A: 940C013C JMP 0x0000013C Jump +0000001C: 940C0045 JMP 0x00000045 Jump +0000001E: 940C0045 JMP 0x00000045 Jump +00000020: 940C0045 JMP 0x00000045 Jump +00000022: 940C0045 JMP 0x00000045 Jump +00000024: 940C0045 JMP 0x00000045 Jump +00000026: 940C0045 JMP 0x00000045 Jump +00000028: 940C0045 JMP 0x00000045 Jump +0000002A: 2411 CLR R1 Clear Register +0000002B: BE1F OUT 0x3F,R1 Out to I/O location +0000002C: E5CF LDI R28,0x5F Load immediate +0000002D: E0D8 LDI R29,0x08 Load immediate +0000002E: BFDE OUT 0x3E,R29 Out to I/O location +0000002F: BFCD OUT 0x3D,R28 Out to I/O location +00000030: E010 LDI R17,0x00 Load immediate +00000031: E6A0 LDI R26,0x60 Load immediate +00000032: E0B0 LDI R27,0x00 Load immediate +00000033: E7E0 LDI R30,0x70 Load immediate +00000034: E0F3 LDI R31,0x03 Load immediate +00000035: C002 RJMP PC+0x0003 Relative jump +00000036: 9005 LPM R0,Z+ Load program memory and postincrement +00000037: 920D ST X+,R0 Store indirect and postincrement +00000038: 36A0 CPI R26,0x60 Compare with immediate +00000039: 07B1 CPC R27,R17 Compare with carry +0000003A: F7D9 BRNE PC-0x04 Branch if not equal +0000003B: E010 LDI R17,0x00 Load immediate +0000003C: E6A0 LDI R26,0x60 Load immediate +0000003D: E0B0 LDI R27,0x00 Load immediate +0000003E: C001 RJMP PC+0x0002 Relative jump +0000003F: 921D ST X+,R1 Store indirect and postincrement +00000040: 36A4 CPI R26,0x64 Compare with immediate +00000041: 07B1 CPC R27,R17 Compare with carry +00000042: F7E1 BRNE PC-0x03 Branch if not equal +00000043: 940C0100 JMP 0x00000100 Jump +00000045: 940C0000 JMP 0x00000000 Jump
Dieser Kram sind die IR-Vektoren und die Variablen-Initialisierung, die der Compiler vor dem Start von main() macht. Ähnlich überflüssig wie die Reifen am Auto, die Du aber trotzdem immer teuer mit dazukaufen musst ;-) Gruß, Stefan
Machen die kostenpflichtigen Compiler das auch (ICC oder IAR)?? Naja es sind ja nur 68 Bytes, aber irgentwie schon nervig. Trotzdem macht der GCC teilweise echt guten Code, aber bei Interrups haben 32 Register echt Nachteile. Da müssen ja zig push's gemacht werden und nachher wieder pop's. Naja muss man mit leben.
> Machen die kostenpflichtigen Compiler das auch (ICC oder IAR)?? Naja > es sind ja nur 68 Bytes, aber irgentwie schon nervig. Natürlich machen das auch andere Compiler. Was meinst Du, wo Deine ganzen Variablen ihre Initialisierung herbekommen - und wenn es nur eine Null ist? > Trotzdem macht der GCC teilweise echt guten Code, aber bei Interrups > haben 32 Register echt Nachteile. Da müssen ja zig push's gemacht > werden und nachher wieder pop's. Naja muss man mit leben. Ein IR sichert nicht alle Register auf den Stack, sondern nur die, die er benötigt. Wenn Du allerdings Funktionen im IR aufrufst, dann zwingst Du den Compiler, alle Register zu retten, die eine Funktion lokal benutzen darf. Auch bei Risen-IR-Funktionen habe ich es übrigens nie geschafft, dass gcc mehr als 18 Register pusht. Gruß, Stefan
Naja, ich mecker weiter rum wenn meine 32 kB voll sind. Danke für deine Antworten
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.