系统中断及INTC)
本章节主要讲的是系统异常及外部输入中断外设的中断具体配置会在讲每个外设的时候提到一系统异常参考手册15章 15.8Exceptions部分当系统异常发生时会触发相应的中断处理。1系统中断类型e200z4251n3 内核实现的中断及其触发条件如下图所示注意各种异常中断向量的偏移地址。系统异常向量地址 基地址IVPR中写入 偏移地址根据不同的异常类型比如说发生了系统异常这个时候系统应该执行相应的异常处理就可以在系统异常向量地址中放置相应的跳转语句跳转到处理函数。1、Critical InputCritical Input Interrupt (offset 0x00)关键输入中断当关键中断引脚被置为有效时会向处理器发送关键输入异常信号。如果该异常被MSR_CE位使能处理器将响应该关键输入中断。关键输入中断可能被更高优先级的异常延迟也可能在异常发生时MSR_CE位已被清零而无法响应。2、Machine CheckMachine Check Interrupt (offset 0x10)机器检查中断EIS Machine Check APU 定义了一组独立的保存 / 恢复寄存器MCSRR0/1、一个机器检查 Syndrome 寄存器MCSR用于记录机器检查的来源以及一个机器检查地址寄存器MCAR用于保存特定类型机器检查相关的地址。处理器也提供了专门的机器检查返回指令se_rfmci用于配合MCSRR0/1实现中断返回。MSR_DE位不会被机器检查异常自动清零但可以通过HID0寄存器的HID0_MCCLRDE位配置为 “清零” 或 “保持不变” 两种行为。3、Data StorageData Storage Interrupt (offset 0x20)数据存储中断如果没有更高优先级的异常正在发生且出现了读 / 写访问控制异常条件就会触发数据存储中断DSIData Storage Interrupt。4、Instruction StorageInstruction Storage Interrupt (offset 0x30)指令存储中断当没有更高优先级的异常正在发生且出现了指令执行访问控制异常条件时就会触发指令存储中断ISIInstruction Storage Interrupt。5、External Input外部输入中断着重看一下这个就是通过中断控制器(INTC)控制的片上外设/软件中断其异常处理向量符合为IVOR4_VectorExternal Input Interrupt (offset 0x40)外部输入中断中断控制器发出的中断信号有效时会向处理器发送外部输入异常信号。该输入为电平敏感信号必须保持有效直到内核确认外部中断。如果信号提前无效处理器无法保证一定能识别到中断请求。当内核检测到该异常且异常被MSR_EE位使能时处理器将响应该外部输入中断。外部输入中断可能被更高优先级的异常延迟也可能在异常发生时MSR_EE位已被清零而无法响应。6、AlignmentAlignment Interrupt (offset 0x50)对齐中断当发生以下任一情况时将触发对齐异常Alignment Interruptlmw或stmw指令的操作数未按字word对齐lwarx或stwcx.指令的操作数未按字word对齐lharx或sthcx.指令的操作数未按半字halfword对齐尝试执行dcbz指令执行了未正确对齐的 LSP APU 加载 / 存储指令7、ProgramProgram Interrupt (offset 0x60)程序中断当没有更高优先级的异常正在处理且发生以下一种或多种异常条件时将触发程序中断非法指令异常特权指令异常陷阱异常8、Performance MonitorPerformance Monitor Interrupt (offset 0x70)性能监控中断性能监控中断由已使能的条件或事件触发。已使能的条件或事件定义如下当满足以下设置时会触发PMCx寄存器溢出条件PMLCax_CE 11表示已为指定计数器使能溢出条件PMCx_OV 11表示指定计数器已检测到溢出要使已使能的条件或事件触发性能监控中断必须设置PMGC0_PMIE位。即使在MSR_EE 0时出现了异常条件处理器也必须等到MSR_EE 1时才会响应该中断。性能监控中断的优先级低于所有其他异步中断。9、System CallSystem Call Interrupt (offset 0x80)系统调用中断当执行系统调用指令se_sc且没有更高优先级的异常正在处理时将触发系统调用中断。10、DebugDebug Interrupt (offset 0x90)调试中断调试异常可由多种来源触发。当不存在更高优先级的异常、调试状态寄存器中存在调试异常标记且调试中断已使能同时满足DBCR0_IDM 1内部调试模式和MSR_DE 1时将触发调试中断。11、Embedded Floating-point DataEmbedded Floating-point Data Interrupt (offset 0xA0嵌入式浮点数据中断当不存在更高优先级的异常且 EFPU嵌入式浮点单元产生浮点数据异常时处理器会响应嵌入式浮点数据中断。当浮点数据异常发生时处理器会抑制导致该异常的指令执行。12、Embedded Floating-point RoundEmbedded Floating-point Round Interrupt (offset 0xB0)嵌入式浮点舍入中断当 EFPU嵌入式浮点单元浮点指令产生非精确结果且非精确异常已使能时处理器会响应嵌入式浮点舍入中断。13、System ResetSystem Reset Interrupt 复位中断系统复位异常是一种不可屏蔽的异步异常通过系统定义的信号置为有效来向处理器发出通知。系统复位可由软件复位发起也可在上电复位期间触发。当复位请求发生时处理器会直接跳转到系统复位异常向量不会尝试进入可恢复状态。如果在正常运行过程中发生复位所有操作将立即停止处理器状态也将丢失。2相关的特殊寄存器1、MSRMSR[EE]是外部输入中断的全局使能和关闭控制位。其操作使用专门的汇编指令--writeei完成IRQ中断全局使能--置位MSR[EE] :writeei 1IRQ中断全局关闭--清除MSR[EE] : writeei 02、IVPR中断向量前缀寄存器IVPR用于在中断处理过程中确定中断处理软件程序的起始地址。对于特定中断类型所选的向量偏移值会与 IVPR 中保存的向量基地址值拼接形成执行将从中开始的指令地址。IVPR的访问需通过特殊功能寄存器特殊功能寄存器编号SPR63访问权限可读 / 可写所以IVPR是用来装内核系统异常向量表的基地址。二INTC模块中断控制器INTC的主要功能提供基于优先级的抢占式中断请求调度将来自软件和内部外设的中断请求IRQ调度到一个或多个处理器PRC支持中断优先级与抢占、中断屏蔽、中断优先级提升以及相关协议1模式中断控制器与处理器之间有两种握手模式软件向量模式和硬件向量模式。使用哪种模式由硬件向量使能位INTC_BCR[HVEN]的状态决定。在 Power Architecture 架构的设备中软件向量模式使用处理器的自动向量模式所有中断服务程序ISR共用一个入口点占用 16 字节的向量空间。硬件向量模式使用非自动向量模式由中断控制器INTC向处理器提供中断向量偏移每个中断请求 IRQ 占用 4 字节。图片摘抄自公众号-汽车电子Expert成长之路2寄存器1、INTC_BCR这个寄存器专门用来配置INTC是软件模式还是硬件模式。在例程中配置的是软件模式。2、INTC_CPR0INTC_CPRn寄存器会屏蔽所有优先级与INTC_CPRn[PRI]字段当前值相同或更低的外设 / 软件可设置中断请求使其无法向处理器发出中断请求。说人话就是比如你的外设中断优先级为10但是这个INTC_CPR0的PRI位配置为了11就无法触发外设中断如果INTC_CPR0的PRI位配置为了9就可以触发外设中断。但是由于PRI的默认配置值为0b11111即31在默认配置下所有中断请求都会被屏蔽掉所以需要把PRI配置为0以关闭掉中断屏蔽并且要把相应的中断优先级设置为非0。3、INTC_IACKR0处理器n的中断确认寄存器INTC_IACKRn提供一个值可用于从向量表中加载中断服务程序ISR的地址。该向量表可由对应各中断向量的中断服务程序地址构成。VTBA为外设中断向量表的基地址INTVEC为外设或软件中断向量的偏移地址。如下图就是把外设中断向量表的基地址赋给了INTC_IACKRn4、INTC_SSCIRnINTC_SSCIR寄存器用于支持软件可设置中断请求的置位或清除操作。INTC模块提供了16个软件设置中断用户可以通过软件设置INTC_SSCIRn的SET位来触发相应的软件中断在其软件中断服ISR务函数中对INTC_SSCIRn的CLR位写1清除相应的中断请求。INTC_SSCIRn的SET 位和CLR位都是写0无效5、INTC_PSRnINTC_PSRn寄存器用于设置INTC管理的外设中断和软件设置中断的优先级每个中断都有其独立的优先级设置寄存器INTC_PSRn的n就是对应的中断号其中PRC_SELN0位用于选择该中断是否有相应的CPU内核响应SWTN位用于用于软件模拟产生非SSCIRs控制的片上外设中断最低的5位PRIN用于设置该中断的优先级0~310为最低优先级(复位后的默认值)为了让CPU响应INTC_PSRn对应的中断必须将其优先级配置为非零值。3中断源类型分类INTC中断分为两类一类是软件中断一类是外设中断。1、软件中断在MPC5744P的中断向量表中一共设置了16个软件中断。软件向 INTC_SSCIRn 中的 SET 位写入 1即可触发中断请求。该写操作会置位对应的 CLR 位即标志位从而产生中断请求向 CLR 位写入 1 则会清除该中断请求。延迟特性软件中断从置位到处理器收到请求需要 4 个时钟周期比外设中断多 1 个周期。2、外设中断外设硬件中发生中断事件时会置位该外设内部的标志位。外设的中断请求信号由该标志位驱动。从外设开始向中断控制器INTC发出中断请求到中断控制器开始向处理器发出中断请求这一过程的延迟为 3 个时钟周期。4中断流程外设/软件中断从产生到处理完成分为以下几个核心阶段外设硬件触发中断事件外设置位中断标志位Flag中断控制器INTC接收请求并仲裁优先级INTC 向处理器Core发出中断请求信号处理器响应中断跳转到中断向量入口软件读取 INTC 确认寄存器IACKR获取中断向量跳转到对应外设的中断服务程序ISR软件清除外设中断标志/使能位完成中断处理处理器执行中断返回指令RFI恢复现场1. 外设硬件触发中断外设如UART、SPI、定时器等内部发生预设事件如接收完成、发送完成、定时溢出、错误事件。外设硬件自动置位其内部的 中断标志位Flag。若该外设的中断使能位Enable未被置位中断请求不会发送给 INTC若已使能则请求信号持续有效。2. INTC 接收请求并仲裁外设向 INTC 发送中断请求信号信号由外设的标志位直接驱动。延迟特性从外设发出请求到 INTC 开始向处理器发送请求固定延迟 3个 INTC 时钟周期。INTC 进行优先级仲裁对比当前中断请求的优先级PRIn由 INTC_PSRn 寄存器配置与处理器当前运行优先级PRI存于 INTC_CPRn 寄存器。若请求优先级高于当前处理器优先级则 INTC 向处理器发送中断请求信号。若存在多个同时请求的中断优先级最高的先被响应。3. 处理器响应中断软件向量模式处理器收到 INTC 的中断请求信号且全局中断使能MSR[EE] 1则响应中断。处理器自动跳转到通用中断向量入口由 IVPR IVOR4 共同计算得出。进入通用中断异常处理程序后软件执行关键操作读取 INTC_IACKRn 寄存器读取操作会自动清除 INTC 向处理器的中断请求信号。读取值包含两部分VTBA向量表基地址和 INTVEC中断向量偏移。两者拼接得到该外设中断服务程序的最终地址。跳转到对应的外设中断服务程序ISR。4. 中断服务程序ISR执行软件处理外设中断事件如读取数据、清除错误标志、更新状态等。关键操作必须清除外设的中断标志位或关闭使能/设置屏蔽位否则中断会反复触发。清除外设标志位直接写外设寄存器的对应位。或关闭外设中断使能位或设置屏蔽位效果与清除标志位相同。5. 中断返回与恢复中断服务程序执行完成后处理器执行 RFIReturn From Interrupt指令。处理器恢复被中断前的上下文如通用寄存器、程序计数器、状态寄存器回到被打断的代码继续执行。INTC 会自动恢复之前被抢占的优先级从 LIFO 栈中弹出 PRI 值。三系统异常和INTC模块初始化流程在工程模板中或者NXP的官方例程中可以看到每次main函数都会首先执行这个xcpth_xmpl()(配置和使能中断函数)我们进去进入这个函数看一下。在xcpth_xmpl()中首先设置了系统异常向量表的基地址再进行了INTC模块的初始化最后使能了外部输入中断片上外设中断和软件中断。下面分别对这三个部分详细介绍1设置系统异常向量表基地址在SetIVPRunsigned intVTABLE函数内可以看到是将VTABLE的地址写到了特殊寄存63也就是IVPR寄存器那么VTABLE的地址是多少呢在vector.c文件中定义了中断向量表Vector Table为 PowerPC 处理器的 16 个中断向量偏移寄存器IVOR0~IVOR15配置了入口地址。PPCASMF( .extern IVOR4_Handler) 的作用是声明外部输入中断处理函数IVOR4_Handler外部输入中断处理函数用于后续分发外设/软件中断。PPCASMF2( .section .core_exceptions_table, axv ) 这是 PowerPC 汇编里的.section伪指令作用是告诉汇编器 / 链接器把后续的代码段放到名为.core_exceptions_table的段中。当外部输入中断发生时处理器响应中断跳转到IVPR IVOR4地址即IVOR4_Vector然后执行e_b IVOR4_Handler跳转到外部输入中断处理函数。IVOR4_Handler在intc_sw_handlers.S文件中用汇编语言写的。中断发生后先保护现场再读取 INTC_IACKR获取外设/软件的中断向量号跳转到对应的外设/软件中断处理函数再恢复现场。2设置系统异常向量表基地址在InitINTC函数中将INTC模块的模式配置为了软件模式将INTC中断向量表的基地址赋给INTC_IACKR0寄存器。3使能外部中断在enableIrq函数中将INTC的CPR0寄存器的PRI为配置为0以关闭掉中断屏蔽然后用汇编指令“wrteei 1”开启MSR寄存器的外部中断使能位。四总结在本章节中先是介绍各种系统异常以及与系统相关的寄存器我们在开发过程中接触最多的是系统异常的外部输入中断。在外部输入中断中分为外设中断和软件中断。需要注意系统异常中断的基地址和偏移地址、外部输入中断的基地址和偏移地址。还有注意理解系统异常和INTC模块的初始化流程有助于加深对MPC5744P中断的运行原理的理解。下图梳理了系统异常中断和外部输入中断的关系