Embedded IVT内容通过在其上书写而过度渲染';地址

Embedded IVT内容通过在其上书写而过度渲染';地址,embedded,avr,interrupt-handling,Embedded,Avr,Interrupt Handling,在AVR中,中断向量表(IVT)从ROM中的地址0开始,如果我们将代码从.ORG 0的地址0开始,我们是否会覆盖IVT内容,然后重置,而其他中断将无法正常工作?这是正确的。如果您没有启用中断,那么这将不是一个问题,只是一个坏习惯。通常的方法是在flash中更高的位置启动程序,并使位于0(重置向量的位置)的指令跳转到代码中。这样,如果需要,您可以在以后添加中断向量。当我在地址0处编写代码时,所有中断都不工作,除了正确执行重置操作的重置按钮和所有I/O寄存器清除,尽管地址0处的重置不再指向重置向量,

在AVR中,中断向量表(IVT)从ROM中的地址0开始,如果我们将代码从.ORG 0的地址0开始,我们是否会覆盖IVT内容,然后重置,而其他中断将无法正常工作?

这是正确的。如果您没有启用中断,那么这将不是一个问题,只是一个坏习惯。通常的方法是在flash中更高的位置启动程序,并使位于0(重置向量的位置)的指令跳转到代码中。这样,如果需要,您可以在以后添加中断向量。

当我在地址0处编写代码时,所有中断都不工作,除了正确执行重置操作的重置按钮和所有I/O寄存器清除,尽管地址0处的重置不再指向重置向量,但它是如何工作的?每个向量位于硬件固定的位置,该位置只有4字节长。这对于一条jmp指令来说仅仅是足够的空间。重置向量通常只指向代码的开头。由于代码从0开始,因此不需要jmp指令。任何其他向量都将位于代码开头附近的某个点,也不一定位于指令的开头。(指令可以有不同的长度,而不仅仅是4个字节。)向量很可能包含指令的无意义,后面的每一条“指令”也一样。@AliMak:硬件重置会导致所有寄存器设置为默认值,包括程序计数器设置为零。AVR的向量表不是真正的向量表(只包含地址),而是在中断/异常时跳转到的硬连线地址。为了“模拟”真正的向量表,该区域通常填充JMP指令。在Cortex-M等具有真正IVT的处理器上,这将不起作用;在Cortex-M的情况下,地址0000h包含初始堆栈指针值,地址0004h包含开始执行的地址-指令都不是。。