mikrocontroller.net

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


Autor: Alexander Laue (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Laue (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Flash (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Laue (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Laue (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.