2016-04-22 28 views
1

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

回答

2

这是正确的。如果你没有启用中断,那么这不会是一个问题,只是不好的做法。通常的方法是在闪存中更高地启动程序,并使指令位于0(复位向量的位置)跳转到您的代码。这样,如果需要,可以稍后添加中断向量。

+0

当我在地址0写入代码时,除了执行复位操作并且所有I/O寄存器都清零的复位按钮,所有中断都无法工作,尽管事实上地址为0的复位不再指向复位向量? –

+0

每个矢量位于仅由4个字节长的硬件固定的位置。这只是jmp指令的足够空间。重置向量通常只是指向您的代码的开始。由于您的代码从0开始,因此不需要jmp指令。任何其他矢量都会在代码的开头附近出现,而不一定在指令的开头。 (指令可以有多种长度,而不仅仅是4个字节)。矢量对于一条指令来说很可能包含无意义的指令,每一条指令后面的“指令”也是如此。 – UncleO

+0

@AliMak:硬件复位导致所有寄存器被设置为其默认值,包括程序计数器归零。 AVR的向量表不是一个真正的向量表(它只包含地址),而是硬连线的地址跳转到中断/异常。为了“模拟”真实的矢量表,该区域通常由JMP指令填充。在具有真正的IVT(如Cortex-M)的处理器上,这不起作用;在Cortex-M的情况下,地址0000h包含初始堆栈指针值,地址0004h是开始执行的地址 - 无论是指令.. – Clifford