hallo allerseits. bin gerade dabei, mich ein bißchen in die AVRs einzuarbeiten. dazu folgendes kleine programm: enum { IDLE = 0, ADC_N_RED, POWER_DOWN, STANDBY, SLEEP_MODE_VALID }; void go_2_sleep (u8 mode) { MCUCR |= ((1 << SE) | (mode << 3)); } int main( void ) { go_2_sleep(POWER_DOWN); return 1; } das programm (ich habe den code mal auf die relevanten zeilen reduziert) wird vom gcc (version 3.4.5) mit der optimierung "s" für den atmel ATtiny26 folgendermaßen übersetzt: 1 .file "test.c" 2 .arch attiny26 3 _SREG_ = 0x3f 4 _SP_H_ = 0x3e 5 _SP_L_ = 0x3d 6 _tmp_reg_ = 0 7 _zero_reg_ = 1 8 .global __do_copy_data 9 .global __do_clear_bss 17 .Ltext0: 18 .global go_2_sleep 20 go_2_sleep: 21 .LFB3: 22 .LM1: 23 /* prologue: frame size=0 */ 24 /* prologue end (size=0) */ 25 .LM2: 26 0000 9927 clr r25 27 0002 23E0 ldi r18,3 28 0004 880F 1: lsl r24 29 0006 991F rol r25 30 0008 2A95 dec r18 31 000a E1F7 brne 1b 32 000c 25B7 in r18,85-0x20 33 000e 282B or r18,r24 34 0010 2062 ori r18,lo8(32) 35 0012 25BF out 85-0x20,r18 36 /* epilogue: frame size=0 */ 37 0014 0895 ret 38 /* epilogue end (size=1) */ 39 /* function go_2_sleep size 11 (10) */ 40 .LFE3: 42 .global main 44 main: 45 .LFB2: 46 .LM3: 47 /* prologue: frame size=0 */ 48 0016 C0E0 ldi r28,lo8(__stack - 0) 49 0018 D0E0 ldi r29,hi8(__stack - 0) 50 001a DEBF out _SP_H_,r29 51 001c CDBF out _SP_L_,r28 52 /* prologue end (size=4) */ 53 .LM4: 54 001e 82E0 ldi r24,lo8(2) 55 0020 EFDF rcall go_2_sleep 56 .LM5: 57 0022 81E0 ldi r24,lo8(1) 58 0024 90E0 ldi r25,hi8(1) 59 /* epilogue: frame size=0 */ 60 0026 00C0 rjmp exit 61 /* epilogue end (size=1) */ 62 /* function main size 9 (4) */ 63 .LFE2: 65 .Letext0: DEFINED SYMBOLS *ABS*:00000000 LED_Blinker.c C:\.../ccgLaaaa.s:3 *ABS*:0000003f _SREG_ C:\.../ccgLaaaa.s:4 *ABS*:0000003e _SP_H_ C:\.../ccgLaaaa.s:5 *ABS*:0000003d _SP_L_ C:\.../ccgLaaaa.s:6 *ABS*:00000000 _tmp_reg_ C:\.../ccgLaaaa.s:7 *ABS*:00000001 _zero_reg_ C:\.../ccgLaaaa.s:20 .text:00000000 go_2_sleep C:\.../ccgLaaaa.s:44 .text:00000016 main UNDEFINED SYMBOLS __do_copy_data __do_clear_bss __stack exit mir geht's um den dreimaligen linksshift von "mode". hier wird r25 benutzt - wofür? "mode" wird in r24 übergeben und r25 wird sonst nirgends im code gelesen. wozu es also löschen und dreimal rotieren? warum reicht nicht dreimal lsl r24? gruß michael
GCC ist nicht optimal für 8bit-Prozessoren. Generell geht GCC von mindestens 16bit breiten Maschinen aus - und das sieht man dann gelegentlich auch. Besser wird es mit -mint8, also 8bit "int" Typ, allerdings schränkt das die Nutzbarkeit der libc erheblich ein.
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.