TriCore中斷向量表
由圖1可知,TriCore中的BIV寄存器(Base Interrupt Vector Table Pointer )指向中斷向量表的入口地址,中斷向量大小可設(shè)置為32或者8字節(jié),由BIV.VSS位決定。
不同優(yōu)先級中斷向量所對應(yīng)的地址,可經(jīng)下方公式計算可得。
if(BIV.VSS==1’b0) ISR_Entry_PC={BIV[31:1],1’b0}|{PIPN<<5}; else ISR_Entry_PC?=?{BIV[31:1],1’b0}?|?{PIPN<<3};

中斷定義與實現(xiàn)
使用ADS (AURIX Development Studio) 導(dǎo)入SMU_IR_Alarm工程為例,打開SMU_IR_Alarm.c可以發(fā)現(xiàn)是宏IFX_INTERRUPT(isr, vectabNum, prio)用來定義中斷處理函數(shù)IFX_INTERRUPT(ISR_SMU_Alarm, 0, ISR_PRIORITY_SMU_INT0)。
#defineIFX_INTERRUPT(isr,vectabNum,prio)IFX_INTERRUPT_INTERNAL(isr,vectabNum,prio) #defineIFX_INTERRUPT_FAST(isr,vectabNum,prio)void__interrupt_fast(prio)__vector_table(vectabNum)isr(void)
編譯后,查看MAP文件可知ISR_SMU_Alarm函數(shù)存放于0x80001a82,
Fig2
通過上面的公式計算優(yōu)先級ISR_PRIORITY_SMU_INT0(10)中斷向量的地址為0x802fe140 = 0x802fe000 |(0xa << 5) 。
在優(yōu)先級ISR_PRIORITY_SMU_INT0(10)中斷觸發(fā)后,TriCore中的PC指針會變成0x802fe140,并執(zhí)行中斷向量中的匯編指令使得PC指針跳轉(zhuǎn)到中斷函數(shù)ISR_SMU_Alarm中運行。
Fig3
CSA運行機(jī)制圖解
進(jìn)入ISR_SMU_Alarm中斷處理函數(shù)時,PCXI,F(xiàn)CX寄存器由于要保存CSA而變化如下,
Fig4 Enter Interrupt
同時CSA鏈表結(jié)構(gòu)也需相應(yīng)的調(diào)整。
Fig4 進(jìn)入中斷處理函數(shù)時的CSA鏈表
當(dāng)退出ISR_SMU_Alarm中斷處理函數(shù)后,PCXI,F(xiàn)CX寄存器會恢復(fù),如下所示,
Fig5 Exit Interrupt
CSA鏈表結(jié)構(gòu)也會跟著變化。
Fig6 退出中斷處理函數(shù)時的CSA鏈表
可以發(fā)現(xiàn)在進(jìn)入中斷處理函數(shù)后,Upper CSA和Lower CSA雙雙被保存,小編在《TriCore的CSA機(jī)制介紹》提到過Upper CSA為硬件自動保存,而Lower CSA需要開發(fā)者自己手動保存的,但是查看ISR_SMU_Alarm中斷處理函數(shù)代碼,并沒有發(fā)現(xiàn)保存Lower CSA的代碼,那到底是怎么一回事呢?
voidISR_SMU_Alarm(void) { IfxSmu_clearAlarmStatus(IfxSmu_Alarm_Software_Alarm0);/*Clearalarmstatusflag*/ IfxSmu_clearAlarmExecutedStatus(IfxSmu_AlarmExecutionStatus_irq0);/*ClearAlarmExecutionStatusregisterbit*/ IfxPort_setPinState(LED,IfxPort_State_low);/*TurnonLED(LEDislow-levelactive)*/ }
其實這跟編譯器有關(guān),在實際使用時,Tasking編譯器會為中斷和Trap自動生成svlcx保存Lower CSA,如ISR_SMU_Alarm中斷處理函數(shù)對應(yīng)的匯編指令所示。
Fig7 中斷處理函數(shù)的匯編指令
總結(jié)
在本文中,小編介紹了在ADS (AURIX Development Studio)中如何定義中斷處理函數(shù),并解釋了中斷發(fā)生時的PC指針跳轉(zhuǎn)過程和CSA鏈表結(jié)構(gòu)變化,希望對小伙伴能有所幫助,最后再提醒一下,在開發(fā)過程,針對相同CPU,避免對同一中斷優(yōu)先級定義不同的中斷處理函數(shù)。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5427瀏覽量
123709 -
中斷
+關(guān)注
關(guān)注
5文章
904瀏覽量
42581 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4374瀏覽量
64395 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71074 -
TriCore
+關(guān)注
關(guān)注
0文章
15瀏覽量
11897 -
Aurix
+關(guān)注
關(guān)注
1文章
73瀏覽量
11288
原文標(biāo)題:AURIX Development Studio中的中斷處理函數(shù)實現(xiàn)
文章出處:【微信號:MCU頻道,微信公眾號:MCU頻道】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
無法在AURIX? Development Studio中調(diào)試freeRTOS任務(wù)怎么解決?
使用Aurix Development Studio編譯總報錯的原因?怎么處理?
使用AURIX DEVELOPMENT STUDIO的debug時,呈現(xiàn)錯誤沒有找到DAS是為什么?
請問AURIX? Development Studio如何生成bin文件?
AURIX Development Studio支持在線調(diào)試自制的最小系統(tǒng)嗎?
AURIX? Development Studio使用HighTec的gcc,無法生成.map的原因?
AURIX? Development studio燒錄失敗的原因?
Aurix development studio是否支持GCC調(diào)試器?
aurix development studio無法調(diào)試,圖標(biāo)為灰色如何解決?
Aurix Development Studio的某些函數(shù)(AppInit()、 blinkLED()、 NvmInit())會阻止runShellInterface() 的執(zhí)行 ,為什么?
用aurix development studio調(diào)試代碼時,導(dǎo)致調(diào)試中斷的原因?
如何安裝AURIX? Development Studio
AURIX Development Studio的使用方法
解決ADS(AURIX Development Studio)程序下載失敗的問題

評論