Codewarrior for HCS12的中斷服務(wù)程序編寫說明
在CW4.6環(huán)境下,中斷編程主要有兩種方式:
第一種是使用“interrupt”關(guān)鍵字,“interrupt”關(guān)鍵字是一個非標(biāo)準(zhǔn)ANSI-C的關(guān)鍵字,因此,它不能被所有ANSI-C編譯器廠商所支持。同樣,對不同的編譯器,interrupt”關(guān)鍵字的用法可能會改變。“interrupt”關(guān)鍵字同樣會提示編譯器下面的函數(shù)是一個中斷服務(wù)例程。
例: void interrupt 20 SCI0_ISR(void);
其中,interrupt表示該函數(shù)為終端服務(wù)程序,后面的20表示中斷號20,在這里SCI0的中斷向量號就是20.
這種方法寫起來非常簡單,但是,在S12單片機(jī)實際使用中,中斷號并沒有在手冊中給出,通常需要自己在中斷向量表中從上往下數(shù)出來,或者根據(jù)中斷向量計算得到,很容易出錯。
于是有了第二種方法:
在ISR程序之前,使用符號“#pragma TRAP_PROC”,TRAP_PROC 提示編譯器下面的函數(shù)是中斷服務(wù)例程。編譯器會用一個特殊的中斷返回指令來結(jié)束這個函數(shù)。
此時,中斷函數(shù)的書寫如下所示:
#pragma TRAP_PROC
void SCI0_ISR(void){
}
這時候編譯器不知道這個ISR指向那個中斷向量,我們需要在鏈接文件即:prm文件中指定之。
使用 VECTOR命令來實現(xiàn)中斷向量與ISR程序的連接。
例:
VECTOR 0 _Startup //這是系統(tǒng)默認(rèn)prm文件中自帶的,即復(fù)位后0號中斷即復(fù)位中斷的ISR為_Startup()
我們可以這樣寫:
VECTOR 20 SCI0_ISR //指定中斷號
或者
VECTOR ADDRESS 0xFFD6 SCI0_ISR //直接指定中斷向量地址
注:使用#pragma TRAP_PROC與修改prm文件的方法,在中斷服務(wù)子程序的結(jié)尾處必須要手動加入返回主程序的指令,包括取出堆棧、中斷返回兩個步驟。
在S12單片機(jī)中,可以寫作
asm {
}
尾注:
兩種方法所寫的中斷服務(wù)子程序必須被放在非分頁存儲區(qū)內(nèi),即non_blanked code seg.
其中一種常用的方法是在服務(wù)子程序前聲明:
//下面代碼放在NON_BANKED區(qū)
#pragma CODE_SEG NON_BANKED
在中斷程序后聲明:
//下面內(nèi)容按默認(rèn)放置
#pragma CODE_SEG DEFAULT
評論