Forum: Mikrocontroller und Digitale Elektronik Variable aus Flashspeicher lesen


von Andi (Gast)


Lesenswert?

Hi,

stehe gerade voll auf dem Schlauch. Erstmal.. ich arbeite auf dem stmf32 
cortex 3m.

Ich will nun eine Variable (ein int16 array) aus dem Flash lesen welche 
sich auf der Addresse 0x08003000 befindet.

Die aufgesetzten Flashfunktionen lassen ein schreiben auf eine bestimmte 
Speicheraddresse zu.. jedoch geht das lesen nicht, da ich quasi einen 
zweiten nvm bereich beschreibe (normal wird der gesamte NVM beim Start 
in ein Struct gepackt und somit kann ich im anderen NVM bereich "leicht" 
auf den Flashspeicher zugreifen).

Es muss doch eine einfache Möglichkeit geben mir eine Variable zu 
erzeugen, die auf die Addresse im Flashspeicher pointet und read only 
ist ohne gross funktionen zu implementieren.

Ein kleiner Codeschnipsel wird wohl schon reichen.

von Ralph (Gast)


Lesenswert?

Ich tippe mal das du eine Konstante suchst.

const Uint16 Variablenname;

falls "const" in der Schreibweise nicht funktioniert, lies mal in der 
Beschreibung des Kompilers nach wie der die Syntax erwartet.


Falls das ganz eine EEPROM Simulation werden soll ist das nicht mehr 
ganz so einfach.
Sieh dir dann am besten mal die Library an die im Packet zum STM mit 
drin ist.
dann kannst du immer noch entscheiden ob du das selbst nachbauen willst, 
oder die vorgegeben Funktionen nutzen willst.


Und bist du sicher das 0x08003000 im Flash ist und nicht im Ram ?
Ich kenne jetzt den STM nicht im Detail, sondern nur die Mx und Rx von 
Ti, von daher weiß ich nicht genau wie STM seine Addressmappings macht.
Von der Adresse her würde ich diesen Speicherort allerdings im RAM 
erwarten.

von Andi (Gast)


Lesenswert?

ja 0x08000000 bis 0x0x08001FFFF ist der flashbereich des MC. Ram ist bei 
0x20000000.

werde mir die const anschauen.

im eigentlichen programm wird ein eprom simuliert indem beim start der 
gesamte flash in den ram gepackt wird... muss mir das aber nochmal 
anschauen, nicht mein code.

von Steel (Gast)


Lesenswert?

Ganz einfach:

int* meinevar = (int*)0x08003000;

wenn ab Adresse eine 32-Bit signed Variable liegt. Sonst halt analog 
dazu.

Lerne C!

von Andi (Gast)


Lesenswert?

viel Erfahrung hab ich mit Pointern nicht. Zudem hab ich ein Array.

Wenn ich nun
int* meinevar[256];

habe.. funktioniert:

meinevar[0] = (int*)0x08003000;

sollte oder?

von Andi (Gast)


Lesenswert?

wohl nicht.. wenn ich index weglasse kommt expression must be a 
modifiable lvalue.

es kann doch nicht kompliziert sein.

von PittyJ (Gast)


Lesenswert?

Syntaktisch geht es schon, sinnvoll ist es nicht.

Vielleicht sollte man erst einmal das Handwerkszeug verstehen (C, 
Arrays, Pointer), bevor man an so etwas komplizierten wie einen STMF32 
geht?

von Andi (Gast)


Lesenswert?

statt hier so tolle kommentare zu schreiben wäre eine Lösung wesentlich 
hilfreicher.

meine umstaendliche loesung ist:


    pubFlashT = (int16_t *)0x08003000;
    pubRamT = &(i16_linearizationData[0]);

    for (uwCnt = 0; uwCnt < LINEARIZATION_SIZE ; uwCnt++)
    {
        *pubRamT = *pubFlashT;
         pubRamT++;
         pubFlashT++;
    }

von Steel (Gast)


Lesenswert?

So sollte es gehen:

int* meinevar[256];

meinevar = (int**)0x08003000;

von Andi (Gast)


Lesenswert?

Steel schrieb:
> So sollte es gehen:
>
> int* meinevar[256];
>
> meinevar = (int**)0x08003000;

Wenn ichd as ähnlich wie du implementiere:

int32_t* i32_linearizationData[256];

i32_linearizationData = (int32_t**)0x08003000;


Da spuckt mir der Compiler:

error:  #137: expression must be a modifiable lvalue


aktuell hab ich dann einfach kein Array gemacht und zähle dann die 
Adresse hoch für den richtigen index. (da ich weiss dass da aber ein 
Array von int32 liegt)

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.