Wegen einem Thema hier bezüglich Bootloader habe ich bissel mit Bootloader herumgespielt.
Oder besser gesagt wollte ich.
Ich wollte die Direktive $BOOT ausprobieren und habe folgenden Code geschrieben.
Alles anzeigen
Natürlich ist das keinj funktionierenden Bootloader, aber darum gehts erst mal nicht. Auch könnte ich die Direktive $LOADER verwenden, das wollte ich aber auch erst mal nicht.
Es müsste ja laut Bascom-Hilfe auch mit $Boot gehen.
Spoiler anzeigen
The $BOOT directive is replaced by $LOADER. $LOADER works much simpler. $BOOT is however still supported.
Mit AVR-Studio debug commt folgendes zum Vorschein:
Alles anzeigen
Der Bootloader sollte bei $C00 beginnen. Das tut er auch.
Aber ab Adresse generiert der Compiler ebenfalls Code, der viele Fragen aufwirft.
Aber warum der Code im Simulator nicht läuft, dürfte wohl an den Zeilen 128 und 133.
Hier wird ein Return ohne Call ausgeführt.
Und das sind wohl 2 Subroutinen.
Die Frage ist nun, ist das ein Bug?
Der Rest würde zwar ausgeführt, stört aber erst mal nicht, wenn der Reset-Vector auf den Bootloader gesetzt ist.
Was ist da los?
Oder besser gesagt wollte ich.
Ich wollte die Direktive $BOOT ausprobieren und habe folgenden Code geschrieben.
BASCOM-Quellcode
- ' Bootloader-Experiment
- $Regfile = "m168def.dat"
- $HWStack = 10
- $SWStack = 10
- $Framesize = 10
- $Crystal = 16000000
- $BOOT = $0C00
- '$noinit
- '$NoRAMClear
- '$SIM
- .EQU RAMEND = $4FF
- !NOP ' erste Code-Anweisung
- !NOP ' 2. Anweisung
- !LDI r24, LByte(RAMEND) ' Stack setzen
- !OUT SPL, r24
- !LDI r24, HByte(RAMEND)
- !OUT SPH, r24
- _start:
- !NOP
- !JMP _start
Natürlich ist das keinj funktionierenden Bootloader, aber darum gehts erst mal nicht. Auch könnte ich die Direktive $LOADER verwenden, das wollte ich aber auch erst mal nicht.
Es müsste ja laut Bascom-Hilfe auch mit $Boot gehen.
The $BOOT directive is replaced by $LOADER. $LOADER works much simpler. $BOOT is however still supported.
Mit AVR-Studio debug commt folgendes zum Vorschein:
Quellcode
- 00000000 JMP 0x00000034 Jump
- 00000002 RETI Interrupt return
- 00000003 NOP No operation
- 00000004 RETI Interrupt return
- 00000005 NOP No operation
- 00000006 RETI Interrupt return
- 00000007 NOP No operation
- 00000008 RETI Interrupt return
- 00000009 NOP No operation
- 0000000A RETI Interrupt return
- 0000000B NOP No operation
- 0000000C RETI Interrupt return
- 0000000D NOP No operation
- 0000000E RETI Interrupt return
- 0000000F NOP No operation
- 00000010 RETI Interrupt return
- 00000011 NOP No operation
- 00000012 RETI Interrupt return
- 00000013 NOP No operation
- 00000014 RETI Interrupt return
- 00000015 NOP No operation
- 00000016 RETI Interrupt return
- 00000017 NOP No operation
- 00000018 RETI Interrupt return
- 00000019 NOP No operation
- 0000001A RETI Interrupt return
- 0000001B NOP No operation
- 0000001C RETI Interrupt return
- 0000001D NOP No operation
- 0000001E RETI Interrupt return
- 0000001F NOP No operation
- 00000020 RETI Interrupt return
- 00000021 NOP No operation
- 00000022 RETI Interrupt return
- 00000023 NOP No operation
- 00000024 RETI Interrupt return
- 00000025 NOP No operation
- 00000026 RETI Interrupt return
- 00000027 NOP No operation
- 00000028 RETI Interrupt return
- 00000029 NOP No operation
- 0000002A RETI Interrupt return
- 0000002B NOP No operation
- 0000002C RETI Interrupt return
- 0000002D NOP No operation
- 0000002E RETI Interrupt return
- 0000002F NOP No operation
- 00000030 RETI Interrupt return
- 00000031 NOP No operation
- 00000032 RETI Interrupt return
- 00000033 NOP No operation
- 00000034 SER R24 Set Register
- 00000035 OUT 0x3D,R24 Out to I/O location
- 00000036 LDI R28,0xF6 Load immediate
- 00000037 LDI R30,0xFA Load immediate
- 00000038 MOV R4,R30 Copy register
- 00000039 LDI R24,0x04 Load immediate
- 0000003A OUT 0x3E,R24 Out to I/O location
- 0000003B LDI R29,0x04 Load immediate
- 0000003C LDI R31,0x04 Load immediate
- --- C:\Users\Michael\Documents\Projekte\Experimente\Temp\noname5.bas -----------
- 0000003D MOV R5,R31 Copy register
- 0000003E WDR Watchdog reset
- 0000003F IN R24,0x34 In from I/O location
- 00000040 MOV R0,R24 Copy register
- 00000041 ANDI R24,0xF7 Logical AND with immediate
- 00000042 OUT 0x34,R24 Out to I/O location
- 00000043 LDI R24,0x18 Load immediate
- 00000044 CLR R25 Clear Register
- 00000045 STS 0x0060,R24 Store direct to data space
- 00000047 STS 0x0060,R25 Store direct to data space
- 00000049 LDI R30,0xFE Load immediate
- 0000004A LDI R31,0x03 Load immediate
- 0000004B LDI R26,0x00 Load immediate
- 0000004C LDI R27,0x01 Load immediate
- 0000004D CLR R24 Clear Register
- 0000004E ST X+,R24 Store indirect and postincrement
- 0000004F SBIW R30,0x01 Subtract immediate from word
- 00000050 BRNE PC-0x02 Branch if not equal
- 00000051 CLR R6 Clear Register
- 00000052 SBIW R30,0x01 Subtract immediate from word
- 00000053 BRNE PC-0x01 Branch if not equal
- 00000054 RET Subroutine return
- 00000055 SET Set T in SREG
- --- C:\Users\Michael\Documents\Projekte\Experimente\Temp\noname5.bas -----------
- 00000056 BLD R6,2 Bit load from T to register
- 00000057 RET Subroutine return
- 00000058 CLT Clear T in SREG
- 00000059 BLD R6,2 Bit load from T to register
- 0000005A RET Subroutine return
- 0000005B NOP Undefined
- 0000005C NOP Undefined
- 0000005D NOP Undefined
- 0000005E NOP Undefined
- 0000005F NOP Undefined
- 00000060 NOP Undefined
- 00000061 NOP Undefined
Der Bootloader sollte bei $C00 beginnen. Das tut er auch.
Aber ab Adresse generiert der Compiler ebenfalls Code, der viele Fragen aufwirft.
Aber warum der Code im Simulator nicht läuft, dürfte wohl an den Zeilen 128 und 133.
Hier wird ein Return ohne Call ausgeführt.
Und das sind wohl 2 Subroutinen.
Die Frage ist nun, ist das ein Bug?
Der Rest würde zwar ausgeführt, stört aber erst mal nicht, wenn der Reset-Vector auf den Bootloader gesetzt ist.
Was ist da los?