从龙芯2K1000看MIPS中断架构

以龙芯2k为例,其I/O中断寄存器分为两种:

  • 中断控制寄存器
  • 中断路由寄存器

龙芯2k(以下简称ls2k),ls2k在中断分配的区域又细分了几个模块

Mailbox:中断队列寄存器
INTISR:中断状态寄存器,取决于核号
SET/EN/CLR/STATUS:设置/使能状态/清除/查询状态寄存器

intbounce/intauto:中断发布寄存器
杂项寄存器:
isr/en/set/clr:中断状态/使能状态/使能/清除寄存器

ls2k的中断路由寄存器具体是干什么的?

CPUx
Mailbox0
Mailbox1
Mailbox2
Mailbox3

x表示cpu的核号,例如,第一个cpu即为cpu0,每个cpu对应4个队列(Mailbox)。
这四个队列实际上也代表了四个外部中断优先级

IP0--软件中断
IP1--软件中断
IP2--外部中断
Mailbox0
IP3--外部中断
Mailbox1
IP4--外部中断
Mailbox2
IP5--外部中断
Mailbox3
IP6--IPI核间中断
IP7--系统定时器中断

为了表示中断在哪个CPU下的队列,我们采用了中断路由寄存器这个东西
它可以让指定的中断源绑定到具体的某个CPU的某个队列中。
比如我的I2C0中断源想绑定在核0的3队列-优先级IP5

那么找到I2C0中断路由寄存器的地址(如:0x1fe11416)填充这样的内容:0x81

7位 6位 5位 4位 3位 2位 1位 0位
1 0 0 0 0 0 0 1
BUF3 BUF2 BUF1 BUF0 CPU3 CPU2 CPU1 CPU0

当配置完中断路由寄存器的时候,其实还没完事,因为中断源是否使能还没有设置

ls2k的中断控制寄存器

例如,查询手册,I2C0的中断源使能状态是在22位;
clr低32位地址0x1fe1142c,clr高32位地址0x1fe1146c;
set低32位地址0x1fe11428,set高32位地址0x1fe11468;
en低32位地址0x1fe11424,en高32位地址0x1fe11464;

那么你要先清使能;

0x1fe1142c的22位置1

设置源开启;
0x1fe11428的22位置1

检验开启是否成功;
读取0x1fe11424的22位

ls2k的中断发布控制寄存器

这个发布寄存器主要是用来处理多核的中断,分为三种模式:
轮转分发,忙碌分发,空闲分发

轮转分发比较简单,有新的中断产生时就直接分配到下一个核,如果后面没有核,则分配至第一个核。

忙碌分发就是看当前核是否忙碌(有中断未被处理),若有,则将新中断分配到下一个核,没有,则在此核中断。

空闲分发就是看当前核是否忙碌(有中断未被处理),若有,则将新中断分配到下一个核,没有,则在此核中断。若都有未被处理的终端,则在初始核进行处理。

猜你喜欢

转载自blog.csdn.net/weixin_44076906/article/details/107176296