Hilfe bei diese C Struktur

Gast #3156513
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;
#3156518
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.
Gast #3156519
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.
Gast #3156541
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
Gast #3156547
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.
#3156567
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.
Gast #3156598
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????
Gast #3156658
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren