www.mikrocontroller.net

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


Autor: Martints (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Johnny (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

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

Autor: Johnny (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Martints (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.