IAR Strings nur im Flash speichern?

Gast #367561
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
Gast #367562
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.
Gast #367564
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
Moderator Persönliche Seite #367565
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. ;-)
Gast #367566
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
Gast #367569
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)

Antwort schreiben

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.

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.