Forum: Mikrocontroller und Digitale Elektronik Hilfe bei diese C Struktur


von Martin (Gast)


Lesenswert?

Ich möchte einen Schrittmotor mit Hilfe eines Tinamic TMC223 ansteuern. 
Hierzu habe ich einen Beispielcode beim Hersteller gefunden. Jedoch sagt 
mir die Wertzuweisung bei der Struktur nichts.

Warum steht hier ein ":" anstelle eines "="?
1
//Data structure definition for the TMC222 status information.
2
//Use variables of this data type togehter with the GetFullStatus1() function.
3
typedef struct
4
{
5
  unsigned char IHold: 4;
6
  unsigned char IRun: 4;
7
  unsigned char VMin: 4;
8
  unsigned char VMax: 4;
9
  unsigned char Acc: 4;
10
  unsigned char Shaft: 1;
11
  unsigned char StepMode: 2;
12
  unsigned char AccShape: 1;
13
  unsigned char TInfo: 2;
14
  unsigned char TW: 1;
15
  unsigned char TSD: 1;
16
  unsigned char UV2: 1;
17
  unsigned char ElDef: 1;
18
  unsigned char SteppLoss: 1;
19
  unsigned char VddReset: 1;
20
  unsigned char CPFail: 1;
21
  unsigned char NA: 1;
22
  unsigned char OVC2: 1;
23
  unsigned char OVC1: 1;
24
  unsigned char ESW: 1;
25
  unsigned char Motion: 3;
26
} TTMC222Status;

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:
>
> Ich möchte einen Schrittmotor mit Hilfe eines Tinamic TMC223 ansteuern.
> Hierzu habe ich einen Beispielcode beim Hersteller gefunden. Jedoch sagt
> mir die Wertzuweisung bei der Struktur nichts.
>
> Warum steht hier ein ":" anstelle eines "="?

Weil

* an dieser Stelle in der Strukturdefinition ein = (also die Ankündigung 
einer Initialisierung) gar nicht zulässig wäre
* es sich bei den Membern um eine Bitfeld handelt


Sagt denn dein C-Buch gar nichts zu dem Thema? Wenn nicht, dann wirf es 
weg und kauf dir ein anderes - dein Buch taugt nichts. Gute Literatur, 
die auch durchgearbeitet werden will, ist das um und auf um eine 
Programmiersprache in ausreichender Tiefe zu erlernen.

von PittyJ (Gast)


Lesenswert?

Das sind keine Wertzuweisungen.
Das sind Deklarationen, wieviele Bits die einzelnen Elemente der 
Struktur haben.

z.B.
 unsigned char StepMode: 2;
sagt, dass StepMode 2 Bits hat, und so nur Werte zwischen 0 und 3 
aufnehmen kann.
Es wird kein Wert in StepMode geschrieben.

von Chris (Gast)


Lesenswert?

Stichwort Bitfelder

von Martin (Gast)


Lesenswert?

Ich habe mir schon fast gedacht das dies heißen soll wie viele Bits 
benutzt werden. Jedoch habe ich schon in einigen Online C Büchern 
nachgeschaut und bis jetzt nichts gefunden.

Ich werde jetzt aber noch mal nach dem Stichwort  Biltfelder suchen

von Wusel D. (stefanfrings_de)


Lesenswert?

> Sagt denn dein C-Buch gar nichts zu dem Thema? Wenn nicht, dann wirf es
weg

In einem Buch für Einsteiger darf man solche Eigenarten der Sprache 
ruhig auslassen, finde ich. Eigene Programm kann man auch ohne Bitfelder 
erfolgreich schreiben.

von Martin (Gast)


Lesenswert?

Dies hört sich ja nicht sonderlich schön an:

Wie die Bits eines Bitfeldelementes im Speicher abgelegt werden, ist 
nicht standardisiert. Dies kann von Compiler zu Compiler unterschiedlich 
sein.
Der Zugriff auf Bitfeldelemente ist langsamer als der auf herkömmliche 
Datentypen. Die Elemente haben keine einheitliche Größe und können somit 
über mehrere Speicheradressen hinweg verteilt liegen, beziehungsweise 
mehrere Elementteile können sich eine Speicheradresse teilen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan Frings schrieb:
> In einem Buch für Einsteiger darf man solche Eigenarten der Sprache
> ruhig auslassen, finde ich.

Nein. Ein Buch, das so etwas unterschlägt, ist Müll.

Ist ja nicht so, daß C einen so gigantisch riesigen Funktionsumfang 
hätte, und ist auch nicht so, daß Bitfelder etwas völlig obskures und 
unbekanntes wären.

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:
> Dies hört sich ja nicht sonderlich schön an:
>
> Wie die Bits eines Bitfeldelementes im Speicher abgelegt werden, ist
> nicht standardisiert. Dies kann von Compiler zu Compiler unterschiedlich
> sein.

Jo.
Spielt aber erst dann eine Rolle, wenn man so ein Bitfeld über diverse 
I/O Kanäle mit anderen austauschen muss.
Zb. wenn das Bitfeld eingeführt wurde, um den Zugriff auf Einzelbits in 
einem Hardware-Register syntaktisch zu vereinfachen, oder wenn man ein 
derartiges Objekt zu einem anderen Rechner überträgt.
Aber diese Probleme hat man immer.

> Der Zugriff auf Bitfeldelemente ist langsamer als der auf herkömmliche
> Datentypen. Die Elemente haben keine einheitliche Größe und können somit
> über mehrere Speicheradressen hinweg verteilt liegen, beziehungsweise
> mehrere Elementteile können sich eine Speicheradresse teilen.

Ja. Klar.
Prinzipiell kann ein Compiler auch nicht zaubern. Wenn in 5 Bytes eine 
'Feinstruktur' aus x Elementen besteht erzeugt werden soll, dann müssen 
die verfügbaren Bits eben irgendwie auf die Elemente aufgeteilt werden. 
Und wenn der µC nicht Bitweise auf den Speicher zugreifen kann, dann 
muss man das eben so machen, dass man die jeweils benötigten Bytes in 
die CPU holt, die Bits rausextrahiert und zum gewünschten Wert 
zusammensetzt. Also genau das, was du auch händisch tun müsstest. Nur 
dass dir der Compiler die Feinarbeit abnimmt.


Musst du ja auch machen. Willst du aus einem Buch einen Abschnitt 
rauskopieren, der auf einer Seite unten anfängt und auf der nächsten 
Seite oben fortgesetzt wird, dann machst du von beiden Buchseiten eine 
Kopie, schneidest die jeweils nicht benötigten Teile mit der Schere weg 
und klebst die beiden Einzelteile zusammen.
Die Arbeit kannst du dir nur dann sparen, wenn jeder Abschnitt im Buch 
auf einer jeweils neuen Seite ist und dort auch komplett abgedruckt ist.
Allerdings würden die meisten Bücher dann im Umfang und im 
Papierverbrauch gewaltig zunehmen.
Also: entweder einfache Handhabung oder "Speicher"-Verbrauch.

von Martin (Gast)


Lesenswert?

Die Bitfelder sind schon ein interessantes Thema. Bis jetzt habe die 
einzelnen Bits immer mit Bitmasker unterschieden. Dies ist natürlich 
übersicherlicher.

Nur wie kann der Compiler auf die einzelnen Bits zugreifen

normalerweise macht man es ja so:
1
if((test & 0x03) == 0x03)
2
{
3
}
4
else
5
{
6
}
7
8
if((test & BITMASKE) == BITMASKE)
9
{
10
}
11
else
12
{
13
}
14
15
16
mit der Bitmaske kann ich halt direkt auf das Bit 0 und 1 zugreifen jedoch was geht schneller????

von Jürgen Eder (Gast)


Lesenswert?

Meine Lieblingsseite wenn es um C (oder C++) geht:

Zum Thema Bitfelder:
http://www.cpp-tutor.de/cpp/le08/bitfelder.html

von Udo S. (urschmitt)


Lesenswert?

Jürgen Eder schrieb:
> Meine Lieblingsseite wenn es um C (oder C++) geht:

Meine:
http://de.wikipedia.org/wiki/The_C_Programming_Language
Zweitausgabe von 88 incl. ANSI C

von Martin (Gast)


Lesenswert?

1
/ Peripherie-Baustein nachbilden
2
struct Timer
3
{
4
   struct
5
   {
6
      bool enable    : 1;
7
      bool intEnable : 1;
8
      bool intPeriod : 1;
9
      bool           : 1;
10
      UCHAR preScale : 4;
11
   } reg0;
12
   UCHAR reg1;
13
   struct
14
   {
15
      bool pending   : 1;
16
      UCHAR          : 6;
17
      bool overf     : 1;
18
   } reg2;
19
} *pTimer = (struct Timer*)0x0100;

erzeuge ich mit *pTimer = (struct Timer*)0x0100; eine neue Instanz der 
Struktur die dann unter der Adresse 0x0100 gepseichert wird?

von Oliver (Gast)


Lesenswert?

Martin schrieb:
> erzeuge ich mit *pTimer = (struct Timer*)0x0100; eine neue Instanz der
> Struktur die dann unter der Adresse 0x0100 gepseichert wird?

Lies einfach ganz genau, was da steht, das beantwortet dein Frage.

Tipp: *

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.