Atmel Studio 覆盖中断向量
Atmel Studio override interrupt vector
我需要覆盖自动生成的中断向量
爱特梅尔工作室。谁能帮我解决这个问题?
使用 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。例如参见 [=12=]。
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
我需要覆盖自动生成的中断向量 爱特梅尔工作室。谁能帮我解决这个问题?
使用 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。例如参见 [=12=]。
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