Register konfigurieren --> C-Syntax nicht ganz klar



  • Hallo,

    habe hier ein C-Programm vor mir, dass ich in Assembler umsetzen will. Mir ist allerdings folgender Code-Schnipsel nicht ganz klar:

    UECFG1X = (UECFG1X & (1<<ALLOC)) | config1;
    

    Also der Ausdruck (Register & (1<<Bit) prüft ja eigentlich, ob ein bestimmtes Bit in einem Register gesetzt ist oder nicht. Ich kann das nur nicht in Einklang bringen mit dem Rest der Zeile - also mit

    | config1
    

    config1 ist übrigens nur ein 8bit Wert, der die restlichen Bits (nicht Bit ALLOC) des Registers UECFG1X konfigurieren soll.

    Konfiguriert diese Zeile mein Register nur dann, wenn ALLOC gesetzt ist? Oder setzt diese Zeile ALLOC und konfiguriert dann das Register? 😕

    Danke schonmal für eine erleuchtende Antwort



  • Würd_gern_C_können schrieb:

    Also der Ausdruck (Register & (1<<Bit) prüft ja eigentlich, ob ein bestimmtes Bit in einem Register gesetzt ist oder nicht.

    Nein, das ist eine bitweise Und-Verknüpfung. Man kann das Ergebnis für diesen Zweck nutzen, das ist richtig, da genau dann 0 rauskommt, wenn das Bit nicht gesetzt ist. Aber man kann das Ergebnis auch für beliebige Zwecke weiterbenutzen.



  • Würd_gern_C_können schrieb:

    UECFG1X = (UECFG1X & (1<<ALLOC)) | config1;
    

    Ich kann das nur nicht in Einklang bringen mit dem Rest der Zeile - also mit

    | config1
    

    alle bits von UECFG1X werden auf 0 gesetzt, bis auf das eine an der stelle (1<<ALLOC), das behält seinen zustand. danach werden alle bits von UECFG1X auf 1 gesetzt, die in 'config1' ebenfalls 1 sind.
    🙂



  • Supi, vielen Dank! Mir ist jetzt zwar nicht mehr ganz klar, warum die nächste Zeile des Programms dann "setze ALLOC" lautet (das hätte man ja in der zitierten Zeile erledigen können) - aber wahrscheinlich ist Atmel-Firmware auch nicht der Weisheit letzter Schluss :p

    Jedenfalls weiß ich jetzt endlich was diese Zeile macht 🙂



  • Würd_gern_C_können schrieb:

    Supi, vielen Dank! Mir ist jetzt zwar nicht mehr ganz klar, warum die nächste Zeile des Programms dann "setze ALLOC" lautet (das hätte man ja in der zitierten Zeile erledigen können) - aber wahrscheinlich ist Atmel-Firmware auch nicht der Weisheit letzter Schluss :p

    das ist manchmal so mit irgendwelchen steuerregistern, dass man dinge in der richtigen reihenfolge machen muss


Anmelden zum Antworten