前言
如果熟悉ARM Cotex-M4架构,则我们知道ARM架构的芯片都有一个中断控制器(NVIC, Nested Vectored Interrupt Controller)来管理中断,中断控制器使用中断向量表来管理中断,每个中断对应一个唯一的中断向量,在中断触发的时候,NVIC会根据中断向量找到对应的中断服务程序(Interrupt Service Routine, ISR)来进行中断处理。外设模块都有一个或几个固定的中断号。
而英飞凌Infineon芯片具有自己独立的Tricore架构,来自外部资源、内部资源或者软件的中断请求在Tricore架构里面叫做服务请求(service requests),响应中断的CPU或者DMA在Tricore架构中叫做服务提供者(Service Provider)。
缩略词
简写 | 全称 |
IR | Interrupt Router |
SRN | Service Request Node |
ISP | Interrupt Service Provider |
ICU | Interrupt Control Unit |
TOS | Type of Service |
GPSR | General Purpose Service Request |
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
中断系统在中断路由模块中实现,该模块包括服务请求节点 (SRN) ,中断控制单元 (ICU) 以及用于软件开发支持的附加功能。
如图 下图所示,可以生成服务请求的每个模块都连接到中央中断路由模块中的一个或多个 ServiceRequest 节点 (SRN)。 中断路由模块还包括多个通用服务请求节点 (SRN) ,这些节点可用于软件 (SW) 触发的服务请求。 每个 SRN 都包含一个服务请求控制寄存器 (SRC) ,用于配置有关优先级的服务请求,并映射到一个可用的服务提供者。
每个 SRN 都连接到中断路由模块中的所有 ICU ,其中 SRN 控制寄存器设置定义了目标服务提供者和服务请求的优先级。
每个 ICU 处理映射到 ICU 的来自 SRNs 的竞争服务请求之间的中断仲裁。
每个 ICU 都连接到一个服务提供者 (CPU 或 DMA 模块) ,其中 ICU 提供有效的仲裁轮服务请求 /SRN ,服务提供者在处理 ICU 的服务请求时向 ICU 发出信号,并向 ICU 发出信号。
中断路由器模块中的每个服务请求节点 (SRN) 都包含一个服务请求控制 (SRC) 寄存器和接口逻辑,用于将其连接到中断路由模块外部的触发装置和中断路由内部的中断仲裁总线。
中断路由模块中的所有服务请求控制寄存器的格式都相同。 一般而言,这些寄存器包括:
. Enable/Disable 信息(SRE)。
. 服务器请求设置位和服务请求清除位(SETR,CLRR)。
. 软件粘滞位 (SWS) 表示软件发起的服务请求。
. 服务请求优先级向量(SRPN)。
. 服务器请求目的地/服务提供者。
. 向安全管理单元 (SMU) 发出完整性错误信号。
. 中断溢出标志位(IOV)。
除了通过硬件由相关触发装置激活外,每个 SRN 还可以通过软件启动的两个服务请求控制位由软件设置或重置。
注意:配置SRN寄存器需要很多的权限,具体的权限配置参考芯片手册。不过,SRN的配置、使能、初始化过程一般都是OS来接管的,对于普通开发者来讲,了解其过程即可。
每一个中断请求都和一个SRN一一对应,比如:
对于CAN12,也就是CAN1INT2,对应SRC为SRC_CAN1INT2,对应的SRC地址为:
0x5B0 +1*0x40 + 2*4 = 0x5F8
在AUTOSAR配置工具(Davinci)中需要配置Os的ISR如下:
每个中断请求都对应中断向量表中的一个中断向量索引,vector[index],也对应一个SRN[index],index计算公式如下:
Index (SRC) = (SRC Address Offset) / 4
举例:
0x5F8 / 0x4 = 370
则,CAN12的中断在中断向量表中的位置为:Interrupt Vector[370],对应的SRN为SRN[370].
注意:Aurix芯片中的CAN模块的每一个硬件单元不区分Can_Rx还是 Can_Tx中断,统一都是一个中断Trigger,也就对应一个SRN,也就是对应一个ISR(中断服务例程/程序),在中断服务程序中区分是Can_Tx/Can_Rx/Can_BusOff触发的中断。
中断路由模块中的每个服务提供者(CPU 和 DMA 模块)对应一个 ICU,也就是其中每个 ICU 与一个服务提供者相关。 可以通过 SRN SRCx.TOS 寄存器位字段将 SRNs 映射到其中一个 ICU.
中断控制单元的作用:
. 管理映射到 ICU 的来自 SRNs 的竞争服务请求之间的仲裁。
. 向服务提供者提供仲裁后的获胜者。
. 接收服务提供者提供的接受服务请求的信息。
. 检查接受的服务请求信息 (ECC 检查)。
. 向安全管理单元 (SMU) 发送完整性错误信号。
. 管理相关 SRNs 中已确认服务请求的清除信息。
注意:在当前实施中, ECC 代码仅用于错误检测。 检测到的错误将报告给 SMU ,但未纠正。
ICU模块通过LWSR(Latest Winning Service Request )寄存器将SRC仲裁后的Winner信息提供给ISP(Interrupt Service Provider, CPU or DMA)。
ICU模块通过LASR(Last Acknowledged Service Request)寄存器从ISP获取ISP已经接接受/处理的SR信息。
ECR(Error Capture Register)寄存器捕获(Captures)LASR寄存器内容,当ICU检测到ECC Error时。
GPSR(General Purpose Service Requests)用于实现软件中断,因为GPRS没有映射到任何的硬件中断触发事件。
INT 模块提供了多组通用服务请求 (GPSR) ,并提供了一种通过软件并行触发 GPSR 组多个服务请求的机制。
INT 模块提供多组通用服务请求:
•每个通用服务请求组由八个服务请求节点组成。
•通用服务请求的名称是 SRC_GPSRxy) 。
•GPSR 用于软件中断 (未映射到硬件服务请求触发器)。
•GPSR 只能通过向相关 SRC_GPSRxy.SETR1 写入 ´1´ 或向 SRBx[y] 中的相关服务请求广播寄存器位写入 ´1´来触发)。
SRC_GPSRxy: x = group number; y= number of interrupt within the group, y=0:7
服务广播寄存器 (SRBx) 可用于并行设置对多个服务提供商 (CPU 或 DMA) 的服务请求。
为每个通用服务请求组 (GPSRxy1) 实施了一个服务请求广播寄存器 (SRBx)。
•服务请求广播寄存器 (SRBx) 可用于并行触发 SRC_GPSRx1 组内的多个服务请求。
•服务请求广播寄存器始终读取为 0 •向 SRBx[y] 写入 ´1´ 将触发服务请求 GPxyXR1)
•向 SRBx[31:6] 写入 ´1´ 不起作用。
每个 SRBx 寄存器都通过专用 ACCE_SRx0 / ACCE_SRBx1 寄存器集进行写保护:
•每个 SRBx 寄存器都有一个相关的 ACCE_SRBx 寄存器 (x = 相同的数字)
•ACCE_SRBx 的配置定义了允许向相关 SRBx 寄存器写入哪个标签 ID
•如果存在访问保护违规,写入将被静默忽略,将向 SMU 发送错误信号。
除了发送给 SMU 的信号,不会生成其他错误,中断或陷阱。
用例: ACCEN_SRBx 定义允许向 SRBx 写入哪个标签 ID 以触发通用服务请求组 x 的多个服务请求节点。
中断模块中的每个 ICU 都有自己的中断总线。 通过 SRC.TOS 位字段设置将每个服务请求节点 (SRN) 映射到相关的 ICU / 中断总线,可以将其定向到一个服务提供者。
在第一个待决服务请求中,相关中断总线正在启动第一个仲裁过程。 相关中断控制单元提供了赢得最后一个仲裁过程的服务请求。
仲裁过程使用 3-4 个系统外围总线时钟周期来确定优先级最高的服务请求 SRPN。
在仲裁过程中,中断总线将比较所有待定服务请求节点的 SRC.SRPN 位字段,这些节点通过 SRC.TOS 设置映射到此中断总线。 在仲裁过程中,优先级最高的未决服务请求被确定为获奖者,相关的 SRN 服务请求控制寄存器位字段值 SRPN , ECC 和 SRN 索引将提供给 ICU。 ICU 向服务提供商提供这些 (SRPN , ECC , SRN 索引) 。 ICU 在收到服务提供商的这些信息并进行确认后,会执行 ECC 检查。 ECC 检查通过接收到的值完成: ECC , SRPN , SRN 索引号,假定 SRE 位为´1´ (启用 SRN) 和 ICU 的 TOS 号。
中断路由器模块向安全管理单元发出检测到的错误信号 (SMU 中的一个位,涵盖所有 SRN 和 ICU 的错误)。
注意:在当前实施中, ECC 代码仅用于错误检测。 检测到的错误将报告给 SMU ,但未纠正。
中断向量表基地址寄存器BIV的[VSS]域标识使用的是32 字节向量空间,还是8字节向量空间。
注意:AUTOSAR架构下,如果使用Vector的OS,BIV寄存器的初始值需要用户配置,Vector的MICRSOS不会配置BIV寄存器,且BIV寄存器是受EndInit保护的。
ICU仲裁SRN的中断服务器请求后,会通过ICR(ICU Interrupt Control)寄存器给CPU发送中断请求(如果TOS选择的是CPU而不是DMA)。
CPU判断BIV.VSS,然后根据ICR. PIPN来计算ISR地址:
a) 方案
BIV.VSS == 0, 32byte向量。ISR地址 == ICR. PIPN << 5 | BIV
b) 方案
BIV.VSS == 1, 8字节向量。ISR地址 == ICR. PIPN << 3 | BIV
C) 方案
PIPN不在有用,只有一个Vector地址。
通过使用 32 字节配置,小型中断例程可以直接实施到矢量表中。
它们甚至可以跨越多个矢量条目 (请参见 TriCore Architecture Manual)。 如果矢量表可以位于 TriCore 程序侧内存中,则此类快速中断处理非常有用。 8 字节配置会减小矢量表的大小。 每个引导程序条目只包含一个跳转指令或一个调用,并返回为 16 位操作代码指令。 TriCore 编译器支持通过关键字或函数生成这种中断向量表。 如果 BIV 掩码 PIPN ,以便任何中断地址计算都将产生相同的地址,则可以配置最小矢量表。 例如:
__mtcr(BIV,0x80000001 | 0xFF<<3); // move to core register BIV
这将配置 BIV 寄存器使用函数中断处理程序所在的通用单个条目,通过使用函数指针数组将其分支到特定中断例程。 如果使用指向阵列的指针,则可以快速切换阵列。
C方案示例代码:
void (*isr_pointer_array[256])(void);
void (**isr) (void) = isr_pointer_array;
void interruptHandlerInstall(long int SRprio, long int addr)
{*isr_pointer_array[SRprio]=addr; }
void interruptHandler(void)
{isr[__mfcr(ICR)& 0xFF]();
asm (" rfe"); // return from event}
(Line 1) define ISR pointer array. Max. 255 interrupts possible.
(Line 2) define pointer which points to the start of the isr_pointer_array.
(Line 3) start of function interruptHandlerInstall. This function installs the interrupts in the array. Necessary
information are the interrupt priority and ISR entry address.
(Line 4) This line stores the ISR entry address in the array.
(Line 5 and 6) This function branches to the specific interrupt routine and gets called immediately after an interrupt occurs.
(Line 7) This line gives the return command, after the ISR has been processed.
中断条目地址存储在数据数组中,而不是将值编码到指令中。 函数 interruptHandlerInstall组织该数组中中断的安装。这种矢量表生成有时比8字节配置更灵活,不需要任何特定的编译器支持中断。
注意:在中断发生之前,必须全局启用中断系统。 中断控制寄存器 (ICR) 包含启用 CPU 服务请求系统的全局中断启用位 (ICR.IE)。 大多数编译器支持以下属性 (或类似属性) :
__enable ().
设置此位。
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。 目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
TC3xx芯片GTM模块-CMU,CCM,TBU详解
TC3xx芯片GTM模块-TOM详解
AUTOSAR架构下PWM模块配置实践
TC3xx芯片GTM模块-TIM详解
AUTOSAR架构下ICU模块配置实践
TC3xx芯片电源管理系统PMS详解
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号