Gast
#365993
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