Forum: Mikrocontroller und Digitale Elektronik Probleme mit Struct


von Steffen G. (steff_g)


Lesenswert?

Hallo, ich habe folgenden Code:
1
unsigned char Print1[15];
2
unsigned char Print2[15];
3
4
unsigned char PrintOut[5] = {0x01,0x02,0x03,0x04,0x05};
5
6
7
struct sttest
8
{
9
  unsigned char sttest_array[5];
10
};
11
12
struct test1
13
{
14
  struct sttest test1_array1;
15
  struct sttest test1_array2;
16
};
17
18
struct test2
19
{
20
  uint8_t test1_array1[5];
21
  uint8_t test1_array2[5];
22
};
23
24
25
26
#define Pointer1   ((struct test1 *)&Print1[0])
27
#define Pointer2   ((struct test2 *)&Print2[0])
28
29
void main(void)
30
{
31
  
32
  SystemInit();
33
34
  Pointer1->test1_array1.sttest_array[0] = PrintOut[0];
35
  Pointer1->test1_array1.sttest_array[1] = PrintOut[1];
36
  Pointer1->test1_array1.sttest_array[2] = PrintOut[2];
37
  Pointer1->test1_array1.sttest_array[3] = PrintOut[3];
38
  Pointer1->test1_array1.sttest_array[4] = PrintOut[4];
39
40
  Pointer1->test1_array2.sttest_array[0] = PrintOut[0];
41
  Pointer1->test1_array2.sttest_array[1] = PrintOut[1];
42
  Pointer1->test1_array2.sttest_array[2] = PrintOut[2];
43
  Pointer1->test1_array2.sttest_array[3] = PrintOut[3];
44
  Pointer1->test1_array2.sttest_array[4] = PrintOut[4];
45
46
  Pointer2->test1_array1[0] = PrintOut[0];
47
  Pointer2->test1_array1[1] = PrintOut[1];
48
  Pointer2->test1_array1[2] = PrintOut[2];
49
  Pointer2->test1_array1[3] = PrintOut[3];
50
  Pointer2->test1_array1[4] = PrintOut[4];
51
52
  Pointer2->test1_array2[0] = PrintOut[0];
53
  Pointer2->test1_array2[1] = PrintOut[1];
54
  Pointer2->test1_array2[2] = PrintOut[2];
55
  Pointer2->test1_array2[3] = PrintOut[3];
56
  Pointer2->test1_array2[4] = PrintOut[4];
57
58
  while(1);
59
}
Nach meinem Verständnis von sollte danach in Print1 und Print2 das 
gleiche drin stehen.
Aber jedoch bei den verschachteten Structs, beginnt er das zweite Array 
erst bei der Adresse 0x08 einzutragen, weiß einer wieso das so ist?

Verwende den GNU Compiler.

Vielen Dank

von Karl H. (kbuchegg)


Lesenswert?

Steffen Gerner schrieb:

> Aber jedoch bei den verschachteten Structs, beginnt er das zweite Array
> erst bei der Adresse 0x08 einzutragen, weiß einer wieso das so ist?
>
> Verwende den GNU Compiler.

Auf welcher Platform?

Sieht so aus, als ob dein Compiler da mit Padding Bytes aufgefüllt hat 
um für die Strukturen eine durch 8 dividierbare Adresse zu erhalten.

von Steffen G. (steff_g)


Lesenswert?

Arbeite mit dem Crossworks 2.2 für ARM.

Mich wirft das ganze ein bisschen aus der Bahn, weil ich eigentlich 
nicht jedes struct nochmal schreiben wollte :(

Unter Crossworks 2.1 für MSP430 funktioniert es :(

von Karl H. (kbuchegg)


Lesenswert?

Steffen Gerner schrieb:
> Arbeite mit dem Corssworks 2.2 für ARM.
>
> Mich wirft das ganze ein bisschen aus der Bahn, weil ich eigentlich
> nicht jedes struct nochmal schreiben wollte :(

Die Frage ist eher: Warum castest du da ein Array in Structs um. Das 
sind Operationen, die man eventuell ganz tief unten in einer Software 
machen kann, wo man irgendwelche über Schnittstellen hereinlaufende 
Daten in Structs zergliedert, aber ansonsten sind derartige Operationen 
meistens keine gute Idee. Immer wenn du etwas umcasten musst, solltest 
du dich sofort fragen, ob es da nicht eine bessere Möglichkeit gibt.


(Im Notfall kann man den meisten Compilern auch die Anweisung geben, 
keine Padding bytes einzufügen. Meistens ist das ein #pragma. "#pragma 
pack" oder so ähnlich. Wie das beim gcc ist, weiß ich nicht. Denn wie 
gesagt: Ich würde erst mal sehen, ob diese Array->Pointer Casterei nicht 
eigentlich schon eine ganz üble Operation ist)

von Steffen G. (steff_g)


Lesenswert?

Das problem ist, das ich gerade mit dem uIP TCP/IP stack von Adam 
Dunkels arbeite und der das sehr oft leider macht.

Ich dachte eigentlich eher, das ich das einfach so verwenden kann, aber 
dann werde ich wohl eher mir das ganze doch ein bisschen selber 
zusammenbauen :(

von Simon K. (simon) Benutzerseite


Lesenswert?

Bei dem uip sollte man sich aber auch nicht gerade Programmierkonstrukte 
abschauen.
Der ist "innen drin" ganz böse gehackt.

von bla (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wie das beim gcc ist, weiß ich nicht.
__attribute__((packed))

von Steffen G. (steff_g)


Lesenswert?

@Simon
ich will es mir ja nicht abschauen, sondern einfach nur verwenden. Mein 
Problem ist, das die Zeiger auf falsche Datenframes zeigen und somit nur 
schrott raus kommt..

von Simon K. (simon) Benutzerseite


Lesenswert?

Steffen Gerner schrieb:
> @Simon
> ich will es mir ja nicht abschauen, sondern einfach nur verwenden. Mein
> Problem ist, das die Zeiger auf falsche Datenframes zeigen und somit nur
> schrott raus kommt..

Ach so! Hm, möglicherweise ist dann lwIP statt uip was für dich?

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.