AVR 中断 - 汇编中的复位向量处理

AVR interrupt - reset vectors handling in assembly

我正在使用 AVR ATmega16 并且我正在尝试实现一个计数秒的计数器。我正在使用 timer0 以便在重复 16 次的循环中每 1/16 秒产生一次中断。给定微处理器的频率(f=4Mhz)和预分频器值(=1024)我计算出我需要给定时器一个初始值12.

这是我在我的教科书上找到的示例代码的开头:

.include "m16def.inc"
.equ start = 12
.equ loops = 16
jmp reset
reti (x16)    ;there will be needed a total of 16 reti's in order for the next
              ;instruction to be at 0x12 = 0d18 where the jmp instruction is placed at the 
              ;overflow interrupt handling routine of timer0
jmp TIM0_OVF
reti          ;other Handlers

能否解释一下这两个 reti 命令的实际作用?它们是如何工作的?代码注释是什么意思?

*让我告诉你,在 ATmega16 上,TIMER0_OVF 向量在 program memory address = 0x12

这是ATMega16的中断向量table:

1 [=10=]0(1) RESET External Pin, Power-on Reset, Brown-out
Reset, Watchdog Reset, and JTAG AVR
Reset
2 [=10=]2 INT0 External Interrupt Request 0
3 [=10=]4 INT1 External Interrupt Request 1
4 [=10=]6 TIMER2 COMP Timer/Counter2 Compare Match
5 [=10=]8 TIMER2 OVF Timer/Counter2 Overflow
6 [=10=]A TIMER1 CAPT Timer/Counter1 Capture Event
7 [=10=]C TIMER1 COMPA Timer/Counter1 Compare Match A
8 [=10=]E TIMER1 COMPB Timer/Counter1 Compare Match B
9 0 TIMER1 OVF Timer/Counter1 Overflow
10 2 TIMER0 OVF Timer/Counter0 Overflow
11 4 SPI, STC Serial Transfer Complete
12 6 USART, RXC USART, Rx Complete
13 8 USART, UDRE USART Data Register Empty
14 A USART, TXC USART, Tx Complete
15 C ADC ADC Conversion Complete
16 E EE_RDY EEPROM Ready
17 0 ANA_COMP Analog Comparator
18 2 TWI Two-wire Serial Interface
19 4 INT2 External Interrupt Request 2
20 6 TIMER0 COMP Timer/Counter0 Compare Match
21 8 SPM_RDY Store Program Memory Ready

在您显示的代码中,第一个插槽 (RESET) 由 jmp reset 指令填充。您感兴趣的下一个空位是 TIMER0_OVF,但在 RESETTIMER0_OVF 之间有 8 个空位您应该用 东西 填充。如果您不关心处理这些中断,用 reti(来自中断的 RETurn)指令填充它们可能就足够了。

如果我们假设 reti (x16) 被该汇编程序解释为 "output 16 reti instructions",那么这将负责填充这 8 个槽。如果您想知道 "why 16 instructions for 8 slots?" - 那是因为每个插槽占用 2 words(足以容纳 jmp 指令),单个 reti 指令的大小为 1 个字。因此,您用两条 reti 指令填充每个插槽,其中第二条指令没有实际用途。