Forum: Mikrocontroller und Digitale Elektronik Problem bei Firmware Update Routine mit Codebanking


von Daniel (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

Hat keiner eine Idee?

von Edson (Gast)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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