目录
6.3.1、MMU Traps (Trap Class 0)
6.3.2、Internal Protection Traps (Trap Class 1)
6.3.3、Instruction Errors (Trap Class 2)
6.3.4、Context Management (Trap Class 3)
6.3.5、System Bus and Peripheral Errors (Trap Class 4)
6.3.6、Assertion Traps (Trap Class 5)
6.3.7、System Call (Trap Class 6)
6.3.8、Non-Maskable Interrupt (Trap Class 7)
6、Trap系统
陷阱是非屏蔽中断(NMI)、指令异常、内存管理异常或非法访问等事件的结果。陷阱始终处于激活状态,无法通过软件操作禁用。本章将介绍可能发生的各种陷阱以及 TriCore® 体系结构的陷阱处理机制。
6.1、Trap类型
TriCore 体系结构为陷阱规定了八个通用类别。每个类别都有自己的陷阱处理程序,通过每个条目 32 字节的陷阱向量访问,该向量以硬件定义的陷阱类别编号为索引。在每个类别中,特定的陷阱由一个陷阱识别码(TIN)来区分,该识别码在执行陷阱处理程序的第一条指令之前由硬件加载到寄存器 D[15]。陷阱处理程序必须对 D[15] 中的值进行测试和分支,才能到达特定 TIN 的子处理程序。
陷阱还可进一步分为同步和异步陷阱,以及硬件和软件陷阱。下表列出了陷阱类别,并对每个类别中预先定义的特定陷阱进行了总结和分类。
在下表中
TIN = Trap Identification Number
Synch = Synchronous
Asynch = Asynchronous
HW = Hardware
SW = Software
支持的Trap类别
TIN | Name | Synch/Asynch | HW/SW | 定义 |
Class0 - MMU(Memory Management Unit) | ||||
0 | VAF | Synch | HW | Virtual Address Fill. 虚拟地址填充异常:当访问的虚拟地址尚未映射到物理地址时,会触发Trap0 |
1 | AVP | Synch | HW | Virtual Address Protection. 虚拟地址保护异常:当访问的虚拟地址违反了内存保护规则(如权限不足)时,会触发Trap0 |
Class 1 — Internal Protection Traps(内部保护陷阱) | ||||
1 | PRIV | Synch | HW | Privileged Instruction 特权指令:如果在用户模式下执行特权指令,硬件会捕获这个指令,并将其视为非法指令,进而触发一个异常 |
2 | MPR | Synch | HW | Memory Protection Read. 当读取受保护的内存区域时,系统会触发一个Trap。处理程序需要检查读取的地址是否在允许的范围内,并根据配置决定是否允许访问或记录错误 |
3 | MPW | Synch | HW | Memory Protection Write 当写入受保护的内存区域时,系统会触发一个Trap。处理程序需要检查写入的地址是否在允许的范围内,并根据配置决定是否允许写入或记录错误 |
4 | MPX | Synch | HW | Memory Protection Execution 当程序试图在受保护的内存区域执行代码时 |
5 | MPP | Synch | HW | Memory Protection Peripheral Access 当一个主设备(如CPU或DMA)试图访问受保护的外设寄存器时,会触发Memory Protection Peripheral Access的Trap。这种保护机制确保只有具有适当权限的主设备可以访问外设寄存器 |
6 | MPN | Synch | HW | Memory Protection Null Address 当程序试图访问空地址(如空指针解引用)时,会触发Memory Protection Null Address的Trap。这种Trap通常用于检测和防止空指针相关的错误 |
7 | GRWP | Synch | HW | Global Register Write Protection 当程序试图写入受保护的全局寄存器时,会触发Global Register Write Protection的Trap。这种保护机制确保只有具有适当权限的代码可以修改全局寄存器的值 |
Class 2 — Instruction Errors(指令错误) | ||||
1 | IOPC | Synch | HW | Illegal Opcode. 触发条件:当程序试图执行一个未定义的指令时,会触发Illegal Opcode的Trap。这通常是由于程序中存在错误的指令编码,或者程序试图执行一个在当前处理器上未实现的指令 示例:如果程序试图执行一个在当前处理器版本中不存在的指令,例如在旧版本的处理器上执行新版本的指令。 |
2 | UOPC | Synch | HW | Unimplemented Opcode. 触发条件:当程序试图执行一个在当前处理器上未实现的指令时,会触发Unimplemented Opcode的Trap。这通常发生在程序试图使用一个在处理器文档中未列出的指令。 示例:如果程序试图执行一个在处理器的当前配置中未实现的指令,例如一个高级指令集扩展中的指令。 |
3 | OPD | Synch | HW | Invalid Operand specification. 触发条件:当指令的参数(操作数)不符合指令的要求时,会触发Invalid Operand specification的Trap。这可能是由于操作数的类型、格式或数量不符合指令的规范。 示例:如果一个指令期望一个内存操作数,但程序提供了一个寄存器操作数 |
4 | ALN | Synch | HW | Data Address Alignment. 触发条件:当程序试图访问未正确对齐的内存地址时,会触发Data Address Alignment的Trap。这通常发生在访问需要特定对齐方式的数据类型时,例如访问未按字节对齐的字数据。 示例:如果程序试图访问一个未按4字节对齐的整数变量 |
5 | MEM | Synch | HW | Invalid Local Memory Address. 触发条件:当程序试图访问一个无效的本地内存地址时,会触发Invalid Local Memory Address的Trap。这可能是由于指针错误或内存映射配置错误导致的。 示例:如果程序试图访问一个超出本地内存范围的地址 |
Class 3 — Context Management | ||||
1 | FCD | Synch | HW | Free Context List Depletion (FCX = LCX) 触发条件:当上下文管理子系统中的空闲上下文列表(Free Context List)耗尽时,会触发Free Context List Depletion的Trap。这通常发生在频繁的中断或异常处理导致上下文保存操作过于频繁,空闲上下文列表中的可用上下文数量减少到一个临界值(LCX)时。 示例:在一个高负载的系统中,频繁的中断处理导致上下文保存操作频繁执行,最终空闲上下文列表中的可用上下文数量减少到LCX,从而触发该Trap |
2 | CDO | Synch | HW | Call Depth Overflow. 触发条件:当函数调用的嵌套深度超过系统允许的最大值时,会触发Call Depth Overflow的Trap。这通常发生在递归调用过深或函数调用链过长的情况下。 示例:一个递归函数没有正确的终止条件,导致递归调用不断进行,最终超过系统允许的最大嵌套深度。 |
3 | CDU | Synch | HW | Call Depth Underflow. 触发条件:当在函数调用的嵌套深度小于允许的最小值时执行返回操作,会触发Call Depth Underflow的Trap。这通常发生在错误的返回操作或栈指针配置错误的情况下。 示例:在一个函数调用链中,错误地执行了多次返回操作,导致嵌套深度低于允许的最小值。 |
4 | FCU | Synch | HW | Free Context List Underflow (FCX = 0). 触发条件:当上下文管理子系统中的空闲上下文列表(Free Context List)完全耗尽时,会触发Free Context List Underflow的Trap。这意味着没有可用的上下文可以用于保存当前状态。 示例:在一个极端情况下,所有的上下文都被占用,没有空闲的上下文可用,此时任何新的上下文保存操作都会触发该Trap。 |
5 | CSU | Synch | HW | Call Stack Underflow (PCX = 0). 触发条件:当程序计数器扩展寄存器(PCX)的值为0时,会触发Call Stack Underflow的Trap。这通常发生在错误的函数返回操作或栈指针配置错误的情况下。 示例:在函数调用过程中,错误地修改了PCX寄存器,使其值变为0,此时执行返回操作会触发该Trap。 |
6 | STYP | Synch | HW | Context Type (PCXI.UL wrong). 触发条件:当上下文类型寄存器(PCXI)中的用户/本地位(UL)设置错误时,会触发Context Type的Trap。这通常发生在上下文切换过程中,上下文类型配置不正确的情况下。 示例:在上下文切换时,错误地设置了PCXI寄存器的UL位,导致上下文类型不匹配。 |
7 | NEST | Synch | HW | Nesting Error: RFE with non-zero call depth. 触发条件:当在非零的调用深度下执行返回从异常(RFE)指令时,会触发Nesting Error的Trap。这通常发生在异常处理程序中错误地执行RFE指令,而当前的调用深度不为零的情况下。 示例:在一个异常处理程序中,没有正确地恢复调用深度就执行了RFE指令,导致调用深度不为零,从而触发该Trap。 |
Class 4 — System Bus and Peripheral Errors(系统总线和外设错误) | ||||
1 | PSE | Synch | HW | Program Fetch Synchronous Error. 程序试图从无效地址或受保护的内存区域取指时触发。这通常发生在程序计数器指向一个非法地址,或者试图访问一个受保护的内存区域。 |
2 | DSE | Synch | HW | Data Access Synchronous Error. 数据访问同步错误发生在内存系统报告的错误可以立即与当前执行的指令相关联时。这通常涉及数据加载或存储操作导致的总线错误。 |
3 | DAE | Asynch | HW | Data Access Asynchronous Error. 数据访问异步错误发生在内存系统报告的错误无法立即与当前执行的指令相关联时。这通常涉及外设或外部存储器返回的错误,如数据存储操作导致的总线错误、高速缓存管理指令错误以及高速缓存行回写错误。 |
4 | CAE | Asynch | HW | Coprocessor Trap Asynchronous Error. 协处理器操作错误发生在协处理器执行过程中遇到未定义的操作码、非法操作数或操作数地址错误时。 |
5 | PIE | Synch | HW | Program Memory Integrity Error. 程序内存完整性错误发生在程序内存(如Flash)的ECC检查中检测到单比特或多比特错误时。这通常与内存的读取操作有关 |
6 | DIE | Asynch | HW | Data Memory Integrity Error. 数据内存完整性错误发生在数据内存(如RAM)的ECC检查中检测到单比特或多比特错误时。这通常与数据的读取或写入操作有关。 |
7 | TAE | Asynch | HW | Temporal Asynchronous Error 时间异步错误通常与系统的时钟或定时器相关,发生在系统检测到时钟信号不稳定或定时器超时时。这可能与电源管理或时钟配置问题有关。 |
Class 5— Assertion Traps(断言陷阱) 断言:断言是一种编程技术,用于在程序中插入条件检查。如果条件不成立,程序会触发一个异常或错误,从而中断程序的执行。 语法:断言的语法因编程语言而异,但通常使用assert关键字。 用法:断言通常用于验证程序中的关键条件,如变量的值是否在有效范围内,指针是否为空等。 示例: int x = 10; assert(x > 0); // 如果x不大于0,断言失败,触发异常 | ||||
1 | OVF | Synch | SW | Arithmetic Overflow. 触发条件:当执行算术运算时,如果结果超出了目标数据类型的表示范围,就会触发Arithmetic Overflow的Trap。这通常发生在加法、减法或乘法运算中,当运算结果超过了数据类型的最大值或最小值时。 示例:在有符号整数运算中,两个正数相加的结果超过了最大值,或者两个负数相加的结果低于最小值。 |
2 | SOVF | Synch | SW | Sticky Arithmetic Overflow. 触发条件:Sticky Arithmetic Overflow的Trap通常是在Arithmetic Overflow发生后,溢出标志被设置,并且该标志在后续操作中保持设置状态,直到被显式清除。这允许系统在多个操作中累积溢出状态。 示例:在一系列算术运算中,如果其中任何一个运算导致溢出,Sticky Arithmetic Overflow标志将被设置,并在后续操作中保持该状态,直到通过特定指令清除。 |
Class 6 — System Call(系统调用) 对于系统调用陷阱,TIN 取自 SYSCALL 指令中指定的即时常数。可指定的数值范围为 0 至 255(含 255)。 | ||||
SYS | Synch | SW | System Call. 触发条件:当用户程序执行SYSCALL指令时,会触发System Call的TRAP。这通常用于用户程序请求操作系统执行特定的操作,如文件操作、进程管理等。 示例:在用户程序中,当需要进行文件读写操作时,会通过SYSCALL指令调用操作系统提供的系统调用服务。 | |
Class 7 — Non-Maskable Interrupt(不可屏蔽中断) | ||||
0 | NMI | Asynch. | HW | Non-Maskable Interrupt. 触发条件:当系统发生不可屏蔽的紧急事件时,会触发Non-Maskable Interrupt的TRAP。这通常用于处理系统中极其紧急且优先级高的事务,如看门狗定时器中断、即将发生的电源故障等。 示例:当系统的看门狗定时器超时时,会触发Non-Maskable Interrupt的TRAP,以确保系统在超时情况下能够及时响应并采取措施。 |
6.1.1、同步Traps
同步陷阱与执行或试图执行特定指令有关,或与试图访问需要内存管理系统干预的虚拟地址有关。引起陷阱的指令是已知的。陷阱会被立即捕获,并在指令执行结束前得到处理。
6.1.2、异步Traps
异步陷阱与中断类似,都与外部检测到的硬件条件有关,并向内核发出信号。有些中断是由先前执行过的指令间接产生的,但与这些指令的直接关联已经丢失。其他中断,如非屏蔽中断(NMI),则是外部事件。异步陷阱与中断的区别在于,异步陷阱是通过陷阱向量而不是中断向量路由的。它们不能被屏蔽,也不会改变当前的 CPU 中断优先级编号。
6.1.3、硬件Traps
硬件陷阱是针对硬件检测到的异常情况而产生的。例如非法指令陷阱、内存保护陷阱和数据内存错位陷阱。对于 MMU 陷阱(陷阱类别 0),异常条件要么是找不到指令引用的虚拟页面的 TLB(转换旁路缓冲区)条目(VAF 陷阱),要么是该页面的访问违规(VAP 陷阱)。
6.1.4、软件Traps
软件陷阱是执行系统调用或断言指令的有意结果。支持的断言指令有 TRAPV(溢出陷阱)和 TRAPSV(粘性溢出陷阱)。系统调用由 SYSCALL 指令产生。
6.1.5、不可恢复Traps
不可恢复的陷阱是指软件无法从中恢复的陷阱;也就是说,引发trap的任务不能简单地重新启动。
在TriCore体系结构中,FCU(致命上下文陷阱)是一种不可恢复的错误。
6.2、Trap处理
陷阱处理机制对陷阱采取的操作与对外部或软件中断采取的操作略有不同。trap不会改变CPU的中断优先级,所以ICR。没有更新CCPN字段。
6.2.1、Trap向量格式
陷阱处理程序向量存储在陷阱向量表中的代码内存中。BTV寄存器指定Trap向量表的基址。这些向量由许多短代码段组成,平均间隔8个字。
如果一个陷阱处理程序非常短,它可能完全适合在矢量代码段中可用的八个字。如果它不适合向量代码段,那么它应该包含一些初始指令,然后跳转到处理程序的其余部分。
6.2.2、访问Trap向量表
当trap发生时,硬件会生成一个trap标识符。trap标识符有两个组成部分:
- 用于索引陷阱矢量表的陷阱类别编号(TCN)。
- 装入数据寄存器 D[15] 的陷阱识别码(TIN)。
Trap类号左移5位,与BTV寄存器中的地址对齐,生成Trap处理程序的入口地址。
6.2.3、返回地址(RA)
返回地址保存在返回地址寄存器A[11]中
对于同步陷阱,返回地址是引起陷阱的指令的 PC。只有 SYS 陷阱和 FCD 陷阱不同。SYS 陷阱由 SYSCALL 指令触发,返回地址指向紧随 SYSCALL 之后的指令。
对于异步陷阱,返回地址是如果异步陷阱没有被捕获,下一个将被执行的指令的返回地址。中断的返回地址也遵循同样的规则。
6.2.4、Trap向量表
所有陷阱服务例程的入口点都存储在内存的陷阱向量表中。BTV 寄存器指定内存中陷阱矢量表的基地址。它可以分配给任何可用的代码存储器。在系统初始化阶段,可以使用 MTCR 指令修改 BTV 寄存器(BTV 寄存器受 ENDINIT 保护)。通过这种安排,可以拥有多个捕获矢量表,并通过更改 BTV 寄存器的内容在它们之间切换。
当发生trap事件时,检测到该事件的硬件产生一个trap标识符。trap标识符由trap分类号(TCN)和trap识别号(TIN)组成。
TCN 左移五位后,与 BTV 寄存器中的地址进行 OR,形成 TSR 的入口地址。因此,建议将寄存器 BTV 的 [7:5] 位设置为 0(见下图)。请注意,BTV 寄存器的第 0 位始终为 0,不能写入(指令必须在偶数字节边界对齐)。
将 TCN 左移 5 位,可在陷阱矢量表中创建均匀间隔为 8 个字的条目。如果陷阱处理程序(TSR)非常短,它可能完全符合陷阱矢量表中可用的 8 个字符。否则,入口处的代码最终必须跳转到位于内存其他位置的 TSR 的其余部分。
与中断向量表不同,Trap向量表中的表项不能被跨越。
6.2.5、Trap的初始状态
trap发生时的初始状态定义如下:
- 保存上层上下文。
- 更新 A[11] 中的返回地址。
- 将 TIN 加载到 D[15]。
- 当处理器之前未使用中断堆栈时(PSW.IS = 0 时),A[10] 中的堆栈指针将被设置为中断堆栈指针(ISP)。堆栈指针位被设置为使用中断堆栈: PSW.IS = 1。
- I/O 模式设置为 “监督员 ”模式,即启用所有权限: PSW.IO = 10B。
- 当前保护寄存器集设置为 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] 的写入权限已禁用: - 全局禁用中断系统: 旧 "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 陷阱处理程序的第一条指令。
6.3、Trap的描述
下面的小节描述了6.1章节“支持的陷阱”中列出的陷阱类别和特定的陷阱
6.3.1、MMU Traps (Trap Class 0)
对于包含内存管理单元(MMU)的实施,陷阱类别 0 专用于 MMU 陷阱。该类中有两个陷阱,即 VAF 和 VAP。
VAF - Virtual Address Fill (TIN 0)
当启用 MMU 且指令引用的虚拟地址在 MMU 转换旁侧缓冲区(TLB)中没有页面条目时,就会生成 VAF 陷阱。
VAP - Virtual Address Protection (TIN 1)
在启用 MMU 时,PTE 保护设置不允许进行 PTE 转换的内存访问,或用户 0 模式访问不具有特权外设属性的上段,都会产生 VAP 陷阱。
6.3.2、Internal Protection Traps (Trap Class 1)
陷阱类别 1 用于与内部保护系统相关的陷阱。该类中的内存保护陷阱 MPR、MPW 和 MPX 用于基于范围的保护系统,与陷阱类 0 中基于页面的 VAP 保护陷阱无关。
所有内存保护陷阱(MPR、MPW、MPX、MPP 和 MPN)都基于直接转换的虚拟地址。
定义了以下内部保护陷阱:
PRIV - Privilege Violation (TIN 1)
在用户模式(User-0或User-1模式)下执行的程序试图执行该模式不允许的指令。
在本手册第二卷的指令集章节中提供了主管模式或用户-1模式的指令表。
MPR - Memory Protection Read (TIN 2)
当启用内存保护系统,且加载、LDMST、SWAP 或 ST.T 指令的有效地址不在任何已启用读取权限的范围内时,就会产生 MPR 陷阱。在上下文保存/还原操作过程中出现访问违规时,不会产生该陷阱。
MPW - Memory Protection Write (TIN 3)
当启用内存保护系统,且存储、LDMST、SWAP 或 ST.T 指令的有效地址不在任何已启用写入权限的范围内时,就会产生 MPW 陷阱。
MPX - Memory Protection Execute (TIN 4)
当启用内存保护系统且 PC 不在任何启用了执行权限的范围内时,就会产生 MPX 陷阱。
MPP - Memory Protection Peripheral Access (TIN 5)
在User-0模式下执行的程序试图对某个段进行加载或存储访问,该程序被配置为外设段。
MPN - Memory Protection Null address (TIN 6)
每当任何程序试图加载/存储操作到有效地址0时,就会产生MPN陷阱。
GRWP - Global Register Write Protection (TIN 7)
程序试图修改某个全局地址寄存器(A[0]、A[1]、A[8] 或 A[9]),但却没有修改权限。
6.3.3、Instruction Errors (Trap Class 2)
第2类陷阱是用来发出各种指令错误的信号。指令错误包括指令操作码中的错误,指令操作数编码中的错误,或者内存访问中的错误,操作数地址中的错误。
IOPC - Illegal Opcode (TIN 1)
遇到无效的指令操作码。无效的操作码是指与实现中已知的任何指令不对应的操作码。
UOPC - Unimplemented Opcode (TIN 2)
遇到一个未执行的操作码。未执行操作码对应的是在特定硬件实现中未执行的已知指令。该指令可通过陷阱处理程序中的软件模拟实现。
UOPC 条件示例如下
- 如果不存在 MMU,则为 MMU 指令。
- 如果 FPU 不存在,则为 FPU 指令。
- 外部协处理器指令(如果外部协处理器不存在)。
OPD - Invalid Operand (TIN 3)
如果操作数指定符为奇数,以偶数寄存器对作为操作数的指令可能会触发 OPD 陷阱。在操作数无效的其他情况下,也可能触发 OPD 陷阱。
从架构上讲,并不要求执行程序必须触发该陷阱,执行程序可按自己定义的方式处理无效操作数。
ALN - Data Address Alignment (TIN 4)
当数据内存操作的地址不符合所需的对齐规则时,将引发ALN trap,当循环缓冲区的大小、长度或索引不正确时,也会引发ALN陷阱。
MEM - Invalid Memory Address (TIN 5)
当可以确定访问地址违反体系结构约束或实现约束时,会引发MEM陷阱。
定义的 MEM 陷阱子类包括不同网段、网段交叉、CSFR 访问、CSA 限制和抓取范围。
实施必须定义将引发哪些实施约束 MEM 陷阱,或在不引发 MEM 陷阱的情况下的替代行为。它还必须记录将引发的任何其他特定实施 MEM 陷阱。
会引发MEM陷阱的架构限制包括:
- 在基地址上增加偏移量的寻址模式,会产生一个与基地址不同网段(不同网段)的有效地址。
- 使用地址访问数据元素时,数据对象会跨越一个数据段的末端和另一个数据段的起点(数据段交叉)
可能引发MEM陷阱的实现约束是
- 使用内存地址访问核心 SFR (CSFR),而不是使用 MTCR/MFCR 指令(CSFR 访问)
- 使用内存地址进行 CSA 访问,而在该地址放置 CSA 对执行无效(CSA 限制)
- 尝试使用位于已执行内存区域之外的内存地址访问划痕内存(划痕范围错误)。
6.3.4、Context Management (Trap Class 3)
Trap类3用于上下文管理子系统在执行(或试图执行)与函数调用、中断、陷阱和返回相关的上下文保存和恢复操作过程中检测到的异常情况。
FCD - Free Context list Depletion (TIN 1)
FCD 陷阱产生于上下文保存操作之后,当该操作导致空闲上下文列表 “几乎为空 ”时。当用于保存操作的 CSA 是上下文列表限制寄存器 LCX 所指向的 CSA 时,就会发出 “几乎为空 ”的信号。负责保存上下文的操作正常完成,然后执行 FCD 陷阱。
如果负责上下文保存的操作是硬件中断或陷阱进入序列,那么FCD陷阱处理程序将在执行原始中断或陷阱处理程序的第一条指令之前进入。FCD陷阱的返回地址将指向中断或陷阱处理程序的第一条指令。
FCD 陷阱处理程序通常会采取某种措施来纠正上下文列表耗尽的情况。该操作的性质取决于操作系统,但一般选择是为 CSA 存储分配额外内存,或终止一个或多个任务,并将其调用链上的 CSA 返回到空闲列表。第三种可能是不直接终止任何任务,而是将一个或多个不活动任务的调用链复制到未缓存的外部内存或二级内存(这些内存不能直接用于 CSA 存储),并将复制的 CSA 释放到空闲列表。在这种情况下,操作系统任务调度程序需要识别出不活动任务的调用链不在 CSA 存储器中,并在分派任务前恢复调用链。
FCD 陷阱本身会在 LCX 寄存器指定的 CSA 之外再使用一个 CSA,因此 LCX 不能指向空闲上下文列表的实际最后一个条目。此外,在 FCD 陷阱发生后,可能会报告异步陷阱条件(如外部总线错误),从而中断 FCD 陷阱处理程序并多使用一个 CSA。因此,为避免出现上下文列表下溢的情况,除了 LCX 寄存器指向的 CSA 外,空闲上下文列表必须至少包含两个 CSA。如果 FCD 陷阱处理程序进行任何调用,则需要额外的 CSA 储备。
为了让异步陷阱处理程序识别它们何时中断了 FCD 陷阱处理程序,每当 FCD 陷阱产生时,SYSCON(系统配置)寄存器中的 FCDSF 标志就会被置位。处理程序应测试 FCDSF 位,以防在处理 FCD 陷阱时出现异步陷阱。如果发现该位被置位,异步陷阱处理程序必须避免进行任何调用,而应以某种允许操作系统识别陷阱发生的方式排队。然后,它应立即返回被中断的 FCD 陷阱处理程序。
CDO - Call Depth Overflow (TIN 2)
在启用调用深度计数器且调用深度计数值(PSW.CDC.COUNT)达到最大值的情况下,程序试图执行 CALL 指令。调用深度计数使操作系统能够检测执行任务中的 “失控递归”,从而防止上下文列表耗尽。
CDU - Call Depth Underflow (TIN 3)
程序在启用调用深度计数器且调用深度计数值 (PSW.CDC.COUNT) 为零的情况下尝试执行 RET(返回)指令。调用深度下溢并不一定反映当前执行任务中存在软件错误。操作系统可以通过特意缩小调用深度计数器的范围,并在每次调用深度溢出或下溢陷阱时递增或递减当前任务的单独软件计数器,实现更精细的调用深度计数粒度。只有当软件计数器在 CDU 陷阱发生时已经为零时,才会显示程序错误。
FCU - Free Context List Underflow (TIN 4)
如果试图执行上下文保存操作,但发现空闲上下文列表为空(即 FCX 寄存器内容为空),则会触发 FCU 陷阱。如果在保存或恢复上下文操作过程中遇到任何错误,也会触发 FCU 陷阱。上下文操作无法完成。取而代之的是强制跳转到 FCU 陷阱处理程序,并用 FCU TIN 值更新 D15。当 FCU 条件发生时,任何待处理的异步异常都可能丢失。
由于无法完成上下文保存或还原,架构状态将丢失,因此出现 FCU 陷阱是不可恢复的系统错误。FCU 陷阱处理程序最终应启动系统复位。
CSU - Call Stack Underflow (TIN 5)
当尝试进行上下文还原操作且 PCX 寄存器内容为空时触发。该陷阱表示任务设置或软件管理任务(SMT)间上下文切换中的系统软件错误(内核或操作系统)。用户任务中的任何软件错误或错误组合都不会产生这种情况,除非该任务被允许写入上下文保存区域,而这本身就可被视为系统软件错误。
CTYP - Context Type (TIN 6)
当尝试进行上下文还原操作,但 PCXI.UL 位指示的上下文类型与尝试的还原类型不符时发生;即当 PCXI.UL == 1 时尝试还原下层上下文,或当 PCXI.UL == 0 时尝试还原上层上下文。与 CSU 陷阱一样,这表明系统软件在上下文列表管理中出错。
NEST - Nesting Error (TIN 7)
在调用深度计数器启用且调用深度计数值(PSW.CDC.COUNT)非零的情况下,程序试图执行 RFE(从异常返回)指令。从中断或陷阱处理程序返回通常应发生在中断或陷阱处理程序本身或处理程序分支代码中,而不是处理程序调用的代码中。否则,在合法发出 RFE 之前,剩余调用链上的一个或多个保存上下文必须被弹出并返回到空闲列表。
6.3.5、System Bus and Peripheral Errors (Trap Class 4)
PSE - Program Fetch Synchronous Error (TIN 1)
PSE 陷阱在下列情况下触发
- 由于指令取回发生总线错误。
解释:总线错误:当内存访问超出实际刮擦板 RAM 的范围时,对数据刮擦板 RAM 区域(D000 0000H 至 D3FF FFFFH)的指令取用也会产生总线取用错误。
- 指令取指的是没有代码取指属性的程序段。
DSE - Data Access Synchronous Error (TIN 2)
DSE 陷阱在以下情况下触发
- 数据加载操作导致总线错误时。
- 从数据抓板 RAM (DSPR)
-进行数据加载或存储操作时 - 在数据高速缓存重新填充的数据加载阶段发生错误时。
注:DSE 的寄存器与实现有关,可通过查询这些寄存器更准确地确定错误源。有关详细信息,请参阅特定 TriCore 实现的《用户手册》。
DAE - Data Access Asynchronous Error (TIN 3)
当内存系统报告的错误无法立即与当前执行的指令相关联时,DAE 陷阱就会触发。一般来说,这是指从外设或外部存储器返回系统总线的错误。
该 DAE 陷阱在下列情况下触发:
- 数据存储操作导致总线错误。
- 高速缓存管理指令导致错误。
- 高速缓存行回写导致错误。
注:DAE 的寄存器与实现有关,可通过查询这些寄存器更精确地确定错误源。有关详细信息,请参阅特定 TriCore 实现的《用户手册》。
CAE - Coprocessor Trap Asynchronous Error (TIN 4)
这种 CAE 异步陷阱由协处理器生成,用于报告错误。
可能导致 CAE 陷阱的典型错误包括未执行的协处理器指令和算术错误(例如在浮点运算单元中发现的错误)。
CAE 由特定系统中的所有协处理器共享。因此,陷阱处理程序必须检查所有协处理器,以确定陷阱的原因。
PIE - Program Memory Integrity Error (TIN 5)
每当在指令取回过程中检测到无法纠正的内存完整性错误时,就会触发 PIE 陷阱。陷阱与错误指令同步。如果取指令组中的任何元素包含无法修复的错误,就会触发 PIE 陷阱。硬件无需将错误定位到特定指令。
实施过程中可能会提供额外的寄存器,可以通过查询这些寄存器来更精确地确定错误源。更多详情,请参阅特定 Tricore 实现的用户手册。
DIE - Data Memory Integrity Error (TIN 6)
每当在数据访问中检测到无法纠正的内存完整性错误时,就会触发 DIE 陷阱。
实现者可选择以异步或同步陷阱的方式实现 DIE 陷阱。
如果载入或存储访问的任何元素包含无法纠正的错误,就会触发 DIE 陷阱。硬件无需将错误定位到操作的访问宽度。在上下文操作期间触发的 DIE 陷阱可能会导致数据丢失。
实施过程中可能会提供额外的寄存器,可以通过查询这些寄存器来更准确地确定错误源。更多详情,请参阅特定 Tricore 实现的用户手册。
TAE - Temporal Asynchronous Error (TIN 7)
当活动计时器减少到零时,时序保护系统就会触发TAE异步陷阱。这可用于防止时间关键型应用程序中的任务超时。
6.3.6、Assertion Traps (Trap Class 5)
OVF - Arithmetic Overflow (TIN 1)
如果 PSW 中的溢出位被设置(PSW.V ==1),则由 TRAPV 指令引发。
SOVF - Sticky Arithmetic Overflow (TIN 2)
如果 PSW 中的粘性溢出位被设置(PSW.SV ==1),则由 TRAPSV 指令引发。
6.3.7、System Call (Trap Class 6)
SYS - System Call (TIN = 8-bit unsigned immediate constant in SYSCALL)
SYS 陷阱在执行 SYSCALL 指令后立即触发,以启动系统调用。陷阱发生时加载到 D[15] 的 TIN 并不固定,而是在 SYSCALL 指令中指定为一个 8 位无符号立即常量。返回地址指向紧随 SYSCALL 指令之后的指令。
6.3.8、Non-Maskable Interrupt (Trap Class 7)
NMI - Non-Maskable Interrupt (TIN 0)
引发不可屏蔽中断的原因取决于执行情况。通常情况下,有一个外部引脚可用于发出 NMI 信号,但也可能是为了响应看门狗定时器中断或即将发生的电源故障。有关详细信息,请参阅特定 TriCore 实现的《用户手册》。
TLF35584的哪个PCS管脚吗?
6.3.9、Debug Traps
BBM - Break Before Make / BAM - Break After Make
有关调试陷阱的信息,请参阅核心调试控制器章节。
6.4、异常优先级
从软件架构模型来看,异步trap、同步trap和中断的优先级顺序如下:
1. Asynchronous trap (highest priority).
2. Synchronous trap.
3. Interrupt (lowest priority).
还必须考虑以下陷阱规则:
1. 导致陷阱的指令序列中的指令时间越长,陷阱的优先级就越高。所有优先级较低的潜在陷阱都无效。
2. 在空的自由上下文列表(FCX = 0)下试图保存上下文,会产生 FCU(自由上下文列表下溢)陷阱。该陷阱的优先级高于所有其他异常。
3. 当同一指令在流水线的任何位置引起多个同步陷阱时,优先级如下表所示。
同步Trap优先级
优先级 | Trap类型 |
Instruction Fetch Traps:指令获取陷阱 | |
1 | Breakpoint trap or halt - BBM (Trigger on PC) |
2 | VAF-P(仅适用于MMU存在并启用的情况) |
3 | VAF-P(仅适用于MMU存在并启用的情况) |
4 | MPX |
5 | PSE |
6 | PIE |
Instruction Format Traps(指令格式陷阱) | |
7 | IOPC |
8 | OPD |
9 | UOPC |
Instruction Traps(指令陷阱) | |
10 | Breakpoint trap or halt - BBM (Trigger on Address, MxCR, Debug) |
11 | PRIV |
12 | GRWP |
13 | SYS |
Context Traps(上下文陷阱) | |
14 | FCD |
15 | FCU (Synchronous) |
16 | CSU |
17 | CDO |
18 | CDU |
19 | NEST |
20 | CTYP |
Data Memory Access Traps(数据存储器访问陷阱) | |
21 | MEM (Data address) |
22 | ALN |
23 | MPN |
24 | VAF-D |
25 | VAF-D |
26 | MPP |
27 | MPR |
28 | MPW |
29 | DSE |
General Data Traps(一般数据陷阱) | |
30 | SOVF |
31 | OVF |
32 | Breakpoint trap or halt - BAM |
异步Trap优先级
优先级 | Trap类型 |
1 | NMI |
2 | DAE:DAE用于存储错误。 |
3 | CAE |
4 | TAE |
5 | DIE |
6.5、Trap控制寄存器
Base Trap Vector Table Pointer (BTV)
BTV 包含陷阱矢量表的基地址。陷阱发生时,陷阱矢量表的入口地址由该陷阱的陷阱类别生成,左移 5 位,然后与 BTV 寄存器的内容进行 ORd。陷阱类别左移后,矢量表中各个条目之间的间隔为 8 个字(32 字节)。
注意:这个寄存器是ENDINIT保护的。
BTV:BTV 寄存器中的地址必须与偶数字节地址(半字地址)对齐。此外,由于左移陷阱识别码和 BTV 寄存器内容的简单 OR,矢量表的基地址必须以 2 的幂次边界对齐。共有 8 个不同的陷阱类别,陷阱类别从 0 到 7 不等。因此,BTV 的内容至少应设置为 256 字节边界(8 个陷阱类别 * 8 字间距)。
Program Synchronous Error Trap Register (PSTR)
执行程序可在 PSTR 寄存器中提供有关程序同步错误类型的信息。寄存器的内容取决于具体实现。
解释环节:
英飞凌的PSTR寄存器是程序同步错误陷阱寄存器(Program Synchronous Error Trap Register),它用于存储程序存储系统的同步Trap信息,帮助定位异常。当检测到Trap并且寄存器中没有已设置的位时,寄存器才会被设置。它通过CSFR写入(与数据值无关)来清除
Data Synchronous Error Trap Register (DSTR)
执行程序可在 DSTR 寄存器中提供数据同步错误类型的信息。寄存器的内容取决于具体实现。
Data Asynchronous Error Trap Register (DATR)
实施可在 DATR 寄存器中提供数据异步错误类型的信息。寄存器的内容取决于具体实现。
Data Error Address Register (DEADD)
执行程序可在 DEADD 寄存器中提供有关数据错误位置的信息。寄存器的内容取决于具体实现。