AURIX Development Studio中的中断处理函数实现

电子说

1.2w人已加入

描述

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};

TriCoreFig1

 

中断定义与实现

使用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)。

 

#define IFX_INTERRUPT(isr, vectabNum, prio) IFX_INTERRUPT_INTERNAL(isr, vectabNum, prio)
#define IFX_INTERRUPT_FAST(isr, vectabNum, prio) void __interrupt_fast(prio) __vector_table(vectabNum) isr(void)

 

编译后,查看MAP文件可知ISR_SMU_Alarm函数存放于0x80001a82,

TriCoreFig2

通过上面的公式计算优先级ISR_PRIORITY_SMU_INT0(10)中断向量的地址为0x802fe140 = 0x802fe000 |(0xa << 5) 。
在优先级ISR_PRIORITY_SMU_INT0(10)中断触发后,TriCore中的PC指针会变成0x802fe140,并执行中断向量中的汇编指令使得PC指针跳转到中断函数ISR_SMU_Alarm中运行。

TriCoreFig3

CSA运行机制图解

进入ISR_SMU_Alarm中断处理函数时,PCXI,FCX寄存器由于要保存CSA而变化如下,

TriCoreFig4 Enter Interrupt

同时CSA链表结构也需相应的调整。

TriCoreFig4 进入中断处理函数时的CSA链表

当退出ISR_SMU_Alarm中断处理函数后,PCXI,FCX寄存器会恢复,如下所示,

TriCoreFig5 Exit Interrupt

CSA链表结构也会跟着变化。

TriCoreFig6 退出中断处理函数时的CSA链表

可以发现在进入中断处理函数后,Upper CSA和Lower CSA双双被保存,小编在《TriCore的CSA机制介绍》提到过Upper CSA为硬件自动保存,而Lower CSA需要开发者自己手动保存的,但是查看ISR_SMU_Alarm中断处理函数代码,并没有发现保存Lower CSA的代码,那到底是怎么一回事呢?

 

void ISR_SMU_Alarm(void)
{
    IfxSmu_clearAlarmStatus(IfxSmu_Alarm_Software_Alarm0);              /* Clear alarm status flag                  */
    IfxSmu_clearAlarmExecutedStatus(IfxSmu_AlarmExecutionStatus_irq0);  /* Clear Alarm Execution Status register bit*/

    IfxPort_setPinState(LED, IfxPort_State_low);                        /* Turn on LED (LED is low-level active)    */
}

 

其实这跟编译器有关,在实际使用时,Tasking编译器会为中断和Trap自动生成svlcx保存Lower CSA,如ISR_SMU_Alarm中断处理函数对应的汇编指令所示。

TriCoreFig7 中断处理函数的汇编指令

总结

在本文中,小编介绍了在ADS (AURIX Development Studio)中如何定义中断处理函数,并解释了中断发生时的PC指针跳转过程和CSA链表结构变化,希望对小伙伴能有所帮助,最后再提醒一下,在开发过程,针对相同CPU,避免对同一中断优先级定义不同的中断处理函数。

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分