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};
![4cbb94a4-ddec-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/90/wKgaomTnjsaAD0KtAAEVtCiNl6E803.png)
中斷定義與實現(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運行機制圖解
進入ISR_SMU_Alarm中斷處理函數(shù)時,PCXI,F(xiàn)CX寄存器由于要保存CSA而變化如下,
Fig4 Enter Interrupt
同時CSA鏈表結(jié)構(gòu)也需相應(yīng)的調(diào)整。
Fig4 進入中斷處理函數(shù)時的CSA鏈表
當退出ISR_SMU_Alarm中斷處理函數(shù)后,PCXI,F(xiàn)CX寄存器會恢復(fù),如下所示,
Fig5 Exit Interrupt
CSA鏈表結(jié)構(gòu)也會跟著變化。
Fig6 退出中斷處理函數(shù)時的CSA鏈表
可以發(fā)現(xiàn)在進入中斷處理函數(shù)后,Upper CSA和Lower CSA雙雙被保存,小編在《TriCore的CSA機制介紹》提到過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文章
5367瀏覽量
121221 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41775 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62992 -
指針
+關(guān)注
關(guān)注
1文章
481瀏覽量
70611 -
TriCore
+關(guān)注
關(guān)注
0文章
15瀏覽量
11770 -
Aurix
+關(guān)注
關(guān)注
1文章
72瀏覽量
10975
原文標題:AURIX Development Studio中的中斷處理函數(shù)實現(xiàn)
文章出處:【微信號:MCU頻道,微信公眾號:MCU頻道】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
無法在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)試,圖標為灰色如何解決?
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)程序下載失敗的問題
![解決ADS(<b class='flag-5'>AURIX</b> <b class='flag-5'>Development</b> <b class='flag-5'>Studio</b>)程序下載失敗的問題](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論