AVR-GCC Problem mit Bitmanipulation long int

Gast #5746022
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
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.
Gast #5746191
STM Apprentice schrieb im Beitrag #5746094:
> Aba shiften von vorzeichenbehafteten Konstanten oder
> Variablen ist scheisse .....

Ah. _uint32_t ist also vorzeichenbehaftet... . Ok.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.