Hallo Zusammen, ich habe ein Problem und hoffe Ihr könnt mir eventuell weiter helfen. Ich benutze den C8051F120 mit Codebanking. Eine compilierte Firmware die über alle 3 Bänke verteilt ist läuft auch, wenn ich sie aufspiele. Nun mein Problem: Ich habe eine Update-Routine mit der es möglich sein soll, die Firmware zu aktualisieren. Alle Updaterelevanten Funktionen sind im Common-Bereich und das Codeupdate wird erst nach all diesen Funktionen begonnen, so dass die Routine sich nicht selbst überschreibt. Als Flash-Funktionen habe ich die Standard Funktionen von Silabs verwendet und die Codebanking Direktive eingeschaltet, so dass auch die Bänke umgeschaltet werden. Solange ich nur in der ersten Bank den Code aktualisiere funktioniert auch alles wie gewünscht, nur sobald dann die nächste Bank beschrieben werden soll wird nur der Anfang der Bank beschrieben und dann ist der Controller nicht mehr bei der nächsten Anweisung die mir eigentlich eine Bestätigung senden soll, dass der Code geschrieben wurde, sondern der Controller steckt auf einmal an irgendeiner Addresse im Common-Bereich und macht dort seine Codeausführung weiter. Woran kann das liegen, was mache ich falsch? Viele Grüße Daniel
Daniel schrieb: > Hat keiner eine Idee? Das kann so viele Gründe haben, da wird jetzt niemand anfangen ins Blaue zu raten. Ich tu es trotzdem mal: Am wahrscheinlichsten ist es die Update-Routine, weil es ja nach dem direkt einspielen funktioniert.
Edson schrieb: > Daniel schrieb: >> Hat keiner eine Idee? > > Das kann so viele Gründe haben, da wird jetzt niemand anfangen ins Blaue > zu raten. Ich tu es trotzdem mal: Am wahrscheinlichsten ist es die > Update-Routine, weil es ja nach dem direkt einspielen funktioniert. Die Update-Routine funktioniert ja im Prinzip, solange wie nicht die Bank gewechselt wird. Sobald das passiert, wird der Schreibvorgang noch zu Ende gebracht und ab dann passiert folgendes: Eine einfache if-Abfrage if(x == y) wird auf einmal als true ausgewertet obwohl im Debugger zu diesem Zeitpunkt x != y ist! Wie kann das passieren? Ich habe schon vieles getestet, also zB. nur in einer anderen Bank zu schreiben, das führt immer zu diesem Fehlverhalten.
Daniel schrieb: > Hat keiner eine Idee Naja, die Silabs sind ja nur einer von vielen 8051-er. Und Codebanking benutzen auch die wenigsten. Auch weiß keiner, welche IDE, welchen Compiler und welches Memory-Modell Du benutzt. Ich habe bisher nie Banking gebraucht, kann Dir also nicht helfen. Ich benutze auch immer das Small-Modell, da fällt es sehr schwer, den Flash über 64kB voll zu kriegen, trotz 10.000 Codezeilen. Peter
Peter Dannegger schrieb: > Daniel schrieb: >> Hat keiner eine Idee > > Naja, die Silabs sind ja nur einer von vielen 8051-er. Und Codebanking > benutzen auch die wenigsten. > Auch weiß keiner, welche IDE, welchen Compiler und welches Memory-Modell > Du benutzt. > > Ich habe bisher nie Banking gebraucht, kann Dir also nicht helfen. > Ich benutze auch immer das Small-Modell, da fällt es sehr schwer, den > Flash über 64kB voll zu kriegen, trotz 10.000 Codezeilen. > > > Peter Hallo Peter, ich benutze den Keil Compiler (PK-51) mit dem LARGE Memory Modell. Ich bin zur Zeit bei ca. 80k Code trotz höchster Optimierungsstufe. D.h. ohne Codebanking keine Chance.
Daniel schrieb: > LARGE Memory Modell. Ich > bin zur Zeit bei ca. 80k Code Ja, das Large-Modell ist dafür bekannt, daß es den Code aufbläht. Mit Small könntest Du spielend die 64kB unterschreiten. Man muß dann allerdings große Datenfelder selber als xdata deklarieren. Der Luxus, sich nicht um Speichertypen kümmern zu müssen, erkauft man mit (sehr) viel Flashverbrauch. Peter
Peter Dannegger schrieb: > Daniel schrieb: >> LARGE Memory Modell. Ich >> bin zur Zeit bei ca. 80k Code > > Ja, das Large-Modell ist dafür bekannt, daß es den Code aufbläht. > Mit Small könntest Du spielend die 64kB unterschreiten. Man muß dann > allerdings große Datenfelder selber als xdata deklarieren. > > Der Luxus, sich nicht um Speichertypen kümmern zu müssen, erkauft man > mit (sehr) viel Flashverbrauch. > > > Peter Hallo Peter, das Memory-Modell ist aber scheinbar leider nicht mein Problem. Wie gesagt, sobald ein Bank-Switch durchgeführt wird und dieser nach dem Schreiben wieder rückgängig gemacht wird, wird der danach auszuführende Code völlig durcheinander gebracht und ich kann mir dieses Verhalten einfach nicht erklären. Schönes Wochenende wünsche ich
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.