Forum: Compiler & IDEs SRAM mehrfach ausnutzen


von Matthias K. (matthiask)


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.

von (prx) A. K. (prx)


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;

von Matthias K. (matthiask)


Lesenswert?

Genau das ist es. Danke für Deine schnelle Hilfe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.