1.功能概述
IR(Interrupt Router)将外部、内部和软件触发的中断分配给CPU或者DMA;在英飞凌中,中断触发方叫做Service requests,CPU和DMA叫做Service Provide;
每一个中断都和一个特定的服务请求节点(Serivice Request Node\SRN)关联,这与ARM、瑞萨自研的核有一些不同。
中断请求与SRN关联,每个SRN可以通过ICU将路由给CPU或者DMA;
根据芯片手册,TC3xx支持1024个中断请求,优先级0-255,数字越大优先级越高;详细细节具体如下:
除了SRN之外,每个CPU有8个通用服务请求(Genearl Purpose Service Requests)(GPSR),可以用作软件中断(不分配给外围设备或外部中断),使用SRB(Service Request Broadcast registers)可以将软中断同时路由给多个Service Providers。
SRN包含一个SRC(Service Request Control Register),用于配置中断请求:优先级,分发给某个CPU或者DMA;每个SRN都和所有ICU关联,ICU会处理中断优先级仲裁。
2.具体功能描述
2.1 SRN_SRC
本节,我们主要讨论SRN最关键的寄存器SRC。每个SRC的格式都相同,如下:
SRPN -- Service Request Priority Number,相同service provider中该请求的优先级,0--FF
SRE -- Service Request Enable
TOS -- Type of service,将该服务请求路由给目标provider,000 -- 111分别对应 CPU0\DMA\CPU1\2\3\4\5
从芯片手册可以看到,SRC共有1024个,对应1024个中断源配置, 意味着我们在配置中断时,首先需要找到的就是对应SRC,例如现想配置CAN0的一个发送中断,那么对应的SRC如下:
那么就要对该寄存器进行配置,代码如下:
SRC_CAN_CAN0_INT0.SRPN = 10; //该请求的优先级
SRC_CAN_CAN0_INT0.TOS = 0;//路由给CPU0处理
2.2 ICU(Interrupt Control Unit)
每个service provider都对应一个ICU模块。ICU主要作用为
对路由到相同provider的中断请求进行仲裁,并将竞争胜利的中断请求发给provider
接收provider的中断请求接收信号
检查中断请求的ECC
路由完整性错误给SMU
管理已知中断请求的清理
每个ICU比较核心寄存器如下:
只读:LWSR(Lastest Winning Service Request)和LASR(Last Acknowledged service request)
读写:ECR
LWSR:上次仲裁胜者请求的信息,提供给provider
LASR:被provider确认的最近一个中断请求
ECR:Error Capture Register
2.3 GPSR
GPSR仅用于软件中断,因为他们没有和任何硬件中断触发事件挂钩,其内部结构如下:
其用法是通过给SPB(Service Request Boradcast)写入1到对应位,可以同时将中断请求分发给SRC_GPSR,然后配置GPSR.TOS就可以实现将软中断路由给不同provider。
2.4 仲裁机制
ICU通过SPRN来决定并发的中断请求优先级,然后将胜者作为PIPN(Pending Interrupt Priority Number)和触发源一同发给CPU或者DMA,CPU拿到后通过和CCPN(Current CPU Priority Number)比较,最终决定接收优先级高的中断请求,CPU把接收的中断信息返回给ICU,ICU清除请求中断源
2.5 CPU对于中断请求操作
CPU通过ICU interrupt Control Register(ICR)来控制中断请求,其结构如下:
当CPU接收中断请求后,需要如下动作:
保存当前task的上文;
将当前PC保存到A[11](return address)
如果当前处理器之前没有使用中断栈(PSW.IS = 0),A[10](SP)指向ISP(Interrupt stack pointer),然后设置PSW.IS = 1
此时I.O模式切换到supervisor模式
清除当前调用深度:
关闭全局中断 ICR.IE = 0
将ICR.CCPN保存至PCXI.PCPN,将ICR.PIPN保存至ICR.CCPN
访问ISR的中断向量表
当完成中断处理时,硬件自动恢复上下文,PCXI.PCPN写入ICR.CCPN,PCXI.PIR写入ICR.IE
2.6 中断向量表
中断向量表是由多个ISR入口点组成的一个数组,存放在内存中;
当CPU接收中断后,会根据ICP.PIPN计算当前中断的地址,该地址会加载至PC;CPU从该地址开始执行指令,根据中断函数的代码量,确定是跳转到内存其他位置还是就在表中进行处理。
BIV(Base of interrupt vector table)存储这中断向量表的基地址,中断向量按照优先级顺序排布,在使能中断时,使用MTCR指令可以修改BIV;因此可以通过修改BIV来管理多个中断向量表;
中断函数地址计算如下:
3.代码解析
中断entry地址存放在一个数组中,其软件写法有如下几种模式:
void (*isr_pointer_arr[256])(void)
void (**isr)(void) = isr_pointer_arr
void irqInstall(long int SRNprio, long int addr){*isr_pointer_arr[SRNprio] = addr}
isr [__mfcr(ICR&0xFF)]{}
IFX_INTERRUPT(GPT12_T4_Int0_Handler, 0, ISR_PRIORITY_GPT12_T4_INT)
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/djkeyzx/article/details/129924835
|