www.mikrocontroller.net

Forum: Compiler & IDEs struct-Grösse automatisch anpassen


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte ein struct automatisch so padden, dass die Grösse immer ein 
Vielfaches von 64 ist. Das wenn möglich automatisch vom 
Compiler/Preprocessor:

typedef struct
{
    u8 foo1;
    u16 foo2;
    u8 padder[????]
} tPaddedStruct;

Gibt's da eine Möglichkeit ?

Gruss und Danke

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns nicht portabel sein muss: schau in der Doku, ob dein Compiler 
entsprechende __attribute oder #pragmas kennt.

Autor: Laszlo H. (mobius)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach eine Union drum herum. Also
typedef union{
    uint64_t padding;
    struct {
       uint8_t val;
       uint16_t val2;
    }; 
}tPaddedStruct

Nicht ganz optimal, da du selber für das vielfache sorgen musst, aber 
für 1x 64bit geht das. Ansonsten bleibt dir wirklich 
Compiler-spezifisches byte aling auf 64bit adressen.

Wär halt mein Lösungsansatz.
gruß
Mobius

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ein kleines Script (Perl, Phython) sollte das auch erledigen können 
falls es der Compiler nicht kann.

Matthias

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> ich möchte ein struct automatisch so padden, dass die Grösse immer ein
> Vielfaches von 64 ist.

Rein interessehalber:

Warum?

Oliver

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Oliver: Weil diese Strcut in einem EEPROM dreifach gesichert wird. 
Dieses EEPROM eine Pagesize von 64Byte hat und ich sicherstellen möchte 
das das Schreiben einer Struct keinen Einfluss auf schon geschriebene 
Daten hat (das wäre aber der Fall, wenn Teile von 2 Struct's eine Page 
verwenden würden).

Gruss

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, ich würde das über die Zuordnung von Blöcken/Adressen im EEPROM zu 
den Variablen lösen. Ein Block (oder zwei, oder drei), ein struct. Das 
kann man dann alles im Programm zur Laufzeit einrichten. Irgend eine 
Möglickeit der direkten Adressierung wird das EEPROM ja wohl bieten.

Alternativ liesse sich zur Laufzeit ein Speicherblock mit 64byte (oder 
einem vielfachend davon) erzeugen, in den du die Daten der eigentlichen 
struct-Variable per memcopy hineinkopierst, und das alles zusammen dann 
ins EEPROM schreibst.

Oliver

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.