【Aurix/Tricore实验分享五 - Interrupt知识篇】

简介:在一个TriCore™ 系统中,诸如外围设备或外部中断之类的多个源可以生成中断请求以中断诸如CPU或DMA通道之类的服务提供者。本章介绍CPU的中断处理能力,包括中断优先级方案和对矢量表的访问。

1、通用操作

每个中断源都被分配了一个唯一的中断优先级编号,称为服务请求优先级编号(SRPN)。在接收到来自中断源的中断请求时,中断控制单元(ICU)使用SRPN在多个并发中断请求之间进行优先级排序。获胜请求的SRPN与请求触发器一起作为未决中断优先级号(PIPN)提供给CPU。CPU通过将PIPN与其当前CPU优先级(CCPN)进行比较来决定是否接受请求的中断。如果CPU决定接受请求的中断,它将以中断确认进行响应,并返回所采取中断的优先级。然后,ICU将清除请求中断源。

1.1、ICU中断控制寄存器(ICR)

ICU中断控制寄存器(ICR)保存当前CPU优先级号(CCPN)、全局中断启用/禁用位(IE)和当前挂起中断优先级号(PIPN)。

1.2、中断请求时CPU动作

CPU检查全局中断使能位ICR的状态。并且比较当前CPU优先级编号ICR.CCPN反对PIPN。只有当ICR.IE==1并且PIPN大于CCPN。如果这是真的,则CPU可以进入服务例程。PIPN用于确定中断矢量表的入口点,并确认ICU,ICU又将确认发送回挂起的中断请求。有几种情况可能会阻止CPU立即响应ICU生成的中断请求。这些是:

  • 中断系统被全局禁用(ICR.IE==0)。
  • 当前CPU优先级(CCPN)等于或高于挂起中断优先级(PIPN)。
  • CPU正在进入中断或陷阱服务例程。
  • CPU在不可中断的陷阱服务上运行。
  • CPU正在执行多周期指令。
  • CPU正在执行一条修改ICR的指令。

只有当这些条件不再成立时,CPU才会响应中断请求。

1.3、进入中断服务例程(ISR)

当CPU为中断请求提供服务的所有条件都清除时,执行以下操作以进入中断服务例程(ISR):

  • 保存当前任务的上文。
  • 返回地址(A[11])随当前PC更新。
  • 如果处理器以前没有使用中断堆栈(PSW.IS=0),则A[10]堆栈指针设置为
    中断堆栈指针(ISP)。然后设置堆栈指针位以使用中断堆栈:PSW.IS=1。
  • I/O模式设置为Supervisor模式,这意味着所有权限都已启用:PSW.IO=10B。
  • 当前保护寄存器集设置为0:PSW.PRS=000B。
  • 调用深度计数器(PSW.CDC)被清除,调用深度限制选择器设置为64:
    PSW.CDC=0000000 b。
  • 调用深度计数器已启用,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的第一条指令。

注意:每当输入中断服务例程或陷阱处理程序时,全局寄存器写入权限将被禁用(PSW.GW==0)。这确保了所有陷阱和中断都必须假设它们没有对PSW控制的寄存器的写访问权限。默认情况下为GW。
进入中断服务程序时,中断系统全局禁用,当前CPU优先级(CCPN)设置为正在服务的中断的优先级(PIPN)。由用户再次启用中断系统,并可选择地修改优先级编号CCPN,以实现中断优先级或处理特殊情况。请参阅第5页的“使用TriCore中断系统”。
中断系统可以通过ENABLE指令启用。ENABLE设置ICR.IE=1(中断系统已启用)。BISR(开始中断服务例程)指令还启用中断系统,设置ICR.CCPN设置为新值,并保存中断任务的下文。中断使能位(ICR.IE)和当前CPU优先级(ICR.CCPN)也可以使用MTCR(移动到核心寄存器)指令进行修改。
ENABLE、BISR和DISABLE(禁用中断)指令都被执行,使得CPU被阻止接受中断请求,直到指令完全完成。这避免了流水线的副作用,并消除了对遵循这些指令的ISYNC(同步指令流)的需要。MTCR是一个例外,后面必须跟一条ISYNC指令。

2、中断服务例程退出(ISR)

当ISR带着RFE(从异常返回)指令退出时,硬件会自动恢复上文。上文包括PCXI寄存器,该寄存器保存先前CPU优先级号(PCPN)和先前全局中断使能位(PIE)。这些相应位中的值使用如下:

  • PCXI.PCPN写入ICR.CCPN将CPU优先级设置为中断前的值。
  • PCXI.PIE是写给ICR.IE来恢复此位的状态。
    被中断的例行程序随后继续。

3、中断向量表

中断服务例程通过中断矢量表与具有特定优先级的中断相关联。中断矢量表是一组中断服务例程(ISR)入口点。中断矢量表存储在存储器中。
当CPU接受中断时,它会在中断矢量表中计算与中断优先级相对应的地址(ICR.PIPN位字段)。此地址加载在程序计数器中。CPU开始在中断矢量表中的这个地址执行指令。此地址的代码是所选中断服务例程(ISR)的开始。根据ISR的代码大小,中断向量表可能只存储ISR的初始部分,例如将CPU引导到内存中其他位置的ISR的其余部分的跳转指令。
中断矢量表基极寄存器(BIV)存储中断矢量表的基极地址。中断矢量在表中通过增加优先级进行排序。在系统初始化阶段(BIV受ENDINIT保护),在启用中断之前,可以使用MTCR指令修改BIV寄存器。通过这种安排,可以有多个中断矢量表,并通过改变BIV寄存器的内容在它们之间切换。
当中断时,CPU根据PIPN和BIV寄存器的内容计算适当的中断服务例程的入口点。两种矢量表配置可用,矢量之间的间隔为32字节到8字节。间距由BIV寄存器的矢量大小选择(VSS)位选择。
为了生成进入中断矢量表的指针,PIPN被左移五位(VSS=0)或三位(VSS_1),并与BIV寄存器中的地址进行“或”运算,以生成进入中断向量表的指针。
ISR的执行从此地址开始。由于此操作,建议将寄存器BIV的位[14:5](VSS=0)或位[12:3](VSS=1)设置为0。

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

如果中断处理程序很短,它可能完全适合矢量代码段中可用的字。否则,存储在条目位置的代码可以跨越多个矢量条目,或者应该包含一些初始指令,然后跳转到处理程序的其余部分。请参阅第5页的“跨越矢量条目的扩展中断服务例程”
在这里插入图片描述
BIV寄存器允许中断矢量表位于可用代码存储器中的任何位置。通电时的默认设置是特定于实现的。在系统的初始化阶段,在启用中断之前,可以使用MTCR指令写入BIV寄存器。也可以有多个中断矢量表,并通过修改BIV寄存器的内容在它们之间切换。

4、使用TriCore中断系统

以下部分包含示例,说明如何使用TriCore体系结构灵活的中断系统来解决典型和特殊的应用程序需求。

4.1、跨矢量条目的跨越中断服务例程

因为矢量条目不与中断源绑定,所以很容易跨越矢量条目位置的中断服务例程(ISR),如图22第3页所示。如果不适合条目位置之间的可用八个字,则生成消除了跳转到中断处理程序其余部分的需要。
请注意,与跨域服务例程占用的条目相关的优先级号不得用于向同一服务提供商请求服务的任何活动服务请求节点(SRN)。
在图22第3页中,矢量位置3和4通过条目2的服务例程来覆盖。因此,这些号码不能分配给请求CPU服务的SRN,尽管它们可以用于请求另一个服务提供商。下一个可用的矢量条目现在是条目5。使用这种技术增加了给定系统中所需的优先级范围,但矢量表的大小必须相应调整。

4.2、中断优先级组

中断优先级组描述了一组不能中断彼此服务例程的中断。使用TriCore中断系统架构可以轻松创建这些组。
当CPU启动中断服务时,中断系统被全局禁用,并且CPU优先级CCPN被设置为正在服务的中断的优先级。这会阻止所有进一步的中断被服务,直到中断系统通过软件再次启用,或者服务例程用RFE(从异常返回)指令终止。
注意:RFE指令会自动重新安装ICR.IE位以前的状态。这将是一个(ICE.IE=1),否则该中断将不会得到服务。
当中断服务例程(ISR)软件通过设置ICR.IE再次启用中断系统时而不改变CCPN,其效果是具有与CCPN相同或更低优先级的所有中断请求仍然被阻止提供服务。这包括当前中断的重新出现;即它不能中断该服务。
但是,此ISR将被优先级高于CCPN的每个请求中断。一个潜在的问题(在TriCore体系结构中很容易克服)是,应用程序需求通常要求将具有类似意义的中断请求分组在一起,使得该组中的任何请求都不能中断同一组中另一个成员的ISR。
创建这些中断优先级组很容易在中断系统中完成。对于定义的一组中断请求,在再次启用中断系统之前,其各自服务例程的软件将CCPN设置为该组中使用的最高SRPN的数量。图23显示了一个示例。
在这里插入图片描述
优先级为11和12的中断请求形成一组,而优先级为14至17的请求形成另一组。每次服务第一组中的一个中断时,在重新启用中断系统之前,服务例程将CCPN设置为12,即该组中的最高数字。
每次服务第二组中的一个中断时,在重新启用中断系统之前,服务例程将CCPN设置为17。例如,如果中断14被服务,则它只能被优先级高于17的请求中断,而不能通过来自它自己的优先级组的请求或优先级较低的请求中断。
人们可以看到这个系统的灵活性及其相对于具有固定优先级的系统的优势。在上面的例子中,优先级为13的中断请求形成了自己的单个成员“组”。在每个服务例程中将CCPN设置为最大数255具有与不再启用中断系统相同的效果;即所有中断请求可以被认为在一个组中。
中断优先级的灵活性范围从一组中的所有中断到构建自己组的每个中断请求,以及其间的所有可能组合。

4.3、将ISR划分为不同的优先级

中断服务例程可以很容易地划分为具有不同优先级的部分。例如,中断被置于非常高的优先级,因为对事件的响应时间和反应至关重要,但该服务例程中的进一步操作可以以较低的优先级运行。在这种情况下,服务例程将分为两部分,一部分包含关键操作,另一部分包含不太关键的操作。
首先将中断节点的优先级设置为高优先级,以便在发生中断时立即执行必要的操作。然后降低该中断的优先级,并且在仍处于服务例程中时通过软件再次设置中断请求位(指示未决中断)。返回到中断的程序终止高优先级服务程序。当CPU优先级低于其自身的优先级时,将为未决中断提供服务。在进入服务程序(现在位于程序存储器中的不同地址)之后,执行中断的未决但低优先级的动作。
在其他情况下,服务请求的优先级可能较低,因为对事件的响应时间并不关键,但一旦授予服务,就不应中断。为了防止任何中断,TriCore体系结构允许在ISR内提高服务请求的优先级,还允许完全禁用中断。

4.4、相同中断源使用不同的优先级

对于某些应用程序,中断请求相对于其他请求的优先级不是固定的,而是取决于系统中的当前情况。这可以简单地通过根据应用程序的需要在不同的时间向中断源分配不同的服务请求优先级号(SRPN)来实现。通常,该中断的ISR根据其优先级执行不同的代码。
在传统的中断系统中,ISR必须检查该中断请求的当前优先级,并执行到适当代码段的分支,从而导致对请求的响应延迟。然而,在TriCore系统中,中断将自动具有不同优先级的不同矢量条目。ISR中不需要额外的检查和分支,因此减少了中断延迟。如果ISR独立于中断的优先级,则需要将分支放置到该中断的每个矢量条目上的通用ISR代码。
注意:在创建矢量表时,必须考虑对一个中断使用不同的优先级。

4.5、中断控制寄存器

两个CSFR支持中断处理:

  • ICR:中断控制寄存器第8页
  • BIV:基本中断矢量表指针第10页

ICR保存当前CPU优先级号(CCPN)、中断系统的启用/禁用位(IE)、未决中断优先级号(PIPN)以及中断仲裁方案的实施特定控制。BIV寄存器保存中断矢量表的基址。特殊指令控制中断系统的启用和禁用。有关更多信息,请参阅第1页的“中断系统”。

4.5.1、ICU中断控制寄存器(ICR)

ICU中断控制寄存器定义如下:
在这里插入图片描述
在这里插入图片描述

4.5.2、基本中断矢量表指针(BIV)

BIV寄存器包含中断矢量表的基址。当一个中断被接受时,进入中断矢量表的入口地址由该中断的优先级号(取自PIPN)生成,左移三或五位,然后与BIV寄存器的内容进行“或”运算。中断优先级号的左移导致矢量表中的各个条目之间的间隔为8字节或32字节,这取决于VSS位所选择的矢量间隔。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值