TriCore中斷向量表
由圖1可知,TriCore中的BIV寄存器(Base Interrupt Vector Table Pointer )指向中斷向量表的入口地址,中斷向量大小可設(shè)置為32或者8字節(jié),由BIV.VSS位決定。
不同優(yōu)先級(jí)中斷向量所對(duì)應(yīng)的地址,可經(jīng)下方公式計(jì)算可得。
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};

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

評(píng)論