gcc-avr中中斷的寫法

springb發表於2008-12-16

Interrupts 和 Signals
詳細描述
很難找到在如何處理中斷方面達成一致的編譯器,直到C語言試著隔離硬體相關的細節,編譯器的作者才不得不設計他們自己處理中斷的方法。
在AVR_GCC環境中,向量表已經使用預先定義好的名字來標誌中斷(interrupt)路由(routines),你即使不定義也可以使用他們。
但是定義(patching)向量表只是解決這個問題的一部分。一般來說,編譯器在正常執行編譯器生成(compiler-generated)的程式碼時使用一組暫存器。這些暫存器就像狀態暫存器一樣是很重要的哦。另外我們要做的事情就是用"__attribute__((interrupt))來標記中斷處理函式。
這些細節看起來使中斷處理有一些混亂,但是所有的這些細都是被中斷API(Interrupt API)處理的。有兩個宏用來定義中斷處理函式,INTERRUPT()和SIGNAL()。這些宏用來標記你的程式碼為一箇中斷處程式,下面的例子定義了一個ADC中斷的處理程式(handler)。
#include
INTERRUPT(SIG_ADC)
{
//user code here
}
如果一個未預期的中斷產生了(終端已經產生,但是沒有對應的處理程式,通常屬於BUG),那麼預設的行為則是跳轉到reset區復位裝置。也可以用一個名為__vector_default的方法過載(override)這種處理模式,既可以用SIGNAL()宏也可以用INTERRUPT()宏定義它。
#include
SIGNAL(__vector_default)
{
/user code here
}
再下面的內容我就不翻譯了!

英文原文:


現在用的是Atmega64。中斷向量表定義在iom64.h檔案內。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/163295/viewspace-1014786/,如需轉載,請註明出處,否則將追究法律責任。

相關文章