AVR-GCC Problem mit Bitmanipulation long int

Gast #5746022
Lesenswert?
• ▲
▼
Hallo,

entweder bin ich blind,oder der GCC übersetzt folgende Anweisung nicht 
korrekt, bzw. nicht in das, was ich will:

event_memory ist _uint32_t. Aus folgendem Ausdruck:
1
event_memory = event_memory & (~((1L<<1) || (1L<<2)  || (1L<<4) || (1L<<3) || (1L<<5)||(1L<<25)));

macht der Compiler das hier:
1
00000865  LDS R24,0x011D    Load direct from data space 
2
00000867  LDS R25,0x011E    Load direct from data space 
3
00000869  LDS R26,0x011F    Load direct from data space 
4
0000086B  LDS R27,0x0120    Load direct from data space 
5
0000086D  ANDI R24,0xFE    Logical AND with immediate 
6
0000086E  STS 0x011D,R24    Store direct to data space 
7
00000870  STS 0x011E,R25    Store direct to data space 
8
00000872  STS 0x011F,R26    Store direct to data space 
9
00000874  STS 0x0120,R27    Store direct to data space

Wenn ich mich nicht täusche, lädt er alle vier Byte, verundet aber nur 
das unterste.

Kann man den Compiler irgendwei dazu bringen, das richtig zu machen? 
Oder liegt das Problem wo ganz anders? (Den Ersten, der schreibt "Vor 
dem Bildschirm" fress ich zum Mittagessen...)

Gruß,
Klaus-Bärbel
Gast #5746113
Lesenswert?
• ▲
▼
mit

#define bitSet(a,b) (a |= (1<<b))
#define bitClear(a,b) (a &= ~(1 << b))
#define bitClr(a,b) (a &= ~(1 << b))
#define bitTest(a,b) (a & (1 << b))

und dann:

bitClear(event_memory,1); // alle anderen hier auch, der Compiler 
optimiert das schon

wär das nicht passiert

Bestimmt kommt jetzt ein shitstorm. Ich weiß, der Rest der Welt liebt 
diese Gedankenknoten, ich habe aber noch nicht verstanden warum man sich 
vom Compiler nicht helfen lassen sollte.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.