Forum: Mikrocontroller und Digitale Elektronik Keil uVision4 String ins Flash


von Oliver S. (eragon)


Lesenswert?

Folgende Frage:

Bin zurzeit an einem LCD Menue.
Eval Board ist das MCBSTM32. Chip ist STM32F102.
Nun hab ich mir als Basis das AVR Butterfly Menue genommen.

Dort werden die texte wie folgt gespeichert:
1
__flash char MT_AVRBF[]                     = "AVR Butterfly";

Nun leider versteh das uVision4 den "Befehl" __flash nicht.

Mein Code siets so aus:
1
char MT_INFO[]  = "Info";
2
3
static char *statetext0;
4
5
statetext0 = MT_INFO;

Was muss ich da angeben damit er das nur ins Flash schreibt und nicht 
ins RAM? Oder macht der das schon so?

Im Web hab ich irgendwas mit "code" als schlüsselwort gefunden. Aber 
irgendwie packt er das nicht.
http://www.keil.com/support/man/docs/c51/c51_le_code.htm



Gruss Oli

==>Bin Neueinsteiger bei ARM/uVision.

von Matthias K. (matthiask)


Lesenswert?

1
const char MT_AVRBF[] = "AVR Butterfly";

Das ganze ist aber abhängig, ob Du Dein Programm im Flash oder Ram 
ausführst.

von Oliver S. (eragon)


Lesenswert?

okey....und das find ich jetzt wie raus?

Dachte der schreibt den Programm code ins Flash und alle Variabeln ins 
RAM?...bin ich da falsch?


Grusss

von Matthias K. (matthiask)


Lesenswert?

Kommt auf die Projekteinstellungen an "Options for Target", da siehst Du 
die Flash/Ram Bereiche und wohin alles gelinkt wird.

STM32 hat zumindest nach außen einen linearen Adressbereich, wo Ram und 
Flash liegen (Neumann Architektur). Anders als bei den AVR, wo Flash und 
Ram gleiche Adressen haben können (Harward Ar.) Musst grundsätzlich 
umdenken.

von Oliver S. (eragon)


Lesenswert?

Matthias K. schrieb:
> Kommt auf die Projekteinstellungen an "Options for Target", da siehst Du
> die Flash/Ram Bereiche und wohin alles gelinkt wird.
>

Da steht:


IROM1: 0x8000000 - 0x20000 Startup (yes) IRAM1: 0x20000000 - 0x5000

Nun weis ich im Prinzip wo das ROM bzw das RAM ist.

Und wie krieg ich meine Texte nun in das ROM ?


Gruss Oli

von Matthias K. (matthiask)


Lesenswert?

Bei diesen Einstellungen (Standard, solltest Du so lassen) so wie 
gesagt:

const char MT_AVRBF[] = "AVR Butterfly";



Nur als Hinweis:
Kannst auch das gesamte Programm in den RAM legen, zB. mit:

IROM1: 0x2000000 - 0x4000 Startup (yes) IRAM1: 0x20004000 - 0x1000

Da müssten dann ggf. in den Programm noch paar Sachen beachtet werden, 
zB. die Interrupptvektoren.

IROM ist bei den STM32 nicht zwangsläufig mit FLASH gleichzusetzen. Er 
kann ein Programm auch aus dem RAM ausführen. Besonders zum testen macht 
sich das gut. Ist natürlich weg, wenn Du VCC abschaltest.

Ansonsten empfehle ich Dir zunächst, dass Du Dich erstmal internsiv mit 
der STM32-Familie beschäftigst, Datenblatt etc. Diese µC sind nicht 
unbedingt was zum Einstieg. Da ist AVR besser geeignet.

von Oliver S. (eragon)


Lesenswert?

Matthias K. schrieb:
> Bei diesen Einstellungen (Standard, solltest Du so lassen) so wie
> gesagt:
>
> const char MT_AVRBF[] = "AVR Butterfly";


hab ich schon probiert. Gibt ne compiler fehler meldung:
error:  #513: a value of type "const char *" cannot be assigned to an 
entity of type "char *"

Da muss irgend ein Problem mit dem Pointer vorliegen. Aber wie behebe 
ich das?


> Ansonsten empfehle ich Dir zunächst, dass Du Dich erstmal internsiv mit
> der STM32-Familie beschäftigst, Datenblatt etc. Diese µC sind nicht
> unbedingt was zum Einstieg. Da ist AVR besser geeignet.

AVR hab ich schon oft erfolgreich eingesetzt. Wie gseagt es geht hier ja 
nur um die Optimierung des Codes. Laufen tut das so. ;)

Gruss Oliver

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.