Hallo
Ich werkle bei einem Bootloader, und habe da ein problem bzw
Verständnisproblem mit der Interrupt Tabelle
so sieht der Teil meines Codes aus :
1 | #define __SFR_OFFSET 0
|
2 | #include <avr/io.h>
|
3 |
|
4 | .file "avr_init.S"
|
5 | .text
|
6 | .section .init3,"ax",@progbits
|
7 |
|
8 | .org 0x0000
|
9 | jmp main
|
10 | .org 0x0012
|
11 | jmp load_app
|
12 | .org 0x002A
|
13 | load_app:
|
14 | eor r1, r1
|
15 | ldi r16, _BV (IVCE)
|
16 | out GICR, r16 ; enable change reset vector
|
17 | out GICR, r1 ; change reset vector to application
|
und das funktioniert auch so wie es soll
-> in der main wird dann ein timer1 eingestellt, das nach 2 sekunden
sowas ein Overflow kommt, und das System and die Stelle 0x0012 springt
-> Alles in Ordnung
wenn ich das aber "optimieren" will und so schreibe
1 | #define __SFR_OFFSET 0
|
2 | #include <avr/io.h>
|
3 |
|
4 | .file "avr_init.S"
|
5 | .text
|
6 | .section .init3,"ax",@progbits
|
7 |
|
8 | .org 0x0000
|
9 | jmp main
|
10 | .org 0x0012
|
11 | eor r1, r1
|
12 | ldi r16, _BV (IVCE)
|
13 | out GICR, r16 ; enable change reset vector
|
14 | out GICR, r1 ; change reset vector to application
|
dann funkioniert es nicht mehr, es wird einfach der Timer1 Overflow
Vektor nicht mehr angesprungen.
Kann mir wer sagen warum das so ist?