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.
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.
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.
Ganz einfach: int* meinevar = (int*)0x08003000; wenn ab Adresse eine 32-Bit signed Variable liegt. Sonst halt analog dazu. Lerne C!
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?
wohl nicht.. wenn ich index weglasse kommt expression must be a modifiable lvalue. es kann doch nicht kompliziert sein.
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?
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++; }
So sollte es gehen: int* meinevar[256]; meinevar = (int**)0x08003000;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.