Das Demo "AVR BootTraps"
{$PHASE BootBlock $0F000}
const
Boot[$1FFF0] : word = $AA55;
procedure BootTest;
begin
// the very first procedure called in the boot
// ....
ASM: JMP SYSTEM.VectTab;
end;
würde mit Optimiser nicht funktionieren, weil der Sprung
ASM: JMP SYSTEM.VectTab;
vom Optimiser zu einem
JMP SYSTEM.RESET
wird
Ersteres ist ein Sprung nach 0h, letzteres ist ein ungewisser Sprung.
Das Problem ist, dass die Position von System.Reset nach einem FlashDownload
sich ändert und der Bootloader dann zur Falschen Stelle springt.
Bitte Demo und Compiler-Handbuch Seite 185
SetVectTabBoot(false); // vector table on address 0
ASM: JMP SYSTEM.VectTab; // absolute address $0000 = RESET vector
verbessern. Vorschlag: {$VALIDATE $} benutzen.
Auszug .lst file:
0256 F000 .PHASE 01E000h BOOT
0257 F012 .ORG 01E024h, BOOT
0258 F012
0259 F012 .FUNC BootTest, 00025h, 00020h
0260 F012 .VALID
0261 F012 BootTrapCheck.BootTest:
0262 F012 .RETURNS 0
0263 F012 .BLOCK 38
0264 F012 .LINE 41
0265 0053 .BRANCH 20, SYSTEM.RESET
0266 F012 940C0053 JMP SYSTEM.RESET
0267 F014 .ENDBLOCK 42
0268 F014 .LINE 42
0269 F014 .ENDFUNC 42
Code
{$PHASE BootBlock $0F000}
const
Boot[$1FFF0] : word = $AA55;
procedure BootTest;
begin
// the very first procedure called in the boot
// ....
ASM: JMP SYSTEM.VectTab;
end;
würde mit Optimiser nicht funktionieren, weil der Sprung
Code
ASM: JMP SYSTEM.VectTab;
vom Optimiser zu einem
Code
JMP SYSTEM.RESET
wird
Ersteres ist ein Sprung nach 0h, letzteres ist ein ungewisser Sprung.
Das Problem ist, dass die Position von System.Reset nach einem FlashDownload
sich ändert und der Bootloader dann zur Falschen Stelle springt.
Bitte Demo und Compiler-Handbuch Seite 185
Code
SetVectTabBoot(false); // vector table on address 0
ASM: JMP SYSTEM.VectTab; // absolute address $0000 = RESET vector
verbessern. Vorschlag: {$VALIDATE $} benutzen.
Auszug .lst file:
Code
0256 F000 .PHASE 01E000h BOOT
0257 F012 .ORG 01E024h, BOOT
0258 F012
0259 F012 .FUNC BootTest, 00025h, 00020h
0260 F012 .VALID
0261 F012 BootTrapCheck.BootTest:
0262 F012 .RETURNS 0
0263 F012 .BLOCK 38
0264 F012 .LINE 41
0265 0053 .BRANCH 20, SYSTEM.RESET
0266 F012 940C0053 JMP SYSTEM.RESET
0267 F014 .ENDBLOCK 42
0268 F014 .LINE 42
0269 F014 .ENDFUNC 42