Zugriff auf einzelne Bytes z.B. bei UINT32

Gast #354711
Lesenswert?
• ▲
▼
Hi,

ich habe folgendes Problem:
Ich programmiere gerade einen MSP430 in C (IAR Compiler).
Nun habe ich eine UINT32 Variable. Die wird ja intern in zwei Registern
abgespeichert, weil der Mikrokontroller ja so nur 16bit Variablen
speichern kann. Wie könnte ich jetzt direkt auf z.B. die obere hälfte
der Variable zugreifen. Direkt bedeutet, ohne große Schiebeoperationen
oder Divisionen. Gibt es da einen Trick? Ich hoffe, ihr könnt mir
helfen!
Gast #354714
Lesenswert?
• ▲
▼
Hi, A.K.,

"Was stört dich an der einzig universell nutzbaren shift-and-mask
Methode?"
Eine Anweisung wie "TCCR1B = BV(WGM12) | BV(CS12);" ist wunderbar,
wenn einzelne Bits zu bearbeiten sind.

Aber wenn ein PLL-Baustein ein einziges Datenwort verlangt, das auch 3x
u12-Zahlen zusammengesetzt ist und 6 Flags, dann bilde ich das lieber in
einer Struktur ab und bette die in eine union ein, damit ich einerseits
leicht berechnen, schreiben, und auch leicht lesen kann.

Ciao
Wolfgang Horn
Gast #354716
Lesenswert?
• ▲
▼
und bei einem anderen packing oder gar anderen compiler funktioniert das
program nicht mehr!
es gibt übrigens für sicherheitsrelevante und automotive anwendung
gewisse regeln (siehe MISRA), die auch ihren grund haben. und eine
davon ist, dass man unions nicht verwenden soll.
aber solange du die software nur für dich schreibst ist mir das egal.
Gast #354717
Lesenswert?
• ▲
▼
Warum denn gleich so aggressiv???

Es gibt Momente, da sind die Fähigkeiten eines Programmes wichtiger als
seine Portabilität. Für eine Lösung mittels shiften hätte ich nicht
genug Zeit. So geht es deutlich schneller und es passt. Anstatt Unions
zu verwenden, könnte ich natürlich auch inline assembler verwenden. Ich
glaube aber kaum, dass das größere Sicherheit bietet und portabler ist.
#354719
Lesenswert?
• ▲
▼
@Norbert,

"Für eine Lösung mittels shiften hätte ich nicht genug Zeit. So geht
es deutlich schneller und es passt."


Ich kenne den MSP430 Compiler nicht, aber wenn dem wirklich so ist,
dann wäre er extrem grottenschlecht.

Alle Compiler, die ich kenne, werden hellhörig, wenn sie sowas wie
"<<8" oder "*256" sehen und optimieren das sehr gut. Da sind
schlechtestenfalls 1..2 Zyklen überflüssiger Code drin und das merkt
keine Sau.

Werf doch einfach mal nen Blick ins Assemblerlisting, ob der MSP430
Compiler wirklich so grottenschlecht optimiert.


Peter
Gast #354720
Lesenswert?
• ▲
▼
Hmm...ich habs gerade mal ausprobiert. Es sind doch weniger Befehle als
ich dachte beim shiften. Die Union Lösung ist aber immer noch deutlich
kürzer. Aber zumindest theoretisch müssten jetzt beide Lösungen
passen.

    ConvertLongToShort  Threshold;
    unsigned long              Schaltschwelle;

// benötigt 5 Zyklen
    Threshold.UINT32 -= Threshold.UINT16H + TAR;

// benötigt 14 Zyklen
    Schaltschwelle -= (Schaltschwelle >>16) + TAR;


Klar ist die Union Lösung ein wenig, nennen wir es mal hingetrickst.
Aber ich denke, solange man weiß, was man da tut, ist das doch okay,
oder? Wie würdet ihr das sehen?
Gast #354721
Lesenswert?
• ▲
▼
Vielleicht nochmal kurz zuim Hintergrund, warum ich hier so ein
"Aufstand" mache wegen ein paar Taktzyklen. Die Mittelwertberechnung
ist Teil einer AD-Wandlung. Zwischen den einzelnen Messungen habe ich
lediglich etwa 50 Taktzyklen Zeit.

Zurzeit bin ich zwar erst bei 22 Taktzyklen, es muss aber noch etwas
Platz bleiben, da später noch Zähler gesetzt werden müssen usw.

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.