Kann man so pauschal nicht sagen; es kommt drauf, wie du das
alles verwenden kannst/willst/musst.
Variante 1:
Den eigentlichen Puffer getrennt beschaffen (wie auch immer) und
in der struct nur einen Zeiger drauf:
1 | typedef struct SPI_attrib
|
2 | {
|
3 | PORT_t* SPI_port;
|
4 | SPI_t* SPI;
|
5 | unsigned char *SPI_buff;
|
6 | unsigned char * buff_ptr;
|
7 | unsigned int data_length;
|
8 | unsigned char SPI_state;
|
9 | } SPI_attrib_t;
|
10 |
|
11 | ...
|
12 | unsigned char SPI_buff1[SPI_BUFFER_size_1];
|
13 | unsigned char SPI_buff2[SPI_BUFFER_size_2];
|
14 | SPI_attrib_t a;
|
15 | SPI_attrib_t b;
|
16 |
|
17 | a.SPI_buff = SPI_buff1;
|
18 | b.SPI_buff = SPI_buff2;
|
Muß natürlich entsprechend initialisiert werden.
Variante 2:
Falls der Speicher mit malloc() o.ä. reserviert wird oder mit union
getrickst wird, geht beim gcc (auch wenn sich die Gelehrten streiten,
wie weit das portabel ist) auch die Variante, das Feld ans Ende der
struct zu packen, mit der Länge 0 zu vereinbaren und jeweils
reichlich zu allokieren:
1 | typedef struct SPI_attrib
|
2 | {
|
3 | PORT_t* SPI_port;
|
4 | SPI_t* SPI;
|
5 | unsigned char * buff_ptr;
|
6 | unsigned int data_length;
|
7 | unsigned char SPI_state;
|
8 | unsigned char SPI_buff[0];
|
9 | } SPI_attrib_t;
|
10 |
|
11 | // Platz für struct mit 100 Byte Puffer:
|
12 | SPI_attrib_t *p_attrib = (SPI_attrib_t*)malloc( sizeof(SPI_attrib_t)+100 );
|