Forum: Compiler & IDEs gcc erfindet befehle?


von Michael (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.