【TC3xx芯片】TC3xx中断路由IR模块详解

目录

前言

正文

1.功能概述

2. 服务请求节点(SRN)

2.1服务请求控制寄存器

3. 中断请求触发源和SRNs的映射关系

4. 中断控制单元(ICU)

4.1 ICU控制器寄存器

4.2 通用服务请求寄存器及服务请求广播寄存器

4.2.1 通用目的服务请求(GPSRxy)

4.2.2 服务请求广播寄存器(SRBx)

4.2.3 SRBx的访问保护寄存器(ACCEN_SRBx)

5. 仲裁处理

6. 中断处理函数ISR的地址计算


前言

如果熟悉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


声明:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.功能概述

中断系统在中断路由模块中实现,该模块包括服务请求节点 (SRN) ,中断控制单元 (ICU) 以及用于软件开发支持的附加功能。

如图 下图所示,可以生成服务请求的每个模块都连接到中央中断路由模块中的一个或多个 ServiceRequest 节点 (SRN)。 中断路由模块还包括多个通用服务请求节点 (SRN) ,这些节点可用于软件 (SW) 触发的服务请求。 每个 SRN 都包含一个服务请求控制寄存器 (SRC) ,用于配置有关优先级的服务请求,并映射到一个可用的服务提供者。

每个 SRN 都连接到中断路由模块中的所有 ICU ,其中 SRN 控制寄存器设置定义了目标服务提供者和服务请求的优先级。

每个 ICU 处理映射到 ICU 的来自 SRNs 的竞争服务请求之间的中断仲裁。

每个 ICU 都连接到一个服务提供者 (CPU 或 DMA 模块) ,其中 ICU 提供有效的仲裁轮服务请求 /SRN ,服务提供者在处理 ICU 的服务请求时向 ICU 发出信号,并向 ICU 发出信号。

2. 服务请求节点(SRN)

中断路由器模块中的每个服务请求节点 (SRN) 都包含一个服务请求控制 (SRC) 寄存器和接口逻辑,用于将其连接到中断路由模块外部的触发装置和中断路由内部的中断仲裁总线。

2.1服务请求控制寄存器

中断路由模块中的所有服务请求控制寄存器的格式都相同。 一般而言,这些寄存器包括:

. Enable/Disable 信息(SRE)。

. 服务器请求设置位和服务请求清除位(SETR,CLRR)。

. 软件粘滞位 (SWS) 表示软件发起的服务请求。

. 服务请求优先级向量(SRPN)。

. 服务器请求目的地/服务提供者。

. 向安全管理单元 (SMU) 发出完整性错误信号。

. 中断溢出标志位(IOV)。

除了通过硬件由相关触发装置激活外,每个 SRN 还可以通过软件启动的两个服务请求控制位由软件设置或重置。

注意:配置SRN寄存器需要很多的权限,具体的权限配置参考芯片手册。不过,SRN的配置、使能、初始化过程一般都是OS来接管的,对于普通开发者来讲,了解其过程即可。

3. 中断请求触发源和SRNs的映射关系

每一个中断请求都和一个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触发的中断。

4. 中断控制单元(ICU)

中断路由模块中的每个服务提供者(CPU 和 DMA 模块)对应一个 ICU,也就是其中每个 ICU 与一个服务提供者相关。 可以通过 SRN SRCx.TOS 寄存器位字段将 SRNs 映射到其中一个 ICU.

中断控制单元的作用:

. 管理映射到 ICU 的来自 SRNs 的竞争服务请求之间的仲裁。

. 向服务提供者提供仲裁后的获胜者。

. 接收服务提供者提供的接受服务请求的信息。

. 检查接受的服务请求信息 (ECC 检查)。

. 向安全管理单元  (SMU) 发送完整性错误信号。

. 管理相关 SRNs 中已确认服务请求的清除信息。

注意:在当前实施中, ECC 代码仅用于错误检测。 检测到的错误将报告给 SMU ,但未纠正。

4.1 ICU控制器寄存器

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时。

 

4.2 通用服务请求寄存器及服务请求广播寄存器

GPSR(General Purpose Service Requests)用于实现软件中断,因为GPRS没有映射到任何的硬件中断触发事件。

INT 模块提供了多组通用服务请求 (GPSR) ,并提供了一种通过软件并行触发 GPSR 组多个服务请求的机制。

4.2.1 通用目的服务请求(GPSRxy

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

4.2.2 服务请求广播寄存器(SRBx

服务广播寄存器 (SRBx) 可用于并行设置对多个服务提供商 (CPU 或 DMA) 的服务请求。

为每个通用服务请求组 (GPSRxy1) 实施了一个服务请求广播寄存器 (SRBx)。

•服务请求广播寄存器 (SRBx) 可用于并行触发 SRC_GPSRx1 组内的多个服务请求。

•服务请求广播寄存器始终读取为 0 •向 SRBx[y] 写入 ´1´ 将触发服务请求 GPxyXR1)

•向 SRBx[31:6] 写入 ´1´ 不起作用。

4.2.3 SRBx的访问保护寄存器(ACCEN_SRBx

每个 SRBx 寄存器都通过专用 ACCE_SRx0 / ACCE_SRBx1 寄存器集进行写保护:

•每个 SRBx 寄存器都有一个相关的 ACCE_SRBx 寄存器 (x = 相同的数字)

•ACCE_SRBx 的配置定义了允许向相关 SRBx 寄存器写入哪个标签 ID 

•如果存在访问保护违规,写入将被静默忽略,将向 SMU 发送错误信号。

除了发送给 SMU 的信号,不会生成其他错误,中断或陷阱。

用例: ACCEN_SRBx 定义允许向 SRBx 写入哪个标签 ID 以触发通用服务请求组 x 的多个服务请求节点。

5. 仲裁处理

中断模块中的每个 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 ,但未纠正。

6. 中断处理函数ISR的地址计算

中断向量表基地址寄存器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 ().

设置此位。

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车电子嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值