tricore architecture - Trap System

Trap System

陷阱(Trap)是由于某些事件触发的,例如 不可屏蔽中断(NMI)、指令异常、内存管理异常或非法访问。陷阱始终处于使能状态,无法通过软件操作禁用。

1 陷阱类型

TriCore 架构定义了 八种陷阱类别。每个类别都有各自的 陷阱处理程序,可通过 32 字节 的陷阱向量条目访问,并由 硬件定义的陷阱类别编号 进行索引。在每个类别中,具体的陷阱由 陷阱识别号(TIN,Trap Identification Number) 进行区分,Trap发生时,该编号由硬件加载到 D[15] 寄存器,然后执行陷阱处理程序的第一条指令。陷阱处理程序必须检查 D[15] 的值,并根据其分支到对应的子处理程序来处理特定的 TIN。

此外,陷阱可以进一步分类:

  • 同步(Synchronous)或异步(Asynchronous)
  • 硬件触发(Hardware)或软件触发(Software)

支持的 Trap 类型汇总:

  • Class 0 — MMU:

    • TIN = 0 : VAF(同步、硬件触发),Virtual Address Fill
    • TIN = 1 : VAF(同步、硬件触发),Virtual Address Protection
  • Class 1 — Internal Protection Traps:

    • TIN = 1 : PRIV(同步、硬件触发),Privileged Instruction.
    • TIN = 2 : MPR(同步、硬件触发),Memory Protection Read.
    • TIN = 3 : MPW(同步、硬件触发),Memory Protection Write.
    • TIN = 4 : MPX(同步、硬件触发),Memory Protection Execution.
    • TIN = 5 : MPP(同步、硬件触发),Memory Protection Peripheral Access.
    • TIN = 6 : MPN(同步、硬件触发),Memory Protection Null Address.
    • TIN = 7 : GRWP(同步、硬件触发),Global Register Write Protection.
  • Class 2 — Instruction Errors:

    • TIN = 1 : IOPC(同步、硬件触发),Illegal Opcode.
    • TIN = 2 : UOPC(同步、硬件触发),Unimplemented Opcode.
    • TIN = 3 : OPD(同步、硬件触发),Invalid Operand specification.
    • TIN = 4 : ALN(同步、硬件触发),Data Address Alignment.
    • TIN = 5 : MEM(同步、硬件触发),Invalid Local Memory Address
  • Class 3 — Context Management:

    • TIN = 1 : FCD(同步、硬件触发),Free Context List Depletion (FCX = LCX)
    • TIN = 2 : CDO(同步、硬件触发),Call Depth Overflow.
    • TIN = 3 : CDU(同步、硬件触发),Call Depth Underflow.
    • TIN = 4 : FCU(同步、硬件触发),Free Context List Underflow (FCX = 0).
    • TIN = 5 : CSU(同步、硬件触发),Call Stack Underflow (PCX = 0).
    • TIN = 6 : CTYP(同步、硬件触发),Context Type (PCXI.UL wrong).
    • TIN = 7 : NEST(同步、硬件触发),Nesting Error: RFE with non-zero call depth.
  • Class 4 — System Bus and Peripheral Errors:

    • TIN = 1 : PSE(同步、硬件触发),Program Fetch Synchronous Error.
    • TIN = 2 : DSE(同步、硬件触发),Data Access Synchronous Error.
    • TIN = 3 : DAE(异步、硬件触发),Data Access Asynchronous Error.
    • TIN = 4 : CAE(异步、硬件触发),Coprocessor Trap Asynchronous Error.
    • TIN = 5 : PIE(同步、硬件触发),Program Memory Integrity Error.
    • TIN = 6 : DIE(异步、硬件触发),Data Memory Integrity Error.
    • TIN = 7 : TAE(异步、硬件触发),Temporal Asynchronous Error
  • Class 5— Assertion Traps:

    • TIN = 1 : OVF(同步、软件触发),Arithmetic Overflow.
    • TIN = 2 : SOVF(同步、软件触发),Sticky Arithmetic Overflow
  • Class 6 — System Call

    • TIN = X : SYS(同步、软件触发),System Call。TIN 取自 SYSCALL 指令中指定的立即数常量[0-255]。
  • Class 7 — Non-Maskable Interrupt

    • TIN = 1 : NMI(异步、硬件触发),Non-Maskable Interrupt.

1.1 同步陷阱(Synchronous Traps)

同步陷阱与特定指令的执行或尝试执行相关,或者与访问需要内存管理系统介入的虚拟地址相关。触发陷阱的指令是精确可识别的。陷阱会立即触发,并且在处理完成之前,执行不会继续超出该指令。

1.2 异步陷阱(Asynchronous Traps)

异步陷阱类似于中断,因为它们与外部检测到的硬件条件相关,并且会反馈到 CPU 。
有些异步陷阱是间接由先前执行的指令导致的,但与这些指令的直接关联已经丢失。
其它异步陷阱,例如不可屏蔽中断(NMI),属于外部事件。
异步陷阱与中断的区别在于:它们通过陷阱向量而不是中断向量进行路由。它们不能被屏蔽,并且不会改变当前 CPU 的中断优先级。

1.3 硬件陷阱(Hardware Traps)

硬件陷阱是由硬件检测到的异常条件触发的。在大多数情况下,这些异常条件与尝试执行某个指令相关。常见的例子包括非法指令陷阱、内存保护陷阱和数据内存未对齐陷阱。

1.4 软件陷阱(Software Traps)

软件陷阱是执行系统调用或断言指令的有意结果。受支持的断言指令包括TRAPV(溢出陷阱)和TRAPSV(粘性溢出陷阱)。系统调用由SYSCALL 指令触发。

1.5 不可恢复的陷阱(Unrecoverable Traps)

不可恢复的陷阱是软件无法恢复的错误,即触发陷阱的任务无法简单地重新启动。 在 TriCore 体系结构中,FCU(一个致命上下文异常)是一种不可恢复的错误。

2 陷阱处理(Trap Handling)

陷阱处理机制对陷阱采取的操作与对外部或软件中断采取的操作略有不同。处理陷阱时,不会改变 CPU 的中断优先级,因此 ICR.CCPN 字段不会被更新

2.1 陷阱向量格式(Trap Vector Format)

陷阱处理程序向量,存储在代码存储器中的 陷阱向量表(Trap Vector Table)中。BTV(Base Trap Vector)寄存器的值指定了陷阱向量表的基地址。 这些向量由多个短代码段组成,每段代码之间间隔八个字。 如果陷阱处理程序较短,则可能完全适应向量代码段中的八个字。如果它不能完全适应,则应包含一些初始指令,并随后跳转到完整的处理程序代码。

2.2 访问陷阱向量表(Accessing the Trap Vector Table)

当发生陷阱时,硬件会生成一个 陷阱标识符(Trap Identifier),该标识符由两个组成部分构成:

  • 陷阱类别编号(TCN,Trap Class Number),用于索引陷阱向量表。
  • 陷阱识别编号(TIN,Trap Identification Number),该编号会被加载到数据寄存器 D[15]。

陷阱类别编号会左移 5 位,然后与 BTV 寄存器中的地址进行 OR 运算,以生成陷阱处理程序的入口地址。

2.3 返回地址(Return Address, RA)

返回地址保存在 A[11] 寄存器中。对于大多数同步陷阱,返回地址是触发陷阱的指令所在的 PC(程序计数器)。仅 SYS 陷阱和 FCD 陷阱有所不同:

  • 对于 SYS 陷阱(由 SYSCALL 指令触发),返回地址指向 SYSCALL 之后的下一条指令。
  • 对于 FCD 陷阱,FCD Trap会在触发上下文保存指令完成后立刻触发。因此,FCD 陷阱的返回地址(Return Address)将会是:陷阱、 中断 或 被调用例程的第一条指令,或者 SVLCX 或 BISR 指令后面的指令(这样,在FCD trap处理中,通过合适的扩容,可以正常返回,并继续正常执行)。

对于异步陷阱,返回地址是如果未发生该陷阱,接下来应该执行的指令地址。 中断的返回地址规则与异步陷阱相同

2.4 陷阱向量表(Trap Vector Table)

所有陷阱服务程序(Trap Service Routine,TSR)的入口点都存储在内存中的 陷阱向量表(Trap Vector Table)。 BTV 寄存器用于指定陷阱向量表的基地址,它可以分配到任何可用的代码存储器中。
在系统初始化阶段,可以使用 MTCR 指令修改 BTV 寄存器(该寄存器受 ENDINIT 保护)。 这种机制使得系统可以有多个陷阱向量表,并且可以通过修改 BTV 寄存器内容在它们之间切换。

当陷阱事件发生时,硬件检测到该事件并生成陷阱标识符。 陷阱标识符由 陷阱类别编号(TCN)和 陷阱识别编号(TIN)组成:TCN 左移 5 位,然后与 BTV 寄存器中的地址进行 OR 运算,以形成 TSR 的入口地址。因此,建议在 BTV 寄存器的位 [7:5] 设为 0,如下图:

BTV 寄存器的位 0 始终为 0,不可写入(指令必须对齐到偶数字节边界)。

左移 TCN 5 位会创建在陷阱向量表中的条目,且条目之间间隔 8 个字。 如果陷阱处理程序 TSR 很短,它可能完全适应 陷阱向量表条目中的 8 个字。 否则,进入点代码必须最终跳转到存储器中其余部分的 TSR 代码。

与 中断向量表(Interrupt Vector Table)不同,陷阱向量表中的条目不能跨越多个存储单元。(Trap 机制都是启用状态,且不可关闭,不能像中断系统一样,关闭一些不使用的中断)

2.5 陷阱发生时的初始状态(Initial State upon a Trap)

当发生陷阱时,初始状态定义如下:

  • 上层上下文被保存。
  • 返回地址存储到 A[11] 并更新。
  • 陷阱识别编号(TIN)加载到 D[15]。
  • 如果处理器之前没有使用中断堆栈(PSW.IS = 0),则堆栈指针 A[10] 被设置为 中断堆栈指针(ISP)。同时,堆栈指针位被设置,表示使用中断堆栈:PSW.IS = 1。
  • I/O 模式被设置为监督模式,即所有权限均被启用:PSW.IO = 10B
  • 当前保护寄存器组(PRS)被设置为 0:PSW.PRS = 000B
  • 调用深度计数器(CDC)被清除,并且调用深度限制设为 64:PSW.CDC = 0000000B
  • 调用深度计数器启用:PSW.CDE = 1。
  • PSW 安全位被设置为 SYSCON 寄存器定义的值:PSW.S = SYSCON.TS。
  • 对全局寄存器 A[0]、A[1]、A[8]、A[9] 的写入权限被禁用:PSW.GW = 0。
  • 中断系统被全局禁用:ICR.IE = 0。旧的 ICR.IE 和 ICR.CCPN 被分别保存到 PCXI.PIE 和 PCXI.PCPN。ICR.CCPN 不变
  • 陷阱向量表被访问,以获取对应陷阱处理程序的第一条指令。

尽管陷阱不会改变 ICR.CCPN,但它们的处理程序仍然在禁用中断的情况下开始执行,因此可以执行关键的初始操作,直到显式重新启用中断。

对于不可恢复的 FCU 陷阱,其初始状态有所不同:上层上下文无法保存。仅保证以下状态:

  • 陷阱识别编号(TIN) 被加载到 D[15]。
  • 如果处理器之前没有使用中断堆栈(PSW.IS = 0),则堆栈指针 A[10] 被设置为 中断堆栈指针(ISP)。
  • I/O 模式 被设置为 监督模式(所有权限均启用):PSW.IO = 10B
  • 当前保护寄存器组 被设置为 0:PSW.PRS = 000B。
  • PSW 安全位 被设置为 SYSCON 寄存器定义的值:PSW.S = SYSCON.TS。
  • 中断系统被全局禁用:ICR.IE = 0,ICR.CCPN 保持不变。
  • 陷阱向量表 被访问,以获取 FCU 陷阱处理程序的第一条指令。

3 陷阱描述

以下小节描述了陷阱类别和具体陷阱。

3.1 MMU陷阱(陷阱类别 0)

对于那些包含内存管理单元(MMU)的实现,陷阱类别0预留给MMU陷阱。此类中有两种陷阱:VAF和VAP。

VAF - 虚拟地址填充(TIN 0)
当MMU已启用,且指令引用的虚拟地址在MMU转译后备缓冲区(TLB)中没有页表项(page entry)时,会产生VAF陷阱。

VAP - 虚拟地址保护(TIN 1)
VAP陷阱在(MMU启用时)由以下情况产生:内存访问在进行页表项(PTE)转译时,该访问不被PTE保护设置所允许;或者,由User-0模式尝试访问一个不具有特权外设属性的高地址段(upper segment)。

3.2 内部保护陷阱(陷阱类别 1)

陷阱类别1用于与内部保护系统相关的陷阱。此类中的内存保护陷阱(MPR、MPW和MPX)针对基于范围(range-based)的保护系统,并且独立于陷阱类别0中基于页(page-based)的VAP保护陷阱。

所有内存保护陷阱(MPR、MPW、MPX、MPP和MPN)都基于经过直接转换的虚拟地址。

定义了以下内部保护陷阱:

PRIV - 特权违规(TIN 1)
在某种用户模式(User-0或User-1模式)下执行的程序,尝试执行该模式不允许的指令。
本手册第二卷的指令集章节提供了仅限于监管模式(Supervisor mode)或User-1模式执行的指令表。

MPR - 内存保护读违规(TIN 2)
当内存保护系统已启用,且一次加载(load)、LDMST、SWAP或ST.T指令的有效地址不在任何启用了读取权限的地址范围内时,会产生MPR陷阱。在上下文保存/恢复操作期间发生访问违规时,不会生成此陷阱。

MPW - 内存保护写违规(TIN 3)
当内存保护系统已启用,且一次存储(store)、LDMST、SWAP或ST.T指令的有效地址不在任何启用了写入权限的地址范围内时,会产生MPW陷阱。

MPX - 内存保护执行违规(TIN 4)
当内存保护系统已启用,且程序计数器(PC)不在任何启用了执行权限的地址范围内时,会产生MPX陷阱。

MPP - 内存保护外设访问违规(TIN 5)
在User-0模式下执行的程序,尝试对配置为外设段(peripheral segment)的地址段进行加载或存储访问。参见第3页的“物理内存属性(PMA)”。

MPN - 内存保护空地址访问违规(TIN 6)
当任何程序尝试对有效地址零(address zero)进行加载/存储操作时,都会产生MPN陷阱。

GRWP - 全局寄存器写保护违规(TIN 7)
当程序没有相应权限时,却尝试修改某个全局地址寄存器(A[0], A[1], A[8] 或 A[9])

3.3 指令错误(陷阱类别 2)

陷阱类别2用于指示各种类型的指令错误。指令错误包括指令操作码(opcode)中的错误、指令操作数编码中的错误,或者对于内存访问而言的操作数地址中的错误。

IOPC - 非法操作码(TIN 1)
遇到了无效的指令操作码。无效操作码是指与当前实现(implementation)所知的任何指令都不对应的操作码。

UOPC - 未实现的操作码(TIN 2)
遇到了未实现的操作码。未实现的操作码对应于已知的、但在给定的硬件实现中未提供的指令。该指令可能会通过陷阱处理程序中的软件模拟来实现。
UOPC条件的示例如下:
• 如果不存在MMU,却执行了MMU指令。
• 如果不存在FPU(浮点单元),却执行了FPU指令。
• 如果不存在外部协处理器,却执行了外部协处理器指令。

OPD - 无效操作数(TIN 3)
对于需要偶数-奇数寄存器对作为操作数的指令,如果操作数指定符(specifier)是奇数寄存器,则可能引发OPD陷阱。对于其他操作数无效的情况,也可能引发OPD陷阱。
从架构上讲,并不要求实现(Implementations)必须引发此陷阱,它们可能会以实现自定义(implementation defined)的方式处理无效操作数。

ALN - 数据地址对齐(TIN 4)
当数据存储器操作的地址不符合要求的对齐规则时,会引发ALN陷阱。有关这些规则的更多信息,请参见第4页的“对齐要求”。当循环缓冲区(circular buffer)的大小、长度或索引不正确时,也会引发ALN陷阱。

MEM - 无效内存地址(TIN 5)
当能够确定某个访问的地址违反了架构约束(architectural constraint)或实现约束(implementation constraint)时,会引发MEM陷阱。
已定义的MEM陷阱子类包括:不同段(different segment)、段跨越(segment crossing)、CSFR访问(CSFR access)、CSA限制(CSA restriction)和便签存储器范围(scratch range)错误。
一个实现必须定义它将引发哪些针对实现约束的MEM陷阱,或者如果不引发MEM陷阱则将采取何种替代行为。它还必须记录它将引发的任何其他实现特定的MEM陷阱。

会引发MEM陷阱的架构约束有:
• 一种寻址模式将偏移量添加到基地址,导致产生的有效地址与基地址处于不同的段中(不同段错误)。
• 使用某个地址访问一个数据元素,导致该数据对象跨越了一个段的末尾和另一个段的开头(段跨越错误)。

可能引发MEM陷阱的实现约束有:
• 使用内存地址访问核心特殊功能寄存器(CSFR),而不是使用MTCR/MFCR指令(CSFR访问错误)。
• 使用内存地址进行上下文保存区(CSA)访问,但该实现无法将CSA放置于该地址(CSA限制错误)。
• 尝试使用一个位于已实现的 Scratch memory 区域之外的内存地址来访问 Scratch memory。

3.4 上下文管理(陷阱类别 3)

陷阱类别3用于由上下文管理子系统在执行(或尝试执行)与函数调用、中断、陷阱和返回相关的上下文保存(context save)和恢复(restore)操作过程中检测到的异常条件。

FCD - 空闲上下文列表耗尽(TIN 1):
FCD陷阱在一次上下文保存操作之后产生,当该操作导致空闲上下文列表(free context list)变为“接近空”(almost empty)状态时触发。“接近空” condition的判定条件是:用于保存操作的CSA(上下文保存区)恰好是上下文列表限制寄存器(LCX)所指向的那一个。负责上下文保存的操作会正常完成,随后才接受(taken)FCD陷阱。
如果负责上下文保存的操作是硬件中断或陷阱入口序列,那么FCD陷阱处理程序将在原始中断或陷阱处理程序的第一条指令执行之前被进入。FCD陷阱的返回地址将指向中断或陷阱处理程序的第一条指令
FCD陷阱处理程序通常被期望采取某种措施来纠正上下文列表耗尽问题。该措施的性质取决于操作系统(OS),但通常的选择是:为CSA存储分配额外的内存;或者终止一个或多个任务,并将其调用链(call chains)上的CSA返还给空闲列表。第三种可能性是不立即终止任何任务,而是将一个或多个非活动任务的调用链复制到无法直接用于CSA存储的非缓存外部或次级内存中,并将被复制走的CSA释放到空闲列表。在这种情况下,操作系统任务调度器需要能识别出非活动任务的调用链并不驻留在CSA存储区中,并在调度该任务之前将其恢复。
FCD陷阱本身会使用LCX寄存器指定的CSA之外的一个额外CSA,因此LCX绝不能指向空闲上下文列表上的实际最后一个条目。此外,有可能在FCD陷阱已被接受之后,报告一个异步陷阱条件(例如外部总线错误),这会中断FCD陷阱处理程序并使用又一个CSA。因此,为避免上下文列表下溢(underflow)的可能性,空闲上下文列表必须至少包含比LCX寄存器所指向的条目多两个的CSA。如果FCD陷阱处理程序进行任何调用,则需要额外的CSA储备。
为了让异步陷阱的处理程序能够识别出它们何时中断了FCD陷阱处理程序,每当生成FCD陷阱时,SYSCON(系统配置)寄存器中的FCDSF标志会被设置。任何可能在处理FCD陷阱期间被接受的异步陷阱的处理程序都应测试FCDSF位。如果发现该位被设置,异步陷阱处理程序必须避免进行任何调用,而应以某种方式将自己排队,以便让操作系统识别到该陷阱的发生。然后它应立即返回,返回到被中断的FCD陷阱处理程序。参见第13页的“系统控制寄存器(SYSCON)”。

CDO - 调用深度溢出(TIN 2):
程序尝试在调用深度计数器(Call Depth counter)启用且调用深度计数值(PSW.CDC.COUNT)已达到最大值的情况下执行CALL指令。调用深度计数通过使操作系统能够检测执行任务中的“失控递归”(runaway recursion),来防范上下文列表耗尽。

CDU - 调用深度下溢(TIN 3):
程序尝试在调用深度计数器启用且调用深度计数值(PSW.CDC.COUNT)为零的情况下执行RET(返回)指令。调用深度下溢并不一定反映当前执行任务中的软件错误。操作系统可以通过故意使用一个范围较窄的调用深度计数器,并在每次调用深度溢出或下溢陷阱时对当前任务的一个独立软件计数器进行递增或递减,来实现更细粒度的调用深度计数。只有当CDU陷阱发生时软件计数器已经为零,才表明存在程序错误。

FCU - 空闲上下文列表下溢(TIN 4):
当尝试进行上下文保存操作但发现空闲上下文列表为空(即FCX寄存器内容为空null)时,会接受FCU陷阱。如果在上下文保存或恢复操作期间遇到任何错误,也会接受FCU陷阱。上下文操作无法完成。取而代之的是强制跳转到FCU陷阱处理程序,并用FCU的TIN值更新D15寄存器。当发生FCU条件时,任何挂起(pending)的异步异常可能会丢失。
由于未能完成上下文保存或恢复,架构状态(architectural state)会丢失,因此FCU陷阱的发生是一种不可恢复的系统错误。FCU陷阱处理程序最终应启动系统复位(system reset)。

CSU - 调用栈下溢(TIN 5):
当尝试进行上下文恢复操作且PCX寄存器内容为空时引发。此陷阱表明在软件管理任务(SMTs)的任务设置或上下文切换中存在系统软件错误(内核或操作系统)。用户任务中的任何软件错误或错误组合都无法产生此条件,除非该任务被授予了对上下文保存区的写入权限,而这本身就可视为一种系统软件错误。

CTYP - 上下文类型错误(TIN 6)
当尝试进行上下文恢复操作,但PCXI.UL位指示的上下文类型与尝试执行的恢复操作类型不匹配时引发;即,当PCXI.UL == 1时尝试恢复下层上下文(restore lower context),或当PCXI.UL == 0时尝试恢复上层上下文(restore upper context)。与CSU陷阱一样,这表明上下文列表管理中存在系统软件错误。

NEST - 嵌套错误(TIN 7):
程序尝试在调用深度计数器启用且调用深度计数值(PSW.CDC.COUNT)非零的情况下执行RFE(从异常返回)指令。从中断或陷阱处理程序的返回通常应该发生在中断或陷阱处理程序自身内部,或发生在处理程序已分支到的代码中,而不是发生在由处理程序调用的代码中。如果不是这种情况,则残余调用链(residual call chain)上会存在一个或多个已保存的上下文,这些上下文必须在合法发出RFE指令之前被弹出(popped)并返回到空闲列表。

4 系统总线和外设错误(陷阱类别 4)

PSE - 程序取指同步错误(TIN 1)
在以下情况下会引发PSE陷阱:

  • 由于指令取指而发生总线错误。
  • 指令取指的目标段(segment)不具备代码取指(code fetch)属性。参见架构手册“物理内存属性(PMA)部分”。

DSE - 数据访问同步错误(TIN 2)
在以下情况下会引发DSE陷阱:

  • 由于数据加载(load)操作而发生总线错误时。
  • 对于来自DSPR 的数据加载或存储操作,且访问地址超出了存储器范围末端时。
  • 在数据缓存行填充的数据加载阶段发生错误时。
    注意: 对于DSE,存在与实现相关的寄存器,可通过查询这些寄存器来更精确地确定错误来源。

DAE - 数据访问异步错误(TIN 3)
当存储器系统报告一个无法立即与当前正在执行的指令关联的错误时,会引发DAE陷阱。通常这指的是来自外设或外部存储器通过系统总线返回的错误。
在以下情况下会引发此DAE陷阱:

  • 由于数据存储(store)操作而发生总线错误时。
  • 由缓存管理指令引起错误时。
  • 由缓存行写回引起错误时。
    注意:对于DAE,存在与实现相关的寄存器,可通过查询这些寄存器来更精确地确定错误来源。有关更多详细信息,请参阅特定Tricore实现的用户手册。

CAE - 协处理器异步错误(TIN 4)
此CAE异步陷阱由协处理器产生,用于报告错误。
可能导致CAE陷阱的典型错误示例包括:未实现的协处理器指令和算术错误(例如,在浮点单元中出现的错误)。
CAE在给定系统中的所有协处理器之间共享。因此,陷阱处理程序必须检查所有协处理器以确定陷阱的原因。

PIE - 程序存储器完整性错误(TIN 5)
当在指令取指中检测到不可纠正的存储器完整性错误时,会引发PIE陷阱。该陷阱与出错的指令同步。如果取指组(fetch group)中的任何元素包含不可恢复的错误,就会引发PIE陷阱。硬件无需将错误定位到特定的指令。
实现可能会提供额外的寄存器,可通过查询这些寄存器来更精确地确定错误来源。有关更多详细信息,请参阅特定Tricore实现的用户手册。

DIE - 数据存储器完整性错误(TIN 6)
当在数据访问中检测到不可纠正的存储器完整性错误时,会引发DIE陷阱。实现可以选择将DIE陷阱实现为异步陷阱或同步陷阱。
如果加载或存储操作访问的任何元素包含不可纠正的错误,就会引发DIE陷阱。硬件无需将错误定位到该操作的访问宽度。在上下文操作期间引发的DIE陷阱可能导致数据丢失。
实现可能会提供额外的寄存器,可通过查询这些寄存器来更精确地确定错误来源。有关更多详细信息,请参阅特定Tricore实现的用户手册。

TAE - 时序异步错误(TIN 7)
当有活动的定时器递减到零时,时序保护系统会引发TAE异步陷阱。这可用于在时间关键型应用中防止任务超时(overtun)。

5 断言陷阱(陷阱类别 5)

OVF - 算术溢出(TIN 1)
由TRAPV指令引发,条件是PSW中的溢出位被置位(PSW.V == 1)。

SOVF - 粘滞算术溢出(TIN 2)
由TRAPSV指令引发,条件是PSW中的粘滞溢出位被置位(PSW.SV == 1)。

6 系统调用(陷阱类别 6)

SYS - 系统调用(TIN = SYSCALL指令中的8位无符号立即常数)
SYS陷阱在SYSCALL指令执行后立即引发,以启动一个系统调用。当陷阱被接受时加载到D[15]中的TIN值并非固定,而是由SYSCALL指令中的一个8位无符号立即常数指定。返回地址指向紧跟在SYSCALL指令之后的那条指令。

7 不可屏蔽中断(陷阱类别 7)

NMI - 不可屏蔽中断(TIN 0)
引发不可屏蔽中断的原因取决于具体实现。通常,会有一个外部引脚可用于触发NMI,但它也可能由看门狗定时器中断或即将发生的电源故障等情况引发。有关更多详细信息,请参阅特定TriCore实现的用户手册。

调试陷阱

BBM - 先断后通 / BAM - 先通后断
有关调试陷阱的信息,请参阅内核调试控制器章节。

4 异常优先级

根据软件架构模型,异步陷阱、同步陷阱和中断之间的优先级顺序如下:

1:异步陷阱(优先级最高)。
2:同步陷阱。
3:中断(优先级最低)。
还必须考虑以下陷阱规则:

  • 在引发陷阱的指令序列中,指令越“旧”(即越早进入流水线),其陷阱的优先级越高。所有优先级较低的潜在陷阱均被忽略(void)。
  • 尝试在空闲上下文列表为空(FCX = 0)的情况下保存上下文,将导致FCU(空闲上下文列表下溢)陷阱。此陷阱的优先级高于所有其他异常。
  • 当同一条指令在流水线的任何阶段引发多个同步陷阱时,其优先级遵循手册中提供的优先级顺序表。