SRAM mehrfach ausnutzen

OP #1634673
Lesenswert?

Ich brauche einen neuen Denkanstoß. Während der Laufzeit soll ein großer 
SRAM-Bereich (ATmega) zur Datenzwischenspeicherung verwendet werden. Das 
Datenformat kann vom Benutzer im Menü eingestellt werden und 
unterscheidet sich vom Umfang her. Es kann immer nur eins verwendet 
werden. Im Prinip:

struct tpr_sp1 {       // belegt 8 Byte
    unsigned char     tpr1;
    unsigned char     tpr2;
    unsigned char     tpr3;
    unsigned char     status;
    unsigned long     zeitstempel;
};
struct tpr_sp1 tpr1[100]; // belegt 8 x 100 Byte = 800 Byte

ODER

struct tpr_sp2 {       // belegt 4 Byte
    unsigned char     tpr1;
    unsigned char     tpr2;
    unsigned char     tpr3;
    unsigned char     status;
};
struct tpr_sp2 tpr2[200]; // belegt 4 x 200 Byte = 800 Byte

Ich brauche aber immer nur eine Struktur, praktisch im gleichen 
Speicherbereich. Da die 2. Struktur nur halb so groß ist, könnte ich 
doppelt so viel Datensätze bei gleichen RAM-Bedarf ablegen. Wenn ich es 
über eine Union zusammenlege, wird wie zu erwarten auch für sp2 8 Byte 
reserviert.

union tpr_union {       // belegt 8 Byte
    struct tpr_sp1 {
        unsigned char     tpr1;
        unsigned char     tpr2;
        unsigned char     tpr3;
        unsigned char     status;
        unsigned long     zeitstempel;
    } sp1;
    struct tpr_sp2 {
        unsigned char     tpr1;
        unsigned char     tpr2;
        unsigned char     tpr3;
        unsigned char     status;
    } sp2;
};
union tpr_union tpr[100]; // belegt 8 x 100 Byte = 800 Byte

Wie löst man das am besten? Alternative wäre ein 800 Byte großes 
Universal-Array, welche mit unterschiedlichen Indexen un Offsetwerten 
verwaltet wird. Machbar, aber recht unübersichtlich.
#1634679
Lesenswert?

union tpr_union {
    struct tpr_sp1 {
        unsigned char     tpr1;
        unsigned char     tpr2;
        unsigned char     tpr3;
        unsigned char     status;
        unsigned long     zeitstempel;
    } sp1[100];
    struct tpr_sp2 {
        unsigned char     tpr1;
        unsigned char     tpr2;
        unsigned char     tpr3;
        unsigned char     status;
    } sp2[200];
} tpr;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren