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
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.
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
> 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. ;-)
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
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.
> 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.
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.