Applikation
|
Anpassung der Applikation
Allgemein:
Der Bootloader verändert einige
Hardware-Register, daher unterscheidet sich deren Inhalt beim
Start der Applikation vom Wert, der im Datenblatt für "Value
at Reset" angegeben ist. Falls sich die Applikation hier auf die
Reset-Werte verlässt, können Änderungen
erforderlich werden, damit die Applikation auch mit Bootloader
korrekt funktioniert.
Register, die vom Bootloader
verändert werden:
- OPTION_REG
- OSCCON
- WDTCON
- ANSELx
- TRISx
- FSR0L,FSR0H
- EEADRL, EEADRH bzw. PMADRL, PMADRH
- EUSART Registersatz, wenn EUSART im BL genutzt wird
- ggf. Peripheral Pin Select (PPS) Register, sofern in
Verbindung mit EUSART verwendet
Wenn der Bootloader am Anfang des Flashspeichers liegt:
Als Startadresse bzw. Reset-Einsprung der Applikation muss in
diesem Fall die Adresse "APP_START" verwendet werden, wie sie
beim Assemblieren des Bootloaders festgelegt wurde. Eine evtl.
Interrupt-Service Routine muss bei Adresse APP_START+4 beginnen.
Wenn die ENABLE_CHECKSUM-Option verwendet wird, sind
außerdem zwei Speicherzellen für die Berechnung der
Prüfsumme zu reservieren:
- APP_START+2: hier trägt das PICLoader Tool die
Prüfsumme ein, damit die Summe über den gesamten
Applikationscode 0 ergibt
- APP_START+3: gibt die Länge des Applikationscodes an
(in Flashwords), über den die Prüfsumme gebildet
wird. Kann vom PICLoader-Tool automatisch anhand des Hex-Files
ermittelt und hier eingetragen werden (default), oder kann
selbst eingetragen werden, um z.B. Datenbereiche im Flash
durch das Hex-File mit initialen Werten zu programmieren, aber
aus der Prüfsumme herauszuhalten, damit die Daten
später auch geändert werden können.
Der Anfang eines typischen Anwenderprogramms für
APP_START-Adresse 0x100 sieht dann z.B. so aus:
ORG APP_START ;= 0x100 ResetVect 0100 movlp high initialize 0101 goto initialize ; Adressen 0x102 und 0x103 nicht für Code verwenden!
ORG APP_START+4 ;= 0x104
Interrupt ; Interrupt Service Routine:
0104 banksel 0 0105 btfsc ... ; (beliebiger, weiterer Code...)
|
Wenn der Bootloader im oberen Bereich des Flashspeichers
liegt:
Hier wird das Programm so assembliert bzw compiliert und
gelinkt, wie ohne Bootloader, lediglich der
Bootloader-Speicherbereich muss natürlich reserviert
bleiben. Der Startcode des Programms wird vom PICLoader-Tool
beim Laden in den Patchcode-Bereich verschoben und entsprechend
modifiziert:
Original Programm (Beispiel): |
|
Geladenes Programm: |
ResetVect 0000 btfss STATUS,NOT_TO 0001 bra wdt_reset 0002 movlp high initialize 0003 goto initialize Interrupt 0004 banksel 0 : ... 0EF7 (Ende)
|
<--
Programmcode
im Hexfile
PICLoader
sendet an Bootloader
-->
|
ResetVect 0000 movlp high BootLdr 0001 goto BootLdr 0002 movlp high initialize 0003 goto initialize Interrupt 0004 banksel 0 : ... 0EF7 (Ende)
|
Patchcode: |
|
Patchcode: |
Adresse = Bootloader-8, z.B. 0EF8 (reserviert) : 0EFF
|
PICLoader verlagert
original Reset Code
-->
und trägt
applength
und checksum
hier ein
--> |
Adresse = Bootloader-8, z.B. 0EF8 movlp 0 0EF9 btfss STATUS,NOT_TO 0EFA goto wdt_reset 0EFB goto 0x002 0EFC 0EFD 0EFE dw applength 0EFF dw checksum
|
|
|
Bootloader: |
|
|
0F00 (prüft Applikations- : Code, wenn ok:) : goto 0x0EF8 0FFF
(rot:
Inhalt durch Bootloader vor Überschreiben
geschützt)
|
Aufruf des Bootloaders aus der Applikation
Die Applikation kann den Bootloader durch Sprung auf den
Reset-Vektor aufrufen (GOTO 0). Damit der Bootloader nicht
wieder in die Applikation startet, wie nach einem
Hardware-Reset, muss die Applikation anzeigen, daß es sich
hier nicht um einen Reset, sondern um einen Start des
Bootloaders durch die Applikation handelt. Dazu dient das
höchstwertige Bit (Bit 7) im FSR0H-Register, indem es durch
die Applikation auf 1 gesetzt wird, während durch einen
Reset FSR0H gelöscht wäre. Die Interrupts müssen
deaktiviert sein (z.B. INTCON.GIE löschen).
|
|