mikrocontroller.net

Forum: Compiler & IDEs ARM GCC wie Strukturen ins Flash?


Autor: mgiaco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef struct menue{
  char *text;
  int8_t previous; //menue vorher
  int8_t next; //naechstes menue
  char * (*fp) (void);
  struct menue *sub; 
}menueObject;
So beim AVR:
menueObject myMenue[]PROGMEM = {
  {"Test1", 0 ,0 ,NULL ,NULL},                   
  {"Test2", 0 ,0 ,NULL ,NULL},                      
  {"Test3", 0 ,0 ,NULL ,NULL}                   
};
wie beim ARMGCC?

Besten Dank

Autor: Mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach mit 'const' davor. Da der ARM ein Von-Neumann-Rechner ist, lässt 
GCC den Variablenwert einfach im Flash, wenn dieser nicht verändert wird 
bzw werden darf. Da liegt alles in einem einzigen Adressraum.

MfG Mark

Autor: mgiaco (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Okay, aber wie mache ich das hier siehe Anhang. Wenn ich const nehme 
kann ich ja nicht mehr darauf zugreifen. Read only!

Autor: Mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du es beim AVR im PROGMEM speicherst, dann kannst Du doch auch 
nicht drauf schreibend zugreifen! Da musst Du es als eine ganz normale 
Variable deklarieren, also ohne const.

MfG Mark

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mgiaco wrote:
> Okay, aber wie mache ich das hier siehe Anhang. Wenn ich const nehme
> kann ich ja nicht mehr darauf zugreifen. Read only!

Ja, was hätte es sonst für einen Sinn?
Flash als RAM benutzen oder was?

Autor: mgiaco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo stimmt eigentlich.
Aber wie mache ich es wenn ich sowas machen will? Siehe Anhang oben.
item1.next = &item2;
Ich wollte eigentlich nur die Strukturen inst Flash legen und dann 
darauf Zugreifen Read und Write sonst kann ich ja nicht viel machen.

Na ja ich glaube der Fehler liegt woanders, K&R habe ich natürlich vor 
mir liegen aber... na ja mal weiter suchen lesen.


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mgiaco wrote:
> Jo stimmt eigentlich.
> Aber wie mache ich es wenn ich sowas machen will? Siehe Anhang oben.
> item1.next = &item2;
> Ich wollte eigentlich nur die Strukturen inst Flash legen und dann
> darauf Zugreifen Read und Write sonst kann ich ja nicht viel machen.
>
> Na ja ich glaube der Fehler liegt woanders, K&R habe ich natürlich vor
> mir liegen aber... na ja mal weiter suchen lesen.

Hm? Keine Ahnung was du damit sagen willst.

Stell mal mehr Quelltext 'rein.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich wollte eigentlich nur die Strukturen inst Flash legen und dann
> darauf Zugreifen Read und Write sonst kann ich ja nicht viel machen.

Das wird mit dem Flash möglicherweise gar nicht gehen. In der Regel 
braucht man einen speziellen Lösch-/Programmierzyklus, der sich dann 
auch nicht auf eine einzige Speicherstelle, sondern auf eine ganze 
Speicherseite auswirkt. Deshalb gibt's schließlich RAM.

Autor: Joerg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst du nur einen (konstanten)Pointer auf ein anderes Struct? - dann 
brauchst du einen Prototyp der anderen struct, und mußt die Adresse 
natürlich bei der Initialisierung bereits angeben.
const struct einname B;//Prototyp
const struct einname A = {
    ...
    next = &B;
    ...
}; // initialisierung

  

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass mich raten: Du möchtest die Menüstrukturen gar nicht zur Laufzeit
beschreiben, sondern sie einmal zu Beginn initialisieren, so dass jede
ihren festen Text und ihre festen Flags hat und die Strukturen
untereinander als Baum verzeigert sind.

Richtig? Wenn ja, dann solltest du die Initialisierung nicht in einer
Funktion, sondern direkt bei der Variablen- bzw. Konstantendefinition
vornehmen, z. B. so:

low.h:
typedef const struct menueItem MenueItem;

struct menueItem {
  struct menueIcon *menueIcon; //Icon zum Beispiel Batterie-Symbol
  char *text;
  char *value; 
  u8_t flags;
  MenueItem *next;
  MenueItem *prev;
  MenueItem *parent;
  MenueItem *child;
};

low.c:
MenueItem s1, s11, s12, s2, s3;

MenueItem
  s1  = { NULL, "menu1",  NULL, 0, &s2,  &s3,  NULL, &s11 },
  s11 = { NULL, "menu11", NULL, 0, &s11, &s11, &s1,  NULL },
  s12 = { NULL, "menu12", NULL, 0, &s12, &s12, &s1,  NULL },
  s2  = { NULL, "menu2",  NULL, 0, &s3,  &s1,  NULL, NULL },
  s3  = { NULL, "menu3",  NULL, 0, &s1,  &s2,  NULL, NULL };
Die Werte für menueIcon, value und flags musst du natürlich auch noch
eintragen.

Auf diesem Weg sollten die Strukturen flshbar sein.

Autor: mgiaco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super danke ja genau das habe ich gemeint, danke yalu

mfg mathias

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.