www.mikrocontroller.net

Forum: Compiler & IDEs gcc erfindet befehle?


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.