Forum: Compiler & IDEs ARM-GCC Bitfeld


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
es ist gerade wieder einer der Tage, wo ich mich frage, ob ich in der 
Grundschule bei den Zahlen von 1 bis 10 richtig aufgepaßt habe. Ich habe 
zwei Bitfelder:
1
//Data structure definition for the TMC222 status information.
2
//Use variables of this data type togehter with the GetFullStatus1() function.
3
typedef struct Tmc222Sta1 {
4
  unsigned char slaveAddress : 8;
5
  unsigned char address : 8;
6
  unsigned char IHold: 4;
7
  unsigned char IRun: 4;
8
  unsigned char VMin: 4;
9
  unsigned char VMax: 4;
10
  unsigned char Acc: 4;
11
  unsigned char Shaft: 1;
12
  unsigned char StepMode: 2;
13
  unsigned char AccShape: 1;
14
  unsigned char TInfo: 2;
15
  unsigned char TW: 1;
16
  unsigned char TSD: 1;
17
  unsigned char UV2: 1;
18
  unsigned char ElDef: 1;
19
  unsigned char SteppLoss: 1;
20
  unsigned char VddReset: 1;
21
  unsigned char CPFail: 1;
22
  unsigned char NA: 1;
23
  unsigned char OVC2: 1;
24
  unsigned char OVC1: 1;
25
  unsigned char ESW: 1;
26
  unsigned char Motion: 3;
27
  unsigned char na0: 8;
28
  unsigned char na1: 8;
29
} Tmc222Status1_t;
30
31
32
typedef struct Tmc222Sta2 {
33
  unsigned char slaveAddress : 8;
34
  unsigned char address : 8;
35
  int16_t actPos : 16;
36
  int16_t tagPos : 16;
37
  unsigned char na0 : 8; // Hier steckt noch implizit die
38
  unsigned char na1 : 8; // Secure Position drin
39
  unsigned char na2 : 8;
40
} Tmc222Status2_t;
und wenn ich auf meiner Zielplattform (STM32F103) die Größe ausgeben 
lasse:
1
printf("\fstat1=%i,stat2=%i\n\a",sizeof(Tmc222Status1_t),sizeof(Tmc222Status2_t));
bekomme ich die Antwort stat1=9,stat2=10 und verstehe momentan nicht 
warum (bei Tmc222Status2_t erwarte ich 9).

Warum?

Viele Grüße
W.T.

von (prx) A. K. (prx)


Lesenswert?

Eine (ungepackte) Struct mit einem 2-Byte Datentyp wird auf einem ARM 
nie eine ungerade Grösse haben.

von Walter T. (nicolas)


Lesenswert?

__attribute__((packed)) war's, danke für den Denkanstoß!

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.