Hallo
Ich habe ein MSP430 und ein PIC24 die ich über UART miteinander
verbunden habe. Die Daten die ich senden will habe ich in Strukturen
angelegt die ich in einem H-File definiert habe. Dieses H-File will ich
in beiden Codes verwenden. Leider legen die beiden Compiler (IAR, C30)
die Strukturen unterschiedlich im Speicher ab. Daher ist es nötig die
Strukturen als "pack(1)" oder "packed" zu definieren. Und da fängt mein
Problem an. Die Compiler habe unterschiedliche Syntax.
Beispiel PIC24 (C30):
1 | //---------------------------------------------------------
|
2 | //! Definition Telegramm
|
3 | typedef struct __attribute__ ((__packed__)) COM_TEL_Test1_s
|
4 | {
|
5 | uint8_t geraeteTyp;
|
6 | uint8_t telTyp;
|
7 | uint8_t length;
|
8 | uint32_t id;
|
9 | uint8_t counter;
|
10 | uint16_t swVersion;
|
11 | } COM_TEL_Test1_t;
|
12 | //----------------------------------------------------------
|
Beispiel MSP430 (IAR)
1 | //---------------------------------------------------------
|
2 | //! Definition Telegramm
|
3 | #pragma pack(1)
|
4 | typedef struct COM_TEL_Test1_s
|
5 | {
|
6 | uint8_t geraeteTyp;
|
7 | uint8_t telTyp;
|
8 | uint8_t length;
|
9 | uint32_t id;
|
10 | uint8_t counter;
|
11 | uint16_t swVersion;
|
12 | } COM_TEL_Test1_t;
|
13 | #pragma pack()
|
14 | //----------------------------------------------------------
|
Meine Lösung "bis jetzt" ist ein Compiler Switch zu nutzen:
1 | //---------------------------------------------------------
|
2 | //! Definition Telegramm
|
3 | #if defined(__ICC430__)
|
4 | #pragma pack(1)
|
5 | typedef struct COM_TEL_Test1_s
|
6 | #elif defined(__C30__)
|
7 | typedef struct __attribute__ ((__packed__)) COM_TEL_Test1_s
|
8 | #else
|
9 | #error 'Compiler ???'
|
10 | #endif
|
11 | {
|
12 | uint8_t geraeteTyp;
|
13 | uint8_t telTyp;
|
14 | uint8_t length;
|
15 | uint32_t id;
|
16 | uint8_t counter;
|
17 | uint16_t swVersion;
|
18 | } COM_TEL_Test1_t;
|
19 | #if defined(__ICC430__)
|
20 | #pragma pack()
|
21 | #endif
|
22 | //----------------------------------------------------------
|
Diese Lösung funktioniert aber sie ist mühsam weil der Compiler Switch
bei jeder Strukturen eingefügt werden muss. Meine ursprüngliche Idee war
ein Makro zu definieren habe aber Probleme mit den # in dem Makro.
// define PACK_S #if defined(_ICC430_) #pragma pack(1) ...
Kennt jemand von euch eine bessere Lösung?
Gruss Manuel