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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.