Assembly AVR中断-组件中的重置向量处理

Assembly AVR中断-组件中的重置向量处理,assembly,timer,interrupt,reset,avr,Assembly,Timer,Interrupt,Reset,Avr,我正在使用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

我正在使用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上,
定时器0_OVF
向量位于
程序内存地址=0x12

这是ATmega16的中断向量表:

1 $000(1) RESET External Pin, Power-on Reset, Brown-out
Reset, Watchdog Reset, and JTAG AVR
Reset
2 $002 INT0 External Interrupt Request 0
3 $004 INT1 External Interrupt Request 1
4 $006 TIMER2 COMP Timer/Counter2 Compare Match
5 $008 TIMER2 OVF Timer/Counter2 Overflow
6 $00A TIMER1 CAPT Timer/Counter1 Capture Event
7 $00C TIMER1 COMPA Timer/Counter1 Compare Match A
8 $00E TIMER1 COMPB Timer/Counter1 Compare Match B
9 $010 TIMER1 OVF Timer/Counter1 Overflow
10 $012 TIMER0 OVF Timer/Counter0 Overflow
11 $014 SPI, STC Serial Transfer Complete
12 $016 USART, RXC USART, Rx Complete
13 $018 USART, UDRE USART Data Register Empty
14 $01A USART, TXC USART, Tx Complete
15 $01C ADC ADC Conversion Complete
16 $01E EE_RDY EEPROM Ready
17 $020 ANA_COMP Analog Comparator
18 $022 TWI Two-wire Serial Interface
19 $024 INT2 External Interrupt Request 2
20 $026 TIMER0 COMP Timer/Counter0 Compare Match
21 $028 SPM_RDY Store Program Memory Ready
在您显示的代码中,第一个插槽(
RESET
)由
jmp RESET
指令填充。您感兴趣的下一个插槽是
TIMER0\u OVF
,但是在
RESET
TIMER0\u OVF
之间有8个插槽您应该填充一些内容。如果您不关心如何处理这些中断,用
reti
(中断返回)指令填充它们可能就足够了


如果我们假设此汇编程序将
reti(x16)
解释为“输出16
reti
指令”,那么这将负责填充这8个插槽。如果您想知道“为什么8个插槽有16条指令?”-这是因为每个插槽占用2个字(足以容纳
jmp
指令),而单个
reti
指令的大小是1个字。因此,用两条
reti
指令填充每个插槽,第二条指令没有实际用途。

如果我们假设
reti(x16)
意味着“输出16条
reti
指令”,那么它的目的是用某种东西填充
RESET
TIMER0\u OVF
之间的所有中断向量插槽。如果你不关心如何处理这些中断,那么在每个插槽中放置一个
reti
似乎是个好主意,因为它只意味着“从中断中返回”。哇!这一切都有道理。谢谢。如果你愿意的话,你可以把它作为答案贴出来,以便我接受。非常感谢。