TriCore中斷向量表
由圖1可知,TriCore中的BIV寄存器(Base Interrupt Vector Table Pointer )指向中斷向量表的入口地址,中斷向量大小可設置為32或者8字節,由BIV.VSS位決定。
不同優先級中斷向量所對應的地址,可經下方公式計算可得。
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)
中斷定義與實現
使用ADS (AURIX Development Studio) 導入SMU_IR_Alarm工程為例,打開SMU_IR_Alarm.c可以發現是宏IFX_INTERRUPT(isr, vectabNum, prio)用來定義中斷處理函數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函數存放于0x80001a82,
Fig2
通過上面的公式計算優先級ISR_PRIORITY_SMU_INT0(10)中斷向量的地址為0x802fe140 = 0x802fe000 |(0xa << 5) 。
在優先級ISR_PRIORITY_SMU_INT0(10)中斷觸發后,TriCore中的PC指針會變成0x802fe140,并執行中斷向量中的匯編指令使得PC指針跳轉到中斷函數ISR_SMU_Alarm中運行。
Fig3
CSA運行機制圖解
進入ISR_SMU_Alarm中斷處理函數時,PCXI,FCX寄存器由于要保存CSA而變化如下,
Fig4 Enter Interrupt
同時CSA鏈表結構也需相應的調整。
Fig4 進入中斷處理函數時的CSA鏈表
當退出ISR_SMU_Alarm中斷處理函數后,PCXI,FCX寄存器會恢復,如下所示,
Fig5 Exit Interrupt
CSA鏈表結構也會跟著變化。
Fig6 退出中斷處理函數時的CSA鏈表
可以發現在進入中斷處理函數后,Upper CSA和Lower CSA雙雙被保存,小編在《TriCore的CSA機制介紹》提到過Upper CSA為硬件自動保存,而Lower CSA需要開發者自己手動保存的,但是查看ISR_SMU_Alarm中斷處理函數代碼,并沒有發現保存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)*/ }
其實這跟編譯器有關,在實際使用時,Tasking編譯器會為中斷和Trap自動生成svlcx保存Lower CSA,如ISR_SMU_Alarm中斷處理函數對應的匯編指令所示。
Fig7 中斷處理函數的匯編指令
總結
在本文中,小編介紹了在ADS (AURIX Development Studio)中如何定義中斷處理函數,并解釋了中斷發生時的PC指針跳轉過程和CSA鏈表結構變化,希望對小伙伴能有所幫助,最后再提醒一下,在開發過程,針對相同CPU,避免對同一中斷優先級定義不同的中斷處理函數。
審核編輯:湯梓紅
-
寄存器
+關注
關注
31文章
5363瀏覽量
121194 -
中斷
+關注
關注
5文章
900瀏覽量
41758 -
函數
+關注
關注
3文章
4346瀏覽量
62978 -
指針
+關注
關注
1文章
481瀏覽量
70611 -
TriCore
+關注
關注
0文章
15瀏覽量
11768 -
Aurix
+關注
關注
1文章
71瀏覽量
10966
原文標題:AURIX Development Studio中的中斷處理函數實現
文章出處:【微信號:MCU頻道,微信公眾號:MCU頻道】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
無法在AURIX? Development Studio中調試freeRTOS任務怎么解決?
使用Aurix Development Studio編譯總報錯的原因?怎么處理?
使用AURIX DEVELOPMENT STUDIO的debug時,呈現錯誤沒有找到DAS是為什么?
AURIX Development Studio支持在線調試自制的最小系統嗎?
AURIX? Development Studio使用HighTec的gcc,無法生成.map的原因?
AURIX? Development studio燒錄失敗的原因?
Aurix development studio是否支持GCC調試器?
aurix development studio無法調試,圖標為灰色如何解決?
Aurix Development Studio的某些函數(AppInit()、 blinkLED()、 NvmInit())會阻止runShellInterface() 的執行 ,為什么?
用aurix development studio調試代碼時,導致調試中斷的原因?
如何安裝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)
評論