所谓中断处理过程简单来说就是中断控制器采样SOC中各个IP产生的中断信号,经过自身仲裁,mask等功能后选出优先级最高的中断信号送给CPU,CPU在接收到中断信号后保存上下文,然后获得中断服务程序地址并跳转执行预先设定好的中断服务程序的过程。
本文介绍的PL92是arm公司推出的一款中断控制器。与GIC相比最大的区别就是提供了硬件VIC port可供CPU直接获得中断服务地址。更加快速响应中断。同时支持AHB seq获得中断服务地址。
🌿PL192 main function:
- 从中断控制器确定哪个中断源正在请求服务(vic port 或 ahb seq)
- 确定该中断源的服务例程加载到何处(Isr)
- 在重新启用处理器中断之前允许正在处理的中断程序被另一个更高优先级的中断抢占,理论上最多支持15层中断嵌套。
🌴main features
- 输出中断分irq与fiq,fiq具有最高的优先级。
- 支持32 intsource.优先级仲裁software分0~15级,0级优先级最高。只有软件优先级支持中断嵌套。
- 软件可选择产生中断,或mask中断源。 每一个中断源都支持软件和hwmask(对外不可见)。且mask互不影响,之间为&的关系。
- 支持优先级软件编程和优先级bar mask(对每一个level的软件优先级可进行mask)。
- 支持ISR addr 输出。
如下是arm官方给出的features描述
主要功能解析
上图为VIC工作原理的一个简易流程图。
中断源intsource[31:0] or softint[31:0](VICSOFTINT/ SOFTINTCLEAR 寄存器可配置)产生中断,会送给RAWINT寄存器,经过INTENABLE判断使能后送给IRQSTATUS寄存器,经过INTSELECT判断送给FIQSTATUS寄存器,并送到输出端口FIQ,然后中断经过swmask和hwmask组成的优先级仲裁逻辑判断送出irq。
优先级仲裁逻辑问题:
硬件优先级:每一个进入VIC的中断都有一个中断index号,index号越小表示优先级越高,此优先级我们称之为硬件优先级。如外部送入0–31个中断,就代表0–31个硬件优先级。此硬件优先级只有在软件优先级相同的情况下才产生作用。
软件优先级:软件优先级是进入VIC的每一个中断都可以使用VICPRIORITY寄存器配置他们的软件优先级,软件优先级共有0~15共16个级别。0为最高优先级。
vic的仲裁宗旨就是在任何时刻都保证选择出优先级做高的中断出来,送给CPU触发中断信号并提供此中断号的中断服务程序地址。所有进入VIC的中断号首先经过软件优先级仲裁,低优先级组的中断被mask住,然后再经过硬件优先级仲裁选择出同等软件优先级里面硬件优先级最高的中断,然后送给CPU。
中断嵌套问题:
假如vic选择出了此刻优先级最高的中断送给CPU,并且CPU正在处理此中断服务程序。但是并没有退出中断服务程序,这时VIC 接收到了另外一个优先级更高的中断。就会产生中断嵌套。注意这里的优先级更高指的是软件优先级,因为只有软件优先级支持中断嵌套。硬件INDEX号的优先级只在软件优先级相同的情况下发生作用。假若产生了中断嵌套,CPU会像处理正常程序一样保存此时中断程序的上下文,然后跳转去执行更高优先级的中断服务程序。这里有一个问题需要注意,就是软件优先级相同的情况下,这时候送过来一个硬件优先级更高的中断并不会造成嵌套。
上图为cortex-R5处理器在CPU端处理中断的流程图,VE为CPU选择硬件读中断(通过vic port)还是软件读中断(AHB seq),同时在CPU端可以通过配置F和I来控制是否mask fiq 或是irq,V则是用来配置CPU跳转的中断服务程序地址。
使用AHB的向量中断流序列(irq)
- 发生中断。
- ARM 处理器分支到 IRQ 中断向量。
- 读取 VICADDRESS寄存器并跳转到中断服务程序。读取VICADDRESS寄存器更新中断控制器的硬件优先级寄存器。
- 堆叠工作区,以便可以重新启用 IRQ中断。
- 在处理器上启用 IRQ 中断,以便更高的优先级服务。
- 执行中断服务程序(ISR)。
- 清除外设中的请求中断,或写入VICSOFTINTCLEAR 注册请求是否由软件生成打断。
- 禁用处理器上的中断并恢复工作区。
- 写入VICADDRESS 寄存器。这将清除相应的中断内部中断优先级硬件
- 从中断返回。这将重新启用中断。
FIQ中断流程序列
- 发生 FIQ 中断。
- ARM 处理器分支到 FIQ 中断向量。
- 分支到 ISR。
- 执行 ISR。
- 清除外设中的请求中断,或写入VICSOFTINTCLEAR (若中断请求是软件产生)。
- 禁用中断并恢复工作区。
- 从中断返回。这将重新启用中断
如果使用上述流程,则不得读取或写入 VICADDRESS 寄存器
使用VIC port的向量irq中断流程序列
该接口用于访问向量中断地址并在不使用 AHB 的情况下确认中断服务,减少中断延时。使用 VIC 端口获取向量中断地址减少了服务中断所需的时间延迟,因为处理器没有访问 AHB 以读VICADDRESS 寄存器的时间
- 确保在 ARM设置了寄存器 VE =1(VIC 启用)。如果该位清零,则处理器跳转到旧向量地址(0x00000018或0xFFFF0018)并且不启动VICIRQACK ,VICVECTADDRV 握手(当SOC接收到irq request,发送irqack应答,vic将addr_vld信号和isrmem_addr给到soc,完成一次中断握手)。
- 发生 IRQ中断。
- 使用VICIRQACK与VIC 执行握手和VICVECTADDRV信号更新硬件优先级寄存器中断控制器,包括通过读取向量地址VICVECTADDROUT端口。跳转到中断服务程序时握手结束。当一个 IRQ 被触发时,这个操作由处理器自动执行。
- 堆叠工作区,以便可以重新启用 IRQ 中断。
- 启用 IRQ 中断,以便可以服务更高的优先级。
- 执行 ISR。
- 清除外设中的请求中断,或写入VICSOFTINTCLEAR (若中断是由软件产生)。
- 禁用中断并恢复工作区。
- 写入 VICADDRESS寄存器。这将清除相应的中断内部中断优先级硬件。
- 从中断返回。这将重新启用中断。
下图为VIC与CPU使用vic port的握手图
❓Q&A
HWMASK是如何工作的?
当出现VICIRQACK上升沿,或者读VICADDRESS 地址时,hwmask使能,会mask掉相同和更低的软件优先级中断。使得更高的硬件优先级中断可以被嵌套。
读取 VICADDRESS 寄存器后,当前和较低优先级的中断输出mask。但是,VICIRQSTATUS(与intsel与 intenb有关)和VICRAWINT 寄存器不受影响。
当中断程序已完成且 VICADDRESS 寄存器已写入,HWMASK被清除以允许所有启用的中断源通过。
在中断处理过程中可以修改中断优先级吗?
可以修改但是可能引起未知的error,应该避免在中断处理过程中修改优先级
在中断请求时处理器在处理一个更高优先级的中断,而处理器在响应这个中断之前,中断挂起状态被取消了,该请求还能得到响应吗?
不可以
VIC 是否可同时支持脉冲中断请求和电平中断请求?
不可以 只支持电平中断请求
VICVECTADDR寄存器的介绍
提供当前正在处理的中断服务程序的地址,该值也可以同时体现在vicvectaddr[0:31]端口,供vic port使用。该值来自保存着所有中断服务程序地址的memory map,如果当前没有中断处理,则保存前一个活动的中断地址,复位值为0x00000000。
读取该寄存器①会返回 ISR 的地址并将当前中断设置为被服务。②mask相同或更低等级的中断③重新拉高irq,以保证更高优先级的中断可以被送过来。只有在有活动中断时才能执行读取。
写入该寄存器任何值都会清除相应的内部中断优先级硬件。以更新硬件优先级。写操作只能是在中断服务程序结束时执行。
(可选)Timeout运行机制是什么?
time out 使能后,当VIC触发irq_b or fiq_b 到cpu,如果达到一定clk_cnt cpu还未响应vic,则触发time out 机制,irq_b 会同时送给fiq_b,fiq_b会同时送给irq_b,并触发vic time out 中断
所有的FIQ都使用同一个中断服务程序地址。
当中断处于处理状态时,处理器不会在中断完成和异常退出之前再次接受同一个中断。
感谢您的阅读,如有错误请联系指正。原创不易,转载请注明出处,感谢。