2016-04-22 44 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