Forum: Mikrocontroller und Digitale Elektronik AVR: C++ und Instanzen von Klassen im Flash


von Klaus P. (emperorl0ser)


Lesenswert?

Moin,
weiss jemand, ob es möglich ist im AVR Instanzen von Klassen im Flash 
abzulegen?

Zum Hintergrund:
Ich habe einen ATMega162 mit angeschlossenem Display (vom S65).
Ich habe eine Klasse gui_objekte, von der Klassen wie gui_button, 
gui_label, gui_checkbox, usw. abgeleitet werden. Jede abgeleitet Klasse 
besitzt einige andere Eigenschaften. (Klar, sonst würde ich keine 
Klassen ableiten müssen).
Während der Entwicklung lege ich fest, dass ich zum Beispiel zwei 
Schaltflächen (gui_button) und ein Label haben will. Alle Eigenschaften 
dieser Objekte stehen zur Entwicklungszeit fest und werden zur Laufzeit 
nicht verändert, wohl aber steht auf Schaltfläche 1 z.B. "Ok" und auf 
Schaltfläche 2 "Abbrechen". Nun will ich Operation wie:
1
...
2
gui_button okbutton;
3
okbutton.setText("Ok");
4
...

vermeiden. Da ich mir damit den gesamten RAM vom AVR unnötig voll packe.
Gibt es eine praktikable Möglichkeit diese Daten im ROM zu belassen, wie 
man es zum Beispiel mit einem Struct in C machen könnte? C Structs gehen 
auf Grund der unterschiedlichen Objekttypen nicht oder nur sehr 
umständlich.

mfg emperorl0ser

von Stephan (Gast)


Lesenswert?

Hi,

mal mein Vorschlag:

eine neue Klasse "StdButton". (von deiner Klasse "gui_button")
diese Klasse greift intern über einen index auf ein Array mit Strings 
(im Flash) zu.
1
StdButton okbutton(IndexOf_OK);
2
StdButton cancelbutton(IndexOf_CANCEL);

intern die Funktion setText überschreiben!
und Sie darf von aussen nicht mehr zugänglich sein!!!
1
ArrayOfFlashStrings[]={"Ok"}, {"Canncel"};
2
3
class StdButton: protected gui_button
4
{
5
    StdButton(int index);
6
}
7
8
StdButton::StdButton(int index)
9
{
10
  setTextFromFlash(ArrayOfFlashStrings[index]);
11
}

so sollte das ungefähr laufen können.
Vorteil, hier brauchst du nur die Liste mit den Text-Einträgen ändern, 
wenn die Sprache im Programm (deutsch <-> englisch) geändert wird!

und du kannst soviele okbuttons erstellen wie du willst ist ja immer der 
gleiche text!

Wie du die Stringliste ins Flash legst, findest du hier im Toturial!

mfg
Stephan

von Oliver (Gast)


Lesenswert?

Emperor L0ser schrieb:
> weiss jemand, ob es möglich ist im AVR Instanzen von Klassen im Flash
> abzulegen?

Gegenfrage: Kennst du einen Weg, bei einem AVR ausführbaren Code 
woanders als im Flash abzulegen?

Das einzige, was bei deiner Konstruktion im SRAM landet, ist der String 
"OK". Und auch der lässt sich problemlos ins Flash verschieben.

Oliver

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Oliver schrieb:
> Emperor L0ser schrieb:
>> weiss jemand, ob es möglich ist im AVR Instanzen von Klassen im Flash
>> abzulegen?
>
> Gegenfrage: Kennst du einen Weg, bei einem AVR ausführbaren Code
> woanders als im Flash abzulegen?
1
__attribute__((section("...")))

Falls es ein GCC ist. Ansonsten Handbuch befragen.

AFAIR liefert ".data" aber einen Fehler bei avr-gcc, hatte das vor 
Zeiten mal getestet. Ins EEPROM liessen sich Funktionen allerdings 
lokatieren (war nur in C).

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.