mikrocontroller.net

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


Autor: Emperor L0ser (emperorl0ser)
Datum:

Bewertung
0 lesenswert
nicht 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:
...
gui_button okbutton;
okbutton.setText("Ok");
...

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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
StdButton okbutton(IndexOf_OK);
StdButton cancelbutton(IndexOf_CANCEL);

intern die Funktion setText überschreiben!
und Sie darf von aussen nicht mehr zugänglich sein!!!
ArrayOfFlashStrings[]={"Ok"}, {"Canncel"};

class StdButton: protected gui_button
{
    StdButton(int index);
}

StdButton::StdButton(int index)
{
  setTextFromFlash(ArrayOfFlashStrings[index]);
}

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?
__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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.