Mit ein und demselben Sourcecode wird je nach Controller unterschiedlich langer Binärcode generiert. AVR-Studio 4.18, Build 716, Optimierung -0s Atmega 168p 1022 Bytes Atmega 644p 1006 Bytes Anders herum wäre es das erwartete Ergebnis, da der 644 mehr Interrupts hat. Aber so? Ohne Optimierung betragen die Codelängen (168:644) 4938 : 4940 Was zwar tendenziell besser passt, aber der 644 hat 5 Interrupts mehr als der 168, sodaß die Interruptvektortabelle 20 Bytes länger ist. Warum entsteht bei im Grunde gleichen Controllern unterschiedlicher Code? Hierbei handelt es sich um einen Bootloader bei dem der Uart gepollt wird und die Bootloaderfunktionen aus der <avr/boot.h> verwendet werden. Ist zwar nicht dramatisch, da der Code in den 168er gerade noch reinpasst, aber doch etwas verblüffend. mfg.
Thomas Eckmann schrieb: > Warum entsteht bei im Grunde gleichen Controllern unterschiedlicher > Code? Wo kannst du im Assemblerlisting Unterschiede erkennen?
Lothar Miller schrieb: > Wo kannst du im Assemblerlisting Unterschiede erkennen? Einige. Aber warum. Die Controller sind, bis auf daß der 644 ein paar mehr Register für die Peripherie hat, gleich. mfg.
Beim 644 ist eine Page 256 Bytes, das macht die Adreßberechnung einfacher. Peter
Peter Dannegger schrieb: > Beim 644 ist eine Page 256 Bytes, das macht die Adreßberechnung > einfacher. Ja klar. Danke, jetzt kann ich wieder ruhig schlafen. mfg.
eigentlich müsste nach den 1.code vergleich das 644 file größer sein. Weil er mehr flash hat, muss er mit mehr als 8bit rechnen. Atmel 644: fcea: 4e 5f subi r20, 0xFE ; 254 fcec: 5f 4f sbci r21, 0xFF ; 255 fcee: f1 e0 ldi r31, 0x01 ; 1 fcf0: 40 30 cpi r20, 0x00 ; 0 fcf2: 5f 07 cpc r21, r31 fcf4: 41 f7 brne .-48 ; 0xfcc6 Atmel 186: 3cd6: 4e 5f subi r20, 0xFE ; 254 3cd8: 5f 4f sbci r21, 0xFF ; 255 3cda: 40 38 cpi r20, 0x80 ; 128 3cdc: 51 05 cpc r21, r1 3cde: 49 f7 brne .-46 ; 0x3cb2 Bei der nächsten stelle, scheint der optimierer bei 16bit besser zurechtzukommen, da ist auf einmal das 644 file kleiner: 644: If(PGM_READ_BYTE((nPage * (UINT)SPM_PAGESIZE) + nInd) != nPageBuffer[nInd]) return 0x21; fd1c: 58 2f mov r21, r24 fd1e: 40 e0 ldi r20, 0x00 ; 0 fd20: 20 e0 ldi r18, 0x00 ; 0 fd22: 30 e0 ldi r19, 0x00 ; 0 fd24: f9 01 movw r30, r18 fd26: e4 0f add r30, r20 fd28: f5 1f adc r31, r21 fd2a: e4 91 lpm r30, Z+ fd2c: d9 01 movw r26, r18 fd2e: a4 5f subi r26, 0xF4 ; 244 fd30: be 4f sbci r27, 0xFE ; 254 fd32: 8c 91 ld r24, X fd34: e8 17 cp r30, r24 fd36: 11 f0 breq .+4 ; 0xfd3c <VerifyPage+0x20> fd38: 81 e2 ldi r24, 0x21 ; 33 fd3a: 08 95 ret 186: if(PGM_READ_BYTE((nPage * (UINT)SPM_PAGESIZE) + nInd) != nPageBuffer[nInd]) return 0x21; 3d06: ac 01 movw r20, r24 3d08: 56 95 lsr r21 3d0a: 54 2f mov r21, r20 3d0c: 44 27 eor r20, r20 3d0e: 57 95 ror r21 3d10: 47 95 ror r20 3d12: 20 e0 ldi r18, 0x00 ; 0 3d14: 30 e0 ldi r19, 0x00 ; 0 3d16: f9 01 movw r30, r18 3d18: e4 0f add r30, r20 3d1a: f5 1f adc r31, r21 3d1c: e4 91 lpm r30, Z+ 3d1e: d9 01 movw r26, r18 3d20: a4 5f subi r26, 0xF4 ; 244 3d22: be 4f sbci r27, 0xFE ; 254 3d24: 8c 91 ld r24, X 3d26: e8 17 cp r30, r24 3d28: 11 f0 breq .+4 ; 0x3d2e <VerifyPage+0x28> 3d2a: 81 e2 ldi r24, 0x21 ; 33 3d2c: 08 95 ret so wie es scheint, kommt den unterschiende weil die beiden µC unterschiedlich viel Flash haben.
Peter II schrieb: > so wie es scheint, kommt den unterschiende weil die beiden µC > unterschiedlich viel Flash haben. Dir auch danke für die Mühe. Es ist, wie Peter schrieb, die Adressberechnung für die Pagesize. Was natürlich mit der Flashgröße zu tun hat. Da sind sie eben doch nicht gleich. mfg.
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.