Wie Direktive $ReduceIVR anwenden?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Wie Direktive $ReduceIVR anwenden?

      Hallo zusammen

      Ich spiel hier grad bissel mit dem Tiny13 rum und probiere die Directive $ReduceIVR aus.
      Mein Programm sieht so aus:

      BASCOM-Quellcode

      1. $regfile = "attiny13.dat"
      2. $crystal = 4800000 ' Intern RC-Clock
      3. $hwstack = 16
      4. $swstack = 16
      5. $framesize = 32
      6. $NoInit
      7. $NoRamClear
      8. $ReduceIVR
      9. Do
      10. Gosub Test1
      11. Loop
      12. Test1:
      13. Gosub Test2
      14. Return
      15. Test2:
      16. NOP
      17. Return
      Alles anzeigen
      Wenn ich das Programm durchsteppe, bis ich in Zeile 12 bin, zeigt es mir im Simulator Programmcounter $0011 an.
      Egal ob ich ReduceIVR verwende oder nicht, der Programmcounter ist an der Stelle immer $0011.

      Sollte der PC mit ReduceIVR nicht 0 sein?
    • Da gibt's doch noch den reset-interrupt, denn kann man wohl nicht vermeiden. Und der hat doch auch Programmcode. Wenn ich im Datenblatt das sehe
      The most typical and general program setup for the Reset and Interrupt Vector Addresses in
      ATtiny13A is:
      Address Labels Code Comments
      0x0000 rjmp RESET ; Reset Handler
      0x0001 rjmp EXT_INT0 ; IRQ0 Handler
      0x0002 rjmp PCINT0 ; PCINT0 Handler
      0x0003 rjmp TIM0_OVF ; Timer0 Overflow Handler
      0x0004 rjmp EE_RDY ; EEPROM Ready Handler
      0x0005 rjmp ANA_COMP ; Analog Comparator Handler
      0x0006 rjmp TIM0_COMPA ; Timer0 CompareA Handler
      0x0007 rjmp TIM0_COMPB ; Timer0 CompareB Handler
      0x0008 rjmp WATCHDOG ; Watchdog Interrupt Handler
      0x0009 rjmp ADC ; ADC Conversion Handler
      ;
      0x000A RESET: ldi r16, low(RAMEND); Main program start
      0x000B out SPL,r16 ; Set Stack Pointer to top of RAM
      0x000C sei ; Enable interrupts
      0x000D <instr> xxx
      ... ... ... ...

      dann müsste ab dem label reset: der code schon im ram stehen und dann geht es mit dem code von deinem Programm weiter.
      Aber ich kenn mich ja nicht so aus, das ist jetzt meine Vermutung.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wenn ich $NoInit weg lasse, und dann mal mit und mal ohne ReduceIVR durchsteppe, sehe ich einen Unterschied.

      Wenn man in Manuell Programmieren geht, erkennt man die Vectortabelle, ob sie da ist oder nicht.

      Also der $ReduceIVR scheint zu tun.

      Aber was passiert da noch?

      RamClear ($NoRAMClear) ist aus und ein Stack sollte auch nicht initialisiert werden.

      Was passiert da noch?

      Wäsche schön, wenn man jetzt einen decompiler hätte.
    • Ich denke, einen stack gibt's immer, den braucht es ja für return. Also muss der stackpointer gesetzt werden. Das wird, so wie ich das sehe, in der restart-Routine erledigt. Außerdem hast du einen frame angegeben, der muß ja auch eingerichtet werden.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Der Link war keine Hilfe, trotzdem Danke.

      Ich habs jetzt mit Suchen und probieren hinbekommen.
      Aber wer kommt schon drauf, dass man einen Simulator starten muss, wenn man dissassembliereb will.
      Und dann muss man noch über Kontektmenü auf den Code GoDissassembler anwählen.

      Ziemlich umständlich.

      Aber naja.

      Hier nochmal der Quellcode:

      BASCOM-Quellcode

      1. $regfile = "attiny13.dat"
      2. $crystal = 4800000 ' Intern RC-Clock
      3. $hwstack = 16
      4. $swstack = 16
      5. $framesize = 32
      6. $NoInit
      7. $NoRamClear
      8. $ReduceIVR
      9. '$Tiny ' Erforderich wenn SRAM=0
      10. !NOP ' Erkennung erstes ausführbare Instruction
      11. !NOP
      12. Do
      13. Gosub Test1
      14. Loop
      15. Test1:
      16. Gosub Test2
      17. Return
      18. Test2:
      19. NOP
      20. Return
      Alles anzeigen

      So hier also der dissassemblierte Code:

      Quellcode

      1. 00000000 LDI R24,0x9F Load immediate
      2. 00000001 OUT 0x3D,R24 Out to I/O location
      3. 00000002 LDI R28,0x90 Load immediate
      4. 00000003 LDI R30,0x78 Load immediate
      5. 00000004 MOV R4,R30 Copy register
      6. 00000005 CLR R29 Clear Register
      7. 00000006 MOV R5,R29 Copy register
      8. 00000007 WDR Watchdog reset
      9. 00000008 IN R24,0x34 In from I/O location
      10. 00000009 MOV R0,R24 Copy register
      11. 0000000A ANDI R24,0xF7 Logical AND with immediate
      12. 0000000B OUT 0x34,R24 Out to I/O location
      13. 0000000C LDI R24,0x18 Load immediate
      14. 0000000D CLR R25 Clear Register
      15. 0000000E OUT 0x21,R24 Out to I/O location
      16. 0000000F OUT 0x21,R25 Out to I/O location
      17. 00000010 CLR R6 Clear Register
      18. !NOP ' Erkennung erstes ausführbare
      19. 00000011 NOP No operation
      20. !NOP
      21. 00000012 NOP No operation
      22. Gosub Test1
      23. 00000013 RCALL PC+0x0002 Relative call subroutine
      24. Loop
      25. 00000014 RJMP PC-0x0001 Relative jump
      26. Gosub Test2
      27. 00000015 RCALL PC+0x0002 Relative call subroutine
      28. Return
      29. 00000016 RET Subroutine return
      30. NOP
      31. 00000017 NOP No operation
      32. Return
      33. 00000018 RET Subroutine return
      Alles anzeigen
      In Zeile 1 und 2 vom Disassembly wird der Stack initialisiert
      In Zeile 26 und 27 sind die beiden NOP's aus dem Quellcode.
      Das sind die ersten beiden ausgeführten Instruktionen, die im Quellcode stehen.

      Wieso wird hier eigentlich ein Stack inizialisiert?

      Und Zeile 4 bis einschl. Zeile 25 ist mir irgendwie ein Rätsel.
      Da werten Register mit Werten geladen, aber es passiert damit nichts weiter.
      Außer Zeile 12, da wird der Watchdog resettet. Ist das notwendig?
      Dann in Zeile 13 bis 17. Da wird das MCUSR ausgelesen, Bits maskiert und wieder zurück geschrieben. Warum davon eine Kopie in R0 geht? Keine Ahnung.

      Sicher ist, $ReduceIVR hat keine Vector-Tabelle angelegt.

      Hat da jemand Antworten auf meine Fragen?
    • Was den stack betrifft, du findest ja ein return im code und dazu gehört ja auch eine Sprungadresse und die steht im stack. Ich denke, ohne stack geht nix, weil ein return im Maschinencode ein Befehl ist.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Du hast recht, aber solange ich weder Gosub oder Push oder Pop oder so was mache, ist es egal was im Stack steht.

      Ich dachte immer, dass $NoInit keine Initialisierung mach.
      Aber was bedeutet nun genau Initialisierung.
      Oder anders gefragt, was genau bewirkt $NoInit?
      $NoRAMClear ist klar, das kann also nicht Bestandteil von NoInit sein.

      In der Bascomhilfe steht hierzu nur, dass man dann selber Initialisieren muss, wenn man NoInit verwendet.
      Aber was genau muss dann noch initialisiert werden?
      Der Stack gehört wohl nicht dazu.
    • Mitch64 schrieb:

      Der Link war keine Hilfe, trotzdem Danke.

      Ich habs jetzt mit Suchen und probieren hinbekommen.
      Aber wer kommt schon drauf, dass man einen Simulator starten muss, wenn man dissassembliereb will.
      Und dann muss man noch über Kontektmenü auf den Code GoDissassembler anwählen.

      Der Link führt beispielhaft genau durch diesen Themenblock, auch mit dem Start des Simulators und Randinformationen...

      Naja, wahrscheinlich hat Dich das Thema zum ADC irritiert.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • monkye schrieb:

      Der Link führt beispielhaft genau durch
      Das war zu undetailliert. Mir hat gefehlt wie ich den Code disassembliert anzeige.
      Laden ging, aber wie weiter. In dem Link war hjat dann der disassemblierte Code sichtbar.
      War aber nicht beschrieben, was er gemacht hat. - Aber ist jetzt Vergangenheit. Ich weiß es ja jetzt.

      Ich denke zw. Version 4 und 7 hat sich da einiges getan. Vielleicht war es früher einfacher.

      Aber jetzt klappt's ja.