Forum: Mikrocontroller und Digitale Elektronik Kernfunktionalität einer Anwendung schreibschützen


von Freund (Gast)


Lesenswert?

Moin, liebe gcc-Profis!

Folgende Aufgabe stellt sich mir:

Ich möchte meinen ATMega644 via WLAN (ZG2100) flashen, das WLAN soll in 
der Anwendung weiter genutzt werden können.

Im Grunde genommen eine Anwendung, in der nach dem Flashen eine 
Teilfunktionalität erhalten bleibt bzw. ein Bootloader, der sich 
Ressourcen mit der Anwendung teilt.

Vielen Dank, schon im Voraus

: Verschoben durch Moderator
von Marco (Gast)


Lesenswert?

Und Du hast das Gefühl jemand zauber Dir die Software und nen Schaltplan 
herbei oder was ?

von Marcus B. (raketenfred)


Lesenswert?

Manchmal sind die Träume größer als das eigene Vermögen

normalerweise nimmt man dies, um das eigene Vermögen zu vergrößern

von Noch'n Freund (Gast)


Lesenswert?

Freund schrieb:
> Ich möchte meinen ATMega644 via WLAN (ZG2100) flashen, das WLAN soll in
> der Anwendung weiter genutzt werden können.

Ok. Dann viel Erfolg.

> Vielen Dank, schon im Voraus

Gern geschehen.

PS: Nächstes Mal solltest du nach der Einleitung deines Postings 
vielleicht noch eine Frage stellen. ;-)

von Freund (Gast)


Lesenswert?

@ Marco

Ne, Schaltplan ist nicht notwendig. Die Übertragung läuft bereits.
Trotzdem: Danke für den hilfreichen Beitrag.

@Marcus B.

Ja, da hast Du wohl recht, das ist wohl manchmal so. Sehr gut!

@Noch'n Freund

Ausgehend von der Tatsache, dass die WLAN Übertragung bereits 
funktioniert und die Anwendung bereits fertig ist, kann man nach dem 
Flashen via WLAN selbiges in der Anwendung weiterhin verwenden?

Wie kann ich dieses Ziel erreichen bzw. was habe ich für Möglichkeiten?

(Bitte versucht das Gedisse aus diesem Thread zu lassen. Es muss doch 
möglich sein, sich hier vernünftig und sachlich zu unterhalten.)

von Chris (Gast)


Lesenswert?

Vielleicht solltest Du erst einmal ausführlich und vor allem 
verständlich dein Problem und deine Fragen formulieren. Das erhöht die 
Wahrscheinlichkeit auf kompetente Hilfe ungemein.

von Freund (Gast)


Lesenswert?

@Chris :)
Hab ich auch schon bemerkt.
Doch darauf kann man auch anders reagieren, oder?

von Marcus B. (raketenfred)


Lesenswert?

Es ist wesentlich einfacher, die Routinen für das WLAN erneut einfach 
mit zu compilen, anstatt den Flash irgendwie zu recyceln

von Freund (Gast)


Lesenswert?

@Marcus B.
Ja, das auf jeden Fall. Jedoch müsste die WPA2-verschlüsselte Verbindung 
beim Einschalten erneut hergestellt werden. Das dauert ca. 30 - 45 Sek. 
Also mind. 1 Minute.
Auch kann ich nicht gerade mit Programmspeicher um mich schmeißen.

Es geht so wie Du sagst, doch da müsste es doch elegantere Lösungen 
geben, oder?

von Marcus B. (raketenfred)


Lesenswert?

ok, das mit dem Recconect ist unschön.

Ich würde das so regeln:
Die Updateroutine läd via WLAN, das neue Hex-File( in einen externen 
Speicherbaustein, ggf. SD-Karte) [nach Verifizierung] wird dann in den 
Bootloader gesprungen, der die WLAN Verbindung hält und den Flash 
beschreibt. Danach wieder aus dem Bootloader in das Programm gehen

von Freund (Gast)


Lesenswert?

Ich sehe den Vorteil des externen Speichers noch nicht.

Also wenn ich Dich richtig verstehe, rätst Du mir zu einem Bootloader.
Dieser ist in der Lage WLAN "zu sprechen".

Wenn ich nun die Anwendung starte, braucht diese ja wieder eine 
WLAN-Verbindung, welche wiederum aufgebaut werden muss.

Was aber zu lange dauert, denn das Gerät wird häufig an und 
ausgeschaltet und sollte möglichst direkt verfügbar sein.

Ich habe bereits überlegt, ein paar Flags (damit die Verbindung nicht 
neu aufgebaut wird) zu setzen, und immer wieder den BL aus der Anwendung 
heraus aufzurufen.
Doch dafür müssten beide (Anwendung und BL) auf eine Speicheradresse 
zugreifen.

Schön ist diese Lösung aber auch nicht.

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Freund,

> Wenn ich nun die Anwendung starte, braucht diese ja wieder eine
> WLAN-Verbindung, welche wiederum aufgebaut werden muss.
>
> Was aber zu lange dauert, denn das Gerät wird häufig an und
> ausgeschaltet und sollte möglichst direkt verfügbar sein.

Aber doch nicht jedesmal mit Bootloading, oder?

So mache ich es:
1. Im EEPROM eine Variable Bootstart. Der Bootloader fragt sie im 
Bootvorgang ab. Ist sie gesetzt, leitet er den Bootvorgang ein. Eben 
ohne Aufbau irgendeiner Verbindung. Andernfalls ruft er das 
Anwendungsprogramm auf.
2. Auf Kommando setzt Dein Anwendungsprogramm die Variable Bootstart auf 
"Bootloading". Anschließend startet sie den Prozessor, dieser beginnt 
mit dem Bootloader.
3. Nach dem Bootvorgang testet der Bootloader, ob alles korrekt gebootet 
wurde. Erst nach erfolgreichem Test wird die Variable Bootstart in den 
Zustand "Anwendung" gesetzt. Andernfalls wird der Bootvorgang so lange 
wiederholt, bis er korrekt abgeschlossen wurde.

Ich hatte das mal gemacht für eine Anwendung, wo der Prozessor 
unzugänglich verbaut war, der Zugang sogar mit Vogelsch..sse verdreckt.

Ich hatte den Bootloader in C geschrieben für einen Atmega128 und 
Kommunikation über UART. Wegen einiger Service-Aufgaben wie Setzen der 
IO-Pins war in der Bootloadersection nicht mehr viel Platz.
Deswegen würde ich die Fehlersicherung für das Booten eher nach Art 
eines ARQ-Protokolls angehen, also kleine Pakete, jedes mehrfach 
übertragen und jede Übertragung eigens gesichert.

Ciao
Wolfgang Horn

von Purzel H. (hacky)


Lesenswert?

Man sollte Interrupts in einem Bootloader vermeiden. Die machen alles 
sehr unuebersichtlich. Die ist einfach, da der Bootloader eine kleine 
und uebersichtliche Mail-Loop, die aus einer einfachen Zustandsmaschine 
besteht, haben kann. Moeglicherweise ist man dann nicht mehr so schnell 
in der tatasaechlichen Applikation und man sollte Interrupts verwenden. 
Dh man schreibt die funktionalitaet nochmals.

von Freund (Gast)


Lesenswert?

@ Wolfgang

Ahh, das ist eine wirklich elegante Lösung. Da hätte ich eigentlich 
selbst drauf kommen können. Vielen Dank für den Tipp. So will ich es mal 
versuchen.

@Oktal Oschi

Ja, Interrupts verkomplizieren die Sache. Ich versuche diese zu 
vermeiden.

Dann setz ich mich mal an die letzte Hürde.

Danke Euch.

von Freund (Gast)


Lesenswert?

So, nun hab ich mal den Treiber und das Protokoll in meinen Bootloader 
eingebaut und siehe da: 6100 Bytes groß :(

Sieht so aus als müsste ich das ganze in 3 Teile zerlegen, so dass der 
Bootloader nur als Switch dient, welcher die Programme (SubBootLoader 
oder Anwendung) aufruft.

Seht ihr dabei Probleme, die mir nicht auffallen?

Noch mehr praktische Tipps?

von Freund (Gast)


Lesenswert?

Hallo, Profis,

ich habe nun also den Atmega folgendermaßen bespielt:

Addr: 0x0000 Anwendung

Addr: 0xCE00 Bootloader     beschreibt den Anwendungsbereich

Addr: 0xFE00 Switchloader   entscheidet, ob Bootloader oder Anwendung 
gestartet wird

BOOTRST ist gesetzt, Interrupttabelle verbleibt auf 0x0000.

Das funktioniert soweit auch ganz gut. Doch um nicht jedesmal den 
kompletten Chip beschreiben zu müssen, wenn ich den Bootloader aufspiele 
habe ich die Adresse ein wenig weiter nach unten verschoben.

Addr: 0x0000 Anwendung

Addr: 0x0500 Bootloader     beschreibt den Anwendungsbereich

Addr: 0xFE00 Switchloader   entscheidet, ob Bootloader oder Anwendung 
gestartet wird

Das Flashen läuft auch wesentlich schneller nur ist die Funktionalität 
komplett weg(offenbar springt er nicht an die Adresse) auch bei der 
Adresse 0x0600 funktioniert es nicht. Bei 0x1000, 0x0200 oder 
0x0000(also ohne Anwendungsteil) funktionieren wieder alles. Kann mir 
jemand sagen, ob das irgendwelche Adressen sind an die ich nicht 
springen darf oder was da sonst falsch laufen könnte?!

Was ausgeschlossen werden kann ist der Chip, den habe ich schon 
testweise ausgetauscht und das Programm welches ja in den anderen 
Bereich läuft und auch im Assamblercode zur richtigen Adresse springt. 
Zudem sind auch alle Kompilerflags richtig gesetzt (Ttext für den 
Bootloader) und des Programm steht im Mega an der richtigen Adresse(hab 
ich ausgelesen).

Hat da einer ne Idee warum das so ist bzw. was da falsch läuft? Nen 
Workaround hab ich ja schon, ich will nur wissen warum ich an die 
Adressen nicht springen kann.

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.