Direktive $BOOT funktioniert nicht

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Direktive $BOOT funktioniert nicht

      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.

      BASCOM Source Code

      1. ' Bootloader-Experiment
      2. $Regfile = "m168def.dat"
      3. $HWStack = 10
      4. $SWStack = 10
      5. $Framesize = 10
      6. $Crystal = 16000000
      7. $BOOT = $0C00
      8. '$noinit
      9. '$NoRAMClear
      10. '$SIM
      11. .EQU RAMEND = $4FF
      12. !NOP ' erste Code-Anweisung
      13. !NOP ' 2. Anweisung
      14. !LDI r24, LByte(RAMEND) ' Stack setzen
      15. !OUT SPL, r24
      16. !LDI r24, HByte(RAMEND)
      17. !OUT SPH, r24
      18. _start:
      19. !NOP
      20. !JMP _start
      Display All

      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.
      Display Spoiler

      The $BOOT directive is replaced by $LOADER. $LOADER works much simpler. $BOOT is however still supported.


      Mit AVR-Studio debug commt folgendes zum Vorschein:

      Source Code

      1. 00000000 JMP 0x00000034 Jump
      2. 00000002 RETI Interrupt return
      3. 00000003 NOP No operation
      4. 00000004 RETI Interrupt return
      5. 00000005 NOP No operation
      6. 00000006 RETI Interrupt return
      7. 00000007 NOP No operation
      8. 00000008 RETI Interrupt return
      9. 00000009 NOP No operation
      10. 0000000A RETI Interrupt return
      11. 0000000B NOP No operation
      12. 0000000C RETI Interrupt return
      13. 0000000D NOP No operation
      14. 0000000E RETI Interrupt return
      15. 0000000F NOP No operation
      16. 00000010 RETI Interrupt return
      17. 00000011 NOP No operation
      18. 00000012 RETI Interrupt return
      19. 00000013 NOP No operation
      20. 00000014 RETI Interrupt return
      21. 00000015 NOP No operation
      22. 00000016 RETI Interrupt return
      23. 00000017 NOP No operation
      24. 00000018 RETI Interrupt return
      25. 00000019 NOP No operation
      26. 0000001A RETI Interrupt return
      27. 0000001B NOP No operation
      28. 0000001C RETI Interrupt return
      29. 0000001D NOP No operation
      30. 0000001E RETI Interrupt return
      31. 0000001F NOP No operation
      32. 00000020 RETI Interrupt return
      33. 00000021 NOP No operation
      34. 00000022 RETI Interrupt return
      35. 00000023 NOP No operation
      36. 00000024 RETI Interrupt return
      37. 00000025 NOP No operation
      38. 00000026 RETI Interrupt return
      39. 00000027 NOP No operation
      40. 00000028 RETI Interrupt return
      41. 00000029 NOP No operation
      42. 0000002A RETI Interrupt return
      43. 0000002B NOP No operation
      44. 0000002C RETI Interrupt return
      45. 0000002D NOP No operation
      46. 0000002E RETI Interrupt return
      47. 0000002F NOP No operation
      48. 00000030 RETI Interrupt return
      49. 00000031 NOP No operation
      50. 00000032 RETI Interrupt return
      51. 00000033 NOP No operation
      52. 00000034 SER R24 Set Register
      53. 00000035 OUT 0x3D,R24 Out to I/O location
      54. 00000036 LDI R28,0xF6 Load immediate
      55. 00000037 LDI R30,0xFA Load immediate
      56. 00000038 MOV R4,R30 Copy register
      57. 00000039 LDI R24,0x04 Load immediate
      58. 0000003A OUT 0x3E,R24 Out to I/O location
      59. 0000003B LDI R29,0x04 Load immediate
      60. 0000003C LDI R31,0x04 Load immediate
      61. --- C:\Users\Michael\Documents\Projekte\Experimente\Temp\noname5.bas -----------
      62. 0000003D MOV R5,R31 Copy register
      63. 0000003E WDR Watchdog reset
      64. 0000003F IN R24,0x34 In from I/O location
      65. 00000040 MOV R0,R24 Copy register
      66. 00000041 ANDI R24,0xF7 Logical AND with immediate
      67. 00000042 OUT 0x34,R24 Out to I/O location
      68. 00000043 LDI R24,0x18 Load immediate
      69. 00000044 CLR R25 Clear Register
      70. 00000045 STS 0x0060,R24 Store direct to data space
      71. 00000047 STS 0x0060,R25 Store direct to data space
      72. 00000049 LDI R30,0xFE Load immediate
      73. 0000004A LDI R31,0x03 Load immediate
      74. 0000004B LDI R26,0x00 Load immediate
      75. 0000004C LDI R27,0x01 Load immediate
      76. 0000004D CLR R24 Clear Register
      77. 0000004E ST X+,R24 Store indirect and postincrement
      78. 0000004F SBIW R30,0x01 Subtract immediate from word
      79. 00000050 BRNE PC-0x02 Branch if not equal
      80. 00000051 CLR R6 Clear Register
      81. 00000052 SBIW R30,0x01 Subtract immediate from word
      82. 00000053 BRNE PC-0x01 Branch if not equal
      83. 00000054 RET Subroutine return
      84. 00000055 SET Set T in SREG
      85. --- C:\Users\Michael\Documents\Projekte\Experimente\Temp\noname5.bas -----------
      86. 00000056 BLD R6,2 Bit load from T to register
      87. 00000057 RET Subroutine return
      88. 00000058 CLT Clear T in SREG
      89. 00000059 BLD R6,2 Bit load from T to register
      90. 0000005A RET Subroutine return
      91. 0000005B NOP Undefined
      92. 0000005C NOP Undefined
      93. 0000005D NOP Undefined
      94. 0000005E NOP Undefined
      95. 0000005F NOP Undefined
      96. 00000060 NOP Undefined
      97. 00000061 NOP Undefined
      Display All


      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?
    • Ich hab die Ursache gefunden, warum das im Simulator nicht ging.

      BASCOM Source Code: So gehts mit $BOOT

      1. ' Bootloader-Experiment
      2. $Regfile = "m168def.dat"
      3. $Crystal = 16000000
      4. $HWStack = 20
      5. $SWStack = 0
      6. $Framesize = 0
      7. $noinit
      8. $NoRAMClear
      9. '$SIM
      10. Goto $0C00 ' Hier muss Sprung zu Bootloader-Adresse erfolgen, sonst gehts nicht!
      11. $BOOT = $0C00 ' Die Anweisung direkt vor dem Bootloader-Code stehen!
      12. .EQU RAMEND = $4FF
      13. !NOP ' erste Code-Anweisung
      14. !NOP ' 2. Anweisung
      15. !LDI r24, LByte(RAMEND) ' Stack setzen
      16. !OUT SPL, r24
      17. !LDI r24, HByte(RAMEND)
      18. !OUT SPH, r24
      19. _start:
      20. !NOP
      21. !JMP _start
      Display All


      Es lag nicht am Controller.

      Es müssen 2 Dinge passen, sonst geht's nicht.

      1. Es muss nach der Controller-Konfiguration irgendwann zwingend ein Goto <Bootloaderadresse> kommen. Davor sind Basic-Anweisung möglich (wenn Stack entsprechend gesetzt ist). Siehe Zeile 17!

      2. Die Direktive $BOOT muss direkt vor dem Code stehen, der dann an die Bootloader-Adresse soll. $BOOT bei den anderen Direktiven ($RegFile) anzubringen funktioniert nicht.
      Mir scheint es so, als ob $BOOT in der Funktion wie ein .ORG zu sehen ist.

      Es wird aber trotzdem Code ab der Adresse 0 generiert und dort auch Stack gesetzt und WDT konfiguriert. Ebenso RAM gecleart (wenn nicht abgeschaltet, und UART konfiguriert (wenn angegeben) und Vector-Tabelle angelegt (wenn nicht abgeschaltet).

      So sieht das dann disassembliert aus.

      Source Code

      1. 00000000 SER R24 Set Register
      2. 00000001 OUT 0x3D,R24 Out to I/O location
      3. 00000002 LDI R28,0xEC Load immediate
      4. 00000003 LDI R30,0x04 Load immediate
      5. 00000004 MOV R4,R30 Copy register
      6. 00000005 LDI R24,0x04 Load immediate
      7. 00000006 OUT 0x3E,R24 Out to I/O location
      8. 00000007 LDI R29,0x04 Load immediate
      9. 00000008 LDI R31,0x05 Load immediate
      10. 00000009 MOV R5,R31 Copy register
      11. 0000000A WDR Watchdog reset
      12. 0000000B IN R24,0x34 In from I/O location
      13. 0000000C MOV R0,R24 Copy register
      14. 0000000D ANDI R24,0xF7 Logical AND with immediate
      15. 0000000E OUT 0x34,R24 Out to I/O location
      16. 0000000F LDI R24,0x18 Load immediate
      17. 00000010 CLR R25 Clear Register
      18. 00000011 STS 0x0060,R24 Store direct to data space
      19. 00000013 STS 0x0060,R25 Store direct to data space
      20. 00000015 LDI R24,0x67 Load immediate
      21. 00000016 STS 0x00C4,R24 Store direct to data space
      22. 00000018 LDI R24,0x00 Load immediate
      23. 00000019 STS 0x00C5,R24 Store direct to data space
      24. 0000001B LDI R24,0x18 Load immediate
      25. 0000001C STS 0x00C1,R24 Store direct to data space
      26. 0000001E CLR R6 Clear Register
      27. Goto $0C00 ' Hier muss Sprung zu
      28. 0000001F JMP 0x00000C00 Jump
      29. 00000021 SBIW R30,0x01 Subtract immediate from word
      30. 00000022 BRNE PC-0x01 Branch if not equal
      31. 00000023 RET Subroutine return
      32. --- C:\Users\Michael\Documents\Projekte\Experimente\Temp\noname5.bas -----------
      33. 00000024 SET Set T in SREG
      34. 00000025 BLD R6,2 Bit load from T to register
      35. 00000026 RET Subroutine return
      36. 00000027 CLT Clear T in SREG
      37. 00000028 BLD R6,2 Bit load from T to register
      38. 00000029 RET Subroutine return
      39. 0000002A NOP Undefined
      40. 0000002B NOP Undefined
      41. 0000002C NOP Undefined
      Display All


      Und hier was im Bootloader steht:


      Source Code

      1. !NOP ' erste Code-Anweisun
      2. 00000C00 NOP No operation
      3. !NOP ' 2. Anweisung
      4. 00000C01 NOP No operation
      5. !LDI r24, LByte(RAMEND) ' Stack setzen
      6. 00000C02 SER R24 Set Register
      7. !OUT SPL, r24
      8. 00000C03 OUT 0x3D,R24 Out to I/O location
      9. !LDI r24, HByte(RAMEND)
      10. 00000C04 LDI R24,0x04 Load immediate
      11. !OUT SPH, r24
      12. 00000C05 OUT 0x3E,R24 Out to I/O location
      13. !NOP
      14. 00000C06 NOP No operation
      15. --- C:\Users\Michael\Documents\Projekte\Experimente\Temp\noname5.bas -----------
      16. !JMP _start
      17. 00000C07 JMP 0x00000C06 Jump
      18. --- No source file -------------------------------------------------------------
      19. 00000C09 NOP Undefined
      20. 00000C0A NOP Undefined
      21. 00000C0B NOP Undefined
      Display All