Atmel Studio 覆盖中断向量



我需要覆盖从 爱特梅尔工作室。谁能帮我解决这个问题?

使用 Atmel Studio 生成的中断代码进行更新。

00000000 <__vectors>:
0:   0c 94 34 00     jmp 0x68    ; 0x68 <__ctors_end>
4:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
8:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
10:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
14:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
18:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
1c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
20:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
24:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
28:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
2c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
30:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
34:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
38:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
3c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
40:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
44:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
48:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
4c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
50:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
54:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
58:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
5c:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
60:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
64:   0c 94 3e 00     jmp 0x7c    ; 0x7c <__bad_interrupt>
00000068 <__ctors_end>:
68:   11 24           eor r1, r1
6a:   1f be           out 0x3f, r1    ; 63
6c:   cf ef           ldi r28, 0xFF   ; 255
6e:   d8 e0           ldi r29, 0x08   ; 8
70:   de bf           out 0x3e, r29   ; 62
72:   cd bf           out 0x3d, r28   ; 61
74:   0e 94 44 00     call    0x88    ; 0x88 <main>
78:   0c 94 47 00     jmp 0x8e    ; 0x8e <_exit>
0000007c <__bad_interrupt>:
7c:   0c 94 00 00     jmp 0   ; 0x0 <__vectors>

更新寄存器中断

void (*fnVectors[NUM_INTERRUPTS])(void);
void IntRegister(unsigned int intrNum, void (*fnHandler)(void))
{
/* Assign ISR */
fnVectors[intrNum] = fnHandler;
}

这些在 avr-libc 中使用弱符号链接;您需要的是使用 ISR 宏声明您自己的 ISR。例如,请参阅 avr-libc 中断文档。

gcrt1 的实际源代码。S 使用宏,该宏扩展到跳转到__vector_4等符号,并将该名称弱定义为等于 __bad_interrupt。如果定义此类例程(ISR 宏可帮助您执行此操作(,则会忽略弱定义。同样的gcrt1。S文件为每个不同的MCU组装,创建文件,如crtatmega168.o。如果您用avr-objdump -xd检查其中一个,您会发现弱引用:

SYMBOL TABLE:
...
00000000  w      .init0 00000000 __init
00000000  w      .text  00000000 __vector_1
00000000 g       .text  00000000 __bad_interrupt
...
00000000 <__vectors>:
0:   0c 94 00 00     jmp     0       ; 0x0 <__vectors>
0: R_AVR_CALL   __init
4:   0c 94 00 00     jmp     0       ; 0x0 <__vectors>
4: R_AVR_CALL   __vector_1

最新更新