Hallo!
Grundsätzlich lautet meine Frage: Wie lange reserviert der Compiler für
eine lokale Variable Speicherplatz im SRAM? Eigentlich müsste doch,
sobald die Variable ihre Gültikkeit verliert, auch der Speicherplatz vom
Compiler wieder anderen Variablen zugewiesen werden können?
1 | ...
|
2 | {
|
3 | uint8_t a[100] = ...; //hier wird Speicherplatz für a[] reserviert
|
4 |
|
5 | } // hier verliert a seine Gültigkeit, der Speicher müsste von anderen Variablen wieder nutzbar sein?
|
6 |
|
7 | uint8_t b[100] = ...; //müsste den Speicherplatz von a nutzen können?
|
Der Compiler legt bei mir allerdings b (wenn a an Adresse Y steht) bei
Y+100 an. Warum?
Hintergrundinfos:
Ich hab in einem Program für einen AVR das Problem, dass ich eine ganze
Reihe verschiedener Kommandos über eine Schnittstelle versenden möchte.
Jedes Kommando is mehrere Bytes lang und unterschiedlich aufgebaut.
Das Problem is nun, wie ich den AVR-GCC dazu bekomme, nicht jedes
mögliche Kommando im SRAM zu halten.
Wenn ich das Komando normal deklariere, steht natürlich alles im SRAM:
1 | void example()
|
2 | {
|
3 | uint8_t cmd1[] = {Konstante1,Konstante2,Variable1,Variable2,...};
|
4 | uint8_t cmd2[] = {Konstante3,Konstante4,Konstante5,Variable3,...};
|
5 | uint8_t cmd3[] = {Konstante6,Variable4,Variable5,Variable6,...};
|
6 | }
|
Mit PROGMEM deklarieren geht ja leider auch nicht, da die Kommandos
nicht kompett konstant sind.
Meine Überlegung: Es soll immer nur das Kommando im SRAM aufgebaut
werden, was auch gerade benötigt wird.
Ich hab das ganze dann so probiert:
1 | send_comand((uint8_t[]){Konstante1,Konstante2,Variable1,Variable2,...};
|
was ja im Prinzip folgendem Code entspricht:
1 | {
|
2 | uint8_t cmd[] = {Konstante1,Konstante2,Variable1,Variable2,...};
|
3 | send_command(cmd);
|
4 | }
|
Das initialisieren des Array passiert nun, wie es soll nur, wenn das
Kommando gebraucht wird. Allerdings wird weiterhin, jedem Array ein
eingener Speicherbereich im SRAM zugewiesen. Trotz dass die Lebensdauer
des Array nach dem Funktionsaufruf endet.
Wie könnte man das Problem noch lösen?