Forum: Compiler & IDEs IAR Strings nur im Flash speichern?


von Martints (Gast)


Lesenswert?

Hallo

Ich habe ein Problem. Ich habe sehr viele Stings die über ein
LCD-Display ausgeben will. IAR füllt mir aber mein RAM mit den
Strings.

Wollte es so probieren:

const char *test="Hallo";

void pos(const char *ma)
{
....
....
}

int main()
{
  pos (test);
}

Klappt nicht. "Hallo" wird ins RAM gelegt. Aufruf von pos(test) mit
ldi R16,0x60 rcall ...

Kann mir jemand weiterhelfen?

Gibt es weiter eine Möglichkeit das man keine seperate Definition des
Textes machen braucht. Ich denke an

pos(const "Martin");   ???

Vielen Dank
Martin

von johnny.m (Gast)


Lesenswert?

Ich kenne mich zwar mit IAR nicht aus, aber eigentlich gibt es für jeden
Compiler Speicherklassen-Qualifizierer (bei CodeVision würde so etwas
z.B. als 'const char flash *test="Hallo";' deklariert, in WINAVR-C
gehts mit PROGMEM). Möglicherweise muss noch irgendeine Header-Datei
eingebunden werden (allerdings bei kommerziellen IDEs eher selten).
Wenn kein Speicherklassen-Qualifizierer angegeben wird, wird i.a.
automatisch im SRAM abgelegt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?


von Johnny (Gast)


Lesenswert?

Also wenn ich das richtig sehe dann hast Du einen konstanten Pointer auf
variable Daten deklariert. Somit ist es kein Wunder, dass der Inhalt ins
RAM kopiert wird.
Man müsste das irgendwie so ähnlich machen:
const char * const test = "Hallo";

Aber besser so, das ist einfacher und bewirkt dasselbe:
const char test[] = "Hallo";

Wobei dann "test" auch den Pointer zu dem String repräsentiert.

Gruss
Johnny

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Man müsste das irgendwie so ähnlich machen:
> const char * const test = "Hallo";

Hilft auch nicht.  Das hier ist eine Harvard-Architektur, da musst
du dem Compiler schon sagen, dass er das explizit in den ROM
stopfen soll.  Die Zeiger werden dadurch nämlich inkompatibel mit
den Bibliotheks-Standard-Funktionen (strcpy() etc.).

Das Stichwort für den IAR lautet __flash, den Rest solltest du in
der Doku finden -- ist ja hier irgendwie ein wenig off-topic. ;-)

von Michael Wilhelm (Gast)


Lesenswert?

Wie Jörg schon schrieb, __flash. Da der Compiler meine Versionsnummer
immer wegoptimierte, sind Konstruktionen wie volatile __flash unsigned
char version[] = ... durchaus möglich.

MW

von Johnny (Gast)


Lesenswert?

Ah ok, ich wusste nicht, dass es hier um einen AVR geht.
Bei TI MSP430 und Renesas H8S gehts nur mit der Angabe von const.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Bei TI MSP430 und Renesas H8S gehts nur mit der Angabe von const.

Das sind auch keine Harvards.

Ja, das mit dem AVR geht auch nur implizit aus der erwähnten
Assemblersyntax hervor, der OP hätte das ein wenig expliziter
schreiben sollen.

von Martints (Gast)


Lesenswert?

Hallo

Danke für Eure Tips sie haben mir weitergeholfen.

Mit dieser Befehlszeile klappt es. Allerdings nur, wenn msg_hello als
globale Variable geklariert wird. Ansonsten ignoriert der Compiler
__flash und der String wird im Speicher abgebildet.

__flash  char msg_hello[]="Hello";

mit einem vorangestellten volitile habe ich es nicht probiert. Dann
klapps wohl auch in den Funktionen ...

Vielen Dank!

73 Martin (DC2MQ)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du kannst natürlich nur Variablen mit static storage in den
Flash legen.  Globale Variablen haben immer static storage
(wenn man sie "static" deklariert, ändert man nur den Scope
von global auf file scope), lokale Variablen haben standardmäßig
automatic storage, dort musst du also das "static" schreiben.

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.