Forum: Mikrocontroller und Digitale Elektronik ST10: direkter Lese-Zugriff auf Flash-Speicher


von Alexander Laue (Gast)


Lesenswert?

Hallo zusammen,

ich setze einen ST10F269 uC mit 256KB internen Flash und 12 KB internen
RAM ein.

Mein Problem ist nun, dass ich eine zeitkritische Regelung erstellen
muss. Aufgrund des komplexen Regelalgorithmus ist der ST10 nicht
schnell genug um den Algorithmus in Echtzeit abarbeiten zu können.
Daher möchte ich eine Look-Up-Tabelle einsetzen.

Leider muss auch die Look-Up-Tabelle sehr umfangreich sein, weshalb sie
nicht in den RAM passt. Daher möchte ich die Lookup-Tabelle direkt im
Flash speichern. In Keil (Programmierung in C) könnte ich zwar die
Werte als Konstanten hinterlegen, jedoch muss ich dann eine gewisse
Logik haben, die mir die passenden Werte ausgibt. Und diese
switch-Anweisungen oder irgendwelche Schleifen haben je nach
Eingabewert unterschiedliche Laufzeiten. Das ist ungünstig.

Daher möchte ich mir aus den Eingabewerten eine Speicheradresse
berechnen (diese Berechnung hat immer feste Laufzeit) und anschließend
den Wert direkt aus dem Flash-Speicher auslesen.

Und genau hier ist mein Problem: Wie kann ich (am besten mit einer
kleinen C-Routine oder mit embedded Assembler) auf den Flash-Speicher
an einer bestimmten Adresse zugreifen um einen Wert auszulesen?

Das nächste Problem ist, wie ich Keil mitteilen kann, dass es genau in
dem entsprechenden Speicherbereich meine konstanten Werte hinlegen
soll?

Hat hier jemand Erfahrungen und kann mit weiterhelfen?

Vielen Dank und viele Grüße...

Alexander

von Alexander Laue (Gast)


Lesenswert?

Kurzer Nachtrag:

Externen RAM wäre zum Teil die Lösung, allerdings würde dies ein
Neulayout der Schaltung bedeuten (und mit zusätzlichen kosten verbunden
sein), was ich auch gerne, wenn irgend möglich, vermeiden möchte.

von Flash (Gast)


Lesenswert?

Hallo,

das Problem kannst Du lösen, indem Du bei den Settings in deinem
Projekt unter "LOCATE" eine neue Speicherklasse erstellst z.B.

REGLER(0x01000-0x10000);

an dieser Speicherstelle sollte dann auch natürlich Flashspeicher
liegen. Dann kannst Du in deinem C-File, das für deine Reglertabelle
ist, am Anfang die Speicherklassen umschalten z.B. mit:

#pragma RENAMECLASS (NCONST=REGLER)
#pragma RENAMECLASS (FCONST=REGLER)
#pragma RENAMECLASS (HCONST=REGLER)

const unsigned int reglerwert_1 = 100;
const unsigned int reglerwert_2 = 110;

etc. oder auch deine komplexen Arrays anlegen. Damit kannst Du diese an
eine bestimmte Stelle im Flash "placen".
Ich habe das beim C167 gemacht aber es sollte, da diese kompatibel
sind, auch beim ST10 funktionieren.

Gruß Flash

von Alexander Laue (Gast)


Lesenswert?

Hi Flash,

dank Deines Hinweises hab ich nun folgendes gemacht:
Ich habe einen großen Speicherbereich "REGLER(0x020000-0x04FFFF)" und
einen "kleinen", nicht überlappenden Speicherbereich
"SONST(0x018000-0x01FFFF)" bei "Locate" angelegt und ihn mit der
Pragma-Anweisung wie folgt genutzt:

#pragma RENAMECLASS (NCONST=SONST)
#pragma RENAMECLASS (FCONST=SONST)
#pragma RENAMECLASS (HCONST=REGLER)
#pragma RENAMECLASS (XCONST=REGLER)

Es gibt im gesamten Program nur die lookup-Tabelle, die als "const
signed int xhuge lookupwerte[94610];" deklariert ist. Bei allen
anderen Konstanten ist der Speichertyp entweder "far" oder nicht
explizit angegeben. Das Speicher-Modell ist "Large".

Das klappt auch alles soweit sehr gut, allerdings bekomme ich beim
Linken folgende Warning:

*** WARNING L5: SECTION LOCATED OUTSIDE CLASS AREA
    SECTION: ?C_LIB_NCONST
    CLASS:   NCONST

Kennt ihr die Ursache für dieses Warning?

Vielen Dank für Eure Hilfe...

Alexander

von Alexander Laue (Gast)


Lesenswert?

Hallo,

ich habe inzwischen selbst eine Lösung für mein Problem gefunden:
Ich habe alle Konstanten der Speichertypen "near" und "far" in den
von mir definierten Speicherbereich "SONST" verschoben.

Dabei hab ich nur den oberen Speicherbereich verwendet. Als ich den
Speicherbereich für "SONST" angepasst habe auf "SONST(0x0-0x7FFF,
0x18000-0x1FFFF)" trat die Warning nicht mehr auf.

Viele Grüße...

Alexander

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.