关键词:
TriCore TC1.6.2;TC1.6.2架构手册;TC1.6.2 Interrupt System;TC3XX中断控制器;TC397架构手册;
简介:
本篇为英飞凌TC1.6.2架构手册第五章翻译 - Interrupt System
手册适用于TC3XX(包括TC397)芯片
官方架构手册下载链接:
目录
5.中断系统
TriCore
系统中,外部中断可以向CPU
或DMA
等发起中断请求,本章介绍CPU
的中断处理功能,包括中断优先级规则和中断向量表访问
5.1.概览
每个中断源都分配了唯一的中断优先级编号Service Request Priority Number (SRPN)
,接收到中断源发出的中断请求后,中断控制单元Interrupt Control Unit (ICU)
根据SRPN
对多个并发的中断请求进行投票,从而确定处理优先级,获胜中断请求的SRPN
会作为Pending Interrupt Priority Number (PIPN)
,和触发信号一起发送给CPU
,CPU
比较PIPN
和Current CPU Priority Number (CCPN)
,进而决定是否接收该中断请求,如果CPU
决定接收该中断请求,则会发送中断应答并返回当前中断的优先级编号,然后ICU
会清除发出请求的中断源
5.1.1.ICU中断控制寄存器 - ICR
ICU Interrupt Control Register(ICR)
保存当前CPU
优先级编号CCPN
、全局中断禁用/使能位IE
以及当前挂起中断的优先级编号PIPN
5.1.2.收到中断请求时CPU的操作
CPU
检查全局中断使能位ICR.IE
并比较CCPN
和PIPN
,仅当ICR.IE == 1
且PIPN > CCPN
时允许中断,条件满足时CPU
会执行中断服务程序,同时向中断源发送确认信息
下面几种情况会导致CPU
无法及时响应ICU
的中断请求:
-
全局中断被禁用:
ICR.IE == 0
-
CCPN
大于等于PIPN
-
CPU
正在执行进入中断/Trap服务程序的流程 -
CPU
正在执行不可中断的Trap
-
CPU
正在执行multi-cycle
指令 -
CPU
正在执行会修改ICR
寄存器的指令
仅当上述情况没有发生时CPU
才会响应中断
5.1.3.进入中断服务例程
当执行中断的条件满足时,执行如下步骤进入中断服务例程:
-
保存当前任务的
Upper Context
-
将返回地址
A[11]
设置为当前PC
指针:A[11] = PC
-
如果程序之前未使用中断栈(
PSW.IS = 0
),则将A[10]
设置为中断栈指针ISP
:A[10] = ISP
,然后设置栈指针标志:PSW.IS = 1
-
I/O
模式设置为Supervisor
,即使能所有权限:PSW.IO = 10B
-
将当前的保护寄存器组设置为
0
:PSW.PRS = 000B
-
清空调用深度计数器(
PSW.CDC
),同时将调用深度限制为64
:PSW.CDC = 0000000B
-
使能调用深度计数器:
PSW.CDE = 1
-
将
PSW
安全位设置为SYSCON
寄存器中预设的值:PSW.S = SYSCON.IS
-
禁用全局寄存器
A[0]
、A[1]
、A[8]
、A[9]
的写入权限:PSW.GW = 0
-
禁用中断系统:
ICR.IE = 0
,将ICR.IE
的值保存至PCXI.PIE
-
将当前
CPU
优先级编号(ICR.CCPN
)保存至先前CPU
优先级编号域(PCXI.PCPN
) -
将挂起中断优先级编号(
ICR.PIPN
)保存至当前CPU
优先级编号域(ICR.CCPN
) -
访问中断向量表,获取
ISR
的第一条指令
注意:无论是否进入中断/Trap服务例程,都会禁用全局寄存器的写入权限(PSW.GW = 0
),确保所有中断/Trap都没有受PSW
控制的寄存器的访问权限
进入中断服务例程会禁用全局中断并将当前CPU
优先级CCPN
设置为挂起中断的优先级PIPN
,用户可以重新使能全局中断并修改CCPN
从而处理某些特殊情况
ENABLE
指令可以使能中断系统,该指令会将ICR.IE
置1
,BISR
(Begin Interrupt Service Routine
)指令也可以使能中断系统,该指令会将ICR.CCPN
设置为新的值,并且保存当前任务的Lower Context
,MTCR (Move To Core Register)
指令也可以修改ICR.IE
和CCPN
ENABLE
、BISR
、DISABLE
三个指令会阻塞CPU
执行中断,直到这三个指令执行完毕,这样可以避免产生错误,并且不需要在这些指令执行后再执行一条ISYNC
(Synchronize Instruction Stream
)指令,但MTCR
指令执行完之后必须再执行一条ISYNC
指令
5.2.退出中断服务例程
RFE (Return From Exception)
指令退出中断服务例程,硬件会自动恢复Upper Context
,Upper Context
包含了PCXI
寄存器,而PCXI
寄存器中保存了之前CPU
优先级编号PCPN
和之前全局中断使能位PIE
,这两个值有如下作用:
-
将
PCXI.PCPN
写入ICR.CCPN
,恢复中断前CPU
的优先级 -
将
PCXI.PIE
写入ICR.IE
,恢复中断禁用/使能状态
完成上述步骤后继续执行原来的程序
5.3.中断向量表
中断服务例程ISR
通过中断向量表与特定优先级的中断关联,中断向量表保存了中断服务例程的入口,中断向量表存储在内存中
CPU
执行中断时根据中断优先级(ICR.PIPN
)计算中断向量的地址,然后将该地址加载至PC
指针,程序从该地址执行对应的中断服务程序,该地址为对应中断服务例程首条指令的位置,受内存所限,中断向量表一般只存储中断服务例程的部分代码,例如只存储一条跳转指令,进而引导CPU
去对应的地址执行后续的中断程序(存放在内存其他位置)
Base of Interrupt Vector Table register (BIV)
存储中断向量表的基地址,中断向量按优先级升序存储,系统预初始化阶段,使能全局中断前使用MTCR
指令初始化BIV
寄存器(该寄存器受ENDINIT
保护),系统可以存在多个中断向量表,通过修改BIV
寄存器进行切换
执行中断时,CPU
根据PIPN
和BIV
基地址计算对应中断服务例程的入口地址,中断向量表可以在32-byte
或者8-byte
两种模式间切换(通过BIV
寄存器的Vector Size Select (VSS)
位设置)
将PIPN
左移5
位(VSS=0
)或者左移3
位(VSS=1
),加上BIV
的基地址得到对应中断向量的地址,为了实现这种计算方式,需要将BIV
寄存器的[14:5](VSS=0)
位或[12:3](VSS=1)
位置0
if (BIV.VSS == 0)
ISR_Entry_PC = {BIV[31:1],1’b0} | {PIPN<<5};
else
ISR_Entry_PC = {BIV[31:1],1’b0} | {PIPN<<3};
注意:这里官方手册的图存在错误
如果ISR
很短,则可能完全被中断向量表的代码段包含,如果ISR
代码较多则可能占用多个向量空间,为了避免这种情况可以将其拆分为跳转指令和后续代码,中断向量表中的代码为一条跳转指令,具体执行逻辑存放在其他位置
因为BIV
寄存器的存在,中断向量表可以存放在可用代码段的任何位置,上电时的默认值依具体平台而定,预初始化阶段可以使用MTCR
指令修改BIV
,允许存在多个中断向量表,通过BIV
寄存器进行切换
5.4.使用TriCore中断系统
本小节展示了如何使用TriCore
的中断系统
5.4.1.跨多个优先级的中断服务例程
由于中断向量和中断源并非密切相关,因此中断向量可以横跨多个优先级(如图22
所示),如果ISR
较大导致8
个字空间无法存储,则其可以横跨多个节点,而不是使用跳转指令去其他位置执行,如果使用这种方式,则被覆盖的若干节点无法被使用(对于同一个Service Provider
)
图22
中,优先级编号3
和4
对应的两个向量被占用,因此不能使用这两个优先级编号(针对同一Service Provider
),如果Service Provider
为其他(如DMA
或CPU2
),则对于同一个中断源,仍然可以使用这两个优先级编号
这种方式会增加系统提供的优先级编号的范围,同时中断向量表的大小也需要进行对应的调整
5.4.2.中断优先级组
中断优先级组用于描述一组无法互相中断的ISR
CPU
执行中断时会禁用全局中断并将CCPN
设置为PIPN
,这会阻止后续的中断,直至使用软件再次打开中断或使用RFE
指令返回
注意:RFE
指令自动恢复ICR.IE
之前的值,该值应该为1
,否则全局中断为禁用状态
如果ISR
使能全局中断(ICR.IE=1
)但未修改CCPN
,则优先级小于CCPN
的中断还是会被阻塞,包括当前正在执行的中断(无法再次执行),高优先级的中断仍然可以执行
程序通常需要将具有相似重要性的中断请求组合在一起,以便该组中的任何中断都不能互相中断
定义中断优先级组时,可以在重新使能中断前,由中断服务例程
将CCPN
设置为该组中最大的SRPN
,如图23
所示
在图23中,优先级11~12
的中断请求组成一个中断优先级组,优先级14~17
的中断请求组成一个中断优先级组
优先级组中的任一中断执行时,都会将CCPN
设置为最大值(12
或17
),只有优先级大于该值的中断才能执行(如13
或18
)
在该示例中,中断优先级为13
的中断请求其实也相当于一个中断优先级组,将CCPN
设置为255
等同于禁用全局中断(所有中断可视为一个组)
中断优先级的灵活性很高:所有中断都为一个组、每个中断形成单独的组、介于两者之间所有可能的组合
5.4.3.利用优先级拆分ISR
可以使用优先级将ISR
拆分为多个部分,例如,ISR
的前半部分需要快速响应,则该部分的中断优先级可以较高,后半部分的优先级可以设置的较低,从而将中断服务例程拆分为两个部分
中断请求的优先级首先设置为较高的值,在中断服务例程执行的过程中,软件再次发送相同的中断并将优先级设置为较低的值,从而回到原来的用户程序(只修改了刚才执行中断的优先级),当CPU
优先级小于第二次设置的中断优先级后,再次执行刚才被挂起的中断,从而完成刚才中断程序剩余的部分
在某些情况下,中断自身的优先级较低,但是一旦该中断被执行就不能被中断,系统允许在该中断执行时,由ISR
修改中断优先级,同样的,也允许彻底结束ISR
的执行
5.4.4.具有多个优先级的中断源
某些中断的优先级不是固定的,而是取决于系统当前的情况,同一中断源可以在不同的时间,由程序设置不同的SRPN
,ISR
根据优先级可以执行不同的代码
传统的中断系统中,ISR
必须检查中断的当前优先级并执行对应的代码,这会导致响应延迟,TriCore
系统中,中断可以有多个优先级,从而在中断向量表中存在多个程序入口,因此不需要再次检查中断优先级,从而减少延迟
如果ISR
独立于中断优先级,则相应的服务程序需要放在通用的ISR
向量表中,该向量表中的每个节点都与该中断关联
注意:创建中断向量表时,必须考虑一个中断拥有多个优先级的情况
5.4.5.中断控制寄存器
中断处理需要用到两个内核特殊功能寄存器
:
-
ICR
:中断控制寄存器 -
BIV
:中断向量表基指针
ICU
中断控制寄存器ICR
保存当前CPU
优先级编号CCPN
、全局中断使能/禁用位IE
、挂起中断优先级PIPN
,根据平台的不同还会包含一个中断仲裁方案,BIV
寄存器保存了中断向量表的基地址,可以使用特定的指令使能/禁用中断系统
ICU中断控制寄存器 - ICR
-
PIPN
:Pending Interrupt Priority Number,挂起中断请求编号,该位为只读模式,其值在中断仲裁结束后由ICU
寄存器设置,标识当前挂起中断的优先级编号,若没有挂起的中断或开始执行新的中断仲裁时,设置ICR.PIPN=0
-
00
:没有挂起的中断请求 -
01
:中断挂起,优先级最低 -
...
-
FF
:中断挂起,优先级最高
-
-
IE
:Global Interrupt Enable Bit,全局中断使能位,硬件在进入/退出ISR
时自动更新该位,执行中断时将该位置0
,中断使用RFE
指令返回时将该位置1
,ENABLE
、DISABLE
、MTCR
和BISR
指令也会修改该位-
0
:禁用全局中断 -
1
:使能全局中断
-
-
CCPN
:Current CPU Priority Number,当前CPU
优先级编号,硬件在进入/退出ISR
时自动更新该位,也可以使用BISR
或MTCR
指令修改该位
中断向量表基指针 - BIV
BIV
寄存器包含中断向量表的基地址,将PIPN
左移3
位或5
位再和BIV
进行或操作得到中断向量地址,VSS
位控制左移的长度,该值决定了向量空间是8-Byte
还是32-Byte
-
BIV
:Base Address of Interrupt Vector Table,中断向量表基地址,中断向量按2
的幂对齐 -
VSS
:Vector Spacing Select,向量大小,设置一个中断向量占用的空间(8-Byte/32-Byte
)-
0
:32-Byte
-
1
:8-Byte
-