龙芯2k1000的中断设计
- 1.前言
- 2.龙芯2k1000的中断描述
- 2.1 mips设计上的通用中断处理
- 2.2 龙芯中断的设计
- 3.龙芯2k1000中断的产生与处理
- 4.龙芯2k1000中断处理概述
1.前言
中断与异常在任何体系架构的芯片上都不会完全一样。在arm的m系列芯片上需要理解NVIC,这个相对较为容易,而对于高端一些的芯片,中断的处理就会复杂许多。比如arm上的gic(Generic Interrupt Controller)。要使用好GIC则需要专门去读这个外设的手册,然后写中断控制。对于MIPS中断控制的处理流程,就是本文描述的重点。
2.龙芯2k1000的中断描述
龙芯2k1000最多支持64个中断的触发源,按照统一方式进行管理。
这64个中断控制器通过可以配置的中断路由可以分配到CPU0与CPU1中。
在这64个中断中又需要按照需要路由到4个队列上。
2.1 mips设计上的通用中断处理
在MIPS的中断设计上,MIPS CPU会设计8个独立中断位。
其中,6个外部中断(IP2 ~ IP7),2个软中断(IP0~IP1)。片上的计数器/定时器会连接到一个硬件中断位上去。
2.2 龙芯中断的设计
对于对于每个核上的IP0~IP3,其对应的是 CP0_Status 的 IP2 到 IP5。IP7用于定时器中断。
在中断设计这一块,这64个中断又可以分为低32位与高32位,对于低32位可以将每个中断路由到CPU0,Mailbox0,也就是对应IP2。对于高32位,可以将每个中断路由到CPU0,Mailbox0,也就是对应IP3。
根据上述的寄存器配置每个中断的路由即可。
3.龙芯2k1000中断的产生与处理
在rt-thread上,将异常处理向量表通过链接脚本放到代码段的头部。
然后通过写中断向量表地址到向量基地址寄存器中。
如果有中断发生,则可以跳转到中断向量表去执行相关的中断处理程序。
MIPS上的中断处理可以读取c0 cause
寄存器,得到mips发生中断或者异常的原因。
因为此时MIPS还只有7个中断信息,需要再次读取龙芯中断控制器的中断,才能准确的得到中断产生的原因。
最后可以通过rt-thread的中断处理的回调函数处理具体的中断信息。
4.龙芯2k1000中断处理概述
龙芯2k1000利用mips上的8个中断位,自己添加了一个中断控制器,该中断控制器可以配置中断的路由方式,比如让其路由到CPU0或者CPU1上,并且可以指定每个中断路由到具体的mailbox上。
根据mailbox的设计,当中断发生时首先通过mips上的c0 casue
大致确定其中断的原因,接着通过龙芯2k1000的中断控制器,读取状态从而分析得到具体的外设中断。
上述则是龙芯2k1000中断处理逻辑。