新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Codewarrior for HCS12的中斷服務(wù)程序編寫(xiě)說(shuō)明

Codewarrior for HCS12的中斷服務(wù)程序編寫(xiě)說(shuō)明

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏

在CW4.6環(huán)境下,中斷編程主要有兩種方式:

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



評(píng)論


技術(shù)專區(qū)

關(guān)閉