Hallo,
wir setzen den Infineon XE167F-96 L ein.
Die Anwendung benötigt derzeit etwa 40% des verfügbaren Flash-Speichers.
Es stehen maximal 50% des Flashs zur Verfügung, die oberen 50% werden
quasi als "Zwischenpuffer" für Softwareupdates genutzt.
Das Einspielen von neuen Softwareversionen ist derzeit folgendermaßen
realisiert:
1.) Zunächst wird das Hex-File über serielle Schnittstelle übertragen
und direkt in die obere Flash-Hälfte programmiert. Dieser fungiert quasi
erstmal als "Zwischenpuffer".
2.) Sofern die Übertragung erfolgreich war, wird die eigentliche
Programmier-Routine aufgerufen, die (geschützt) in einer Page ganz oben
im Flash steht. Diese löscht die untere Flash-Hälfte und kopiert den
oberen Bereich nach unten.
Dieser Ablauf stellt sicher, dass bei Übertragungsfehlern oder
abgebrochener Übertragung das "Originalprogramm" zunächst nicht zerstört
wird und die Anlage auch weiter in Betrieb bleibt.
Die Vorgehensweise hat 2 Nachteile:
a)Es steht nur 50% Flash für das Programm zur Verfügung
b)Wenn während des o.g. Teil 2.) die Spannung abgeschaltet wird, ist die
Platine "zerstört" und kann nur mittels Programmer wieder mit Software
bespielt werden.
Daher würde ich den Ablauf gerne ungefähr so ändern:
Es gibt einen Programmteil, der in einem "geschützten" Flash Sektor
steht und beim Updaten nicht gelöscht wird.
Das Programm springt zunächst an diese Stelle, es erfolgen die
notwendigen Initialisierungen, um einen seriellen Empfang des Hex-Files
zu ermöglichen, dann wird geprüft, ob ein Flash-Update eingespielt
werden soll und dementsprechend entschieden, ob das Programm normal oder
im Programmiermodus startet.
Aus meiner Sicht müsste das folgendermaßen ablaufen:
1. Reset
2. Sprung zu _main
(unten im Flash oberhalb des Startups und der Interruptvektoren)
3. Ausführung der notwendigen Teile der MAIN_vInit
(PLL, Ports, Schnittstelle,..)
4. Abfrage, ob Flash oder normaler Programmablauf und Sprung in die
entsprechenden Funktionen, die in einem anderen Sektor liegen müssen.
Somit könnte der komplette Flash mit Ausnahme des untersten Sektors
genutzt werden und der "Bootloader" würde immer funktionieren, auch wenn
beim Flashen etwas schiefgeht.
Sehe ich das richtig oder gibt es vielleicht bessere Ansätze ?
Hat jemand diesbezüglich Erfahrung mit dieser Prozessorfamilie ?