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 ?
Ich würde die Flashroutine in das PSRAM kopieren (normalerweise via Bootstraploader) und von dort aus den Flash löschen und neu beschreiben.
Malzeit, muss man beim C167 bootstrap loader für RS232 dazu aber nicht beim rest einen entprechenden pin setzen, um den c167 in den bootstrap Booter zu zwingen (ich weis sind nur 16 oder 32 byte die man damit übertragen kann) Ansich hört sich das nicht so falsch an. Das andere ist eher murtks, ... genau aus dem grund das wenn man im falschen moment die spannung trennt die kiste zu nem backstein verwandelt. Oder schlimmer noch ein halblebiges monster erschaft ( je nach dem wie der flash gelöscht und programmiert wird. ) Der Booter ist nicht so leicht austauschbar. Bei der HW initallisierung im Booter nur das absolute minimum machen. Die Haupt FW kann dann den rest machen. Alle InterruptVetroren berücksichtigen auch die die auktuell nicht verwendet werden. Sicherstellen, das die neue FW richtig programmiert wurde. Z.B. über eine CRC / ... die bei jedem Start geprüft wird oder über ein flag das nach erfolgreicher Programmierung und validierung gesetzt wird. Sich genau gedanken über löschen/flashen/validieren machen. Entsprechende Sogfalt und qualifizierung berücksichtigen. der Booter kann nur sehr aufwend ausgetauscht werden.
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.