mikrocontroller.net

Forum: Compiler & IDEs unterschiedliche Buffergrößen in Strukturen reservieren?


Autor: mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe folgendes Problem:

ich möchte mit folgender Struktur mehrere SPI mit unterschiedlichen 
Buffergrößen ausstatten. Leider kann ich SPI_BUFFER_size nur als 
Konstante definieren. Gibt es da eine Möglichkeit, oder geht dies nur 
mit einer "neuen" Struktur?
typedef struct SPI_attrib
{
    PORT_t* SPI_port;
    SPI_t*  SPI;
    unsigned char SPI_buff[SPI_BUFFER_size];
    unsigned char * buff_ptr;
    unsigned int  data_length;
    unsigned char SPI_state;
} SPI_attrib_t;

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
typedef struct SPI_attrib
{
    PORT_t* SPI_port;
    SPI_t*  SPI;
    unsigned char *SPI_buff;
    unsigned char * buff_ptr;
    unsigned int  data_length;
    unsigned char SPI_state;
} SPI_attrib_t;

...
unsigned char SPI_buff1[SPI_BUFFER_size_1];
unsigned char SPI_buff2[SPI_BUFFER_size_2];
SPI_attrib_t a;
SPI_attrib_t b;

a.SPI_buff = SPI_buff1;
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:
typedef struct SPI_attrib
{
    PORT_t* SPI_port;
    SPI_t*  SPI;
    unsigned char * buff_ptr;
    unsigned int  data_length;
    unsigned char SPI_state;
    unsigned char SPI_buff[0];
} SPI_attrib_t;

// Platz für struct mit 100 Byte Puffer:
SPI_attrib_t  *p_attrib = (SPI_attrib_t*)malloc( sizeof(SPI_attrib_t)+100 );

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.