AVR: C++ und Instanzen von Klassen im Flash

OP #1771293
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
Gast
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
Gast
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
Persönliche Seite
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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.