Hallo,
ich habe folgende Anforderungen:
1. Firmware Update über UART
2. Applikation muss im Normabetrieb unverzüglich aufstartten
3. Keine Interaktion mit dem Gerät bis auf UART
Idee/Lösung:
1. Boot Loader (kein Problem)
2. Boot Loader nicht über irgendeine magic number über UART + timeout
antriggern sondern anders.
Also dachte ich an eine globale Variable die ein FW-Update anzeigt.
Diese wird sowohl in der Applikation als auch im Boot Loader genutzt.
Damit muss sie natürlich in der noinit Sektion abgelegt werden,
allerdings an einer fixen Adresse.
1 | uint8_t fw_update __attribute__ ((section (".noinit")));
|
2 |
|
3 | int boot_loader(void)
|
4 | {
|
5 | uint8_t reset_source;
|
6 |
|
7 | reset_source = MCUCSR;
|
8 | MCUCSR = 0;
|
9 |
|
10 | /* falls watchdog reset und FW-Upate gewünscht */
|
11 | if ((reset_source & (1<<WDRF))
|
12 | && (TRUE == fw_update))
|
13 | {
|
14 | /* FW-Update ausführen */
|
15 | }
|
16 | else
|
17 | {
|
18 | /* Sofort zur Applikation springen */
|
19 | }
|
20 | }
|
1 | uint8_t fw_update __attribute__ ((section (".noinit")));
|
2 |
|
3 | int application_main(void)
|
4 | {
|
5 | fw_update = FALSE;
|
6 |
|
7 | /* ... */
|
8 |
|
9 | if ("FW-Update starten")
|
10 | {
|
11 | fw_update = TRUE;
|
12 |
|
13 | wdt_enable(WDTO_2S);
|
14 | wdt_reset();
|
15 | }
|
16 | }
|
Meiner Meinung nach muss ich sicherstellen, dass beides mal die
fw_update Variable an der selben Stelle im SRAM abgelegt wird. Denn in
der Applikation gibt es noch mehr globale Variablen an anderen Stellen.
Wie kann ich das tun?
Oder wie kann ich mir eine einge Sektion erstellen an einer definierten
Stelle die ebenfalls wie ".noinit" nicht initialisiert wird?
1 | uint8_t fw_update __attribute__ ((section (".fwupdate")));
|
2 |
|
3 | ...
|
4 |
|
5 | avr-gcc -mmcu=atmega64 -Wl,-Map=avr_gcc_test.map -Wl,-section-start=fwupdate=0x800100 avr_gcc_test.o -o avr_gcc_test.elf
|
Was gibt es noch für Möglichkeiten?
Leider kann ich nicht von außen an einem Pin wackeln um das FW Update zu
triggern. Und zu lange auf ein entsprechendes UART zeichen warten um das
FW-Update anzuzeigen geht auch nicht. Im Normalfall muss die Applikation
ruck zuck da sein.
Grüße
jola