Hallo, Mir ist aufgefallen daß der Stack beim AVR-GCC 2x initialiert wird: Einmal hier in der runtime: 00000026 <__ctors_end>: 26: 11 24 eor r1, r1 28: 1f be out 0x3f, r1 ; 63 2a: cf e5 ldi r28, 0x5F ; 95 2c: d4 e0 ldi r29, 0x04 ; 4 2e: de bf out 0x3e, r29 ; 62 30: cd bf out 0x3d, r28 ; 61 .... und dann noch mal in der main: void main(void) { 5c: cf e5 ldi r28, 0x5F ; 95 5e: d4 e0 ldi r29, 0x04 ; 4 60: de bf out 0x3e, r29 ; 62 62: cd bf out 0x3d, r28 ; 61 .... Hat das einen bestimmten Grund oder ist das ein Bug? Wolf
Hysterische Gründe. Ursprünglich wurde es nur an einer Stelle gemacht (ich weiß gar nicht genau aus dem Hut, welches von beiden), die andere kam später. Eigentlich war die Intention, das komplett abzulösen. Da aber avr-gcc und avr-libc von unterschiedlichen Leuten gepflegt werden (die Releases also nicht gleichzeitig sind), braucht man für so eine Ablösung einen gewissen zeitlichen Übergang, und nun, vermutlich ist die Angelegenheit in Vergessenheit geraten.
Die richtige Stelle dürfte im Startup-Code sein, z.B. der Keil macht das so. Es ist zwar nicht die feine englische Art, aber man kann durchaus auch das main() wie jede andere Funktion rekursiv aufrufen. Und dann dürfte es mächtig in die Hose gehen, wenn dort der Stack neu gesetzt wird. Peter
Das dürfte dann wohl auch der Grund gewesen sein, es aus main() heraus zu verlagern, ja. Anfänglich war nur die C-Startup-Infrastruktur noch nicht so weit entwickelt, daß man das dort schon hineinpacken konnte.
Danke für die Aufklärung, allerdings kann ich mir keinen Grund vorstellen die main rekursiv aufzurufen... Wenn ich die 8 bytes mal brauche dann werde ich sie aus dem Source der AVR-LIBC entfernen ;-) Schöne Ostern Wolf
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.