以龙芯2k为例,其I/O中断寄存器分为两种:
- 中断控制寄存器
- 中断路由寄存器
龙芯2k(以下简称ls2k),ls2k在中断分配的区域又细分了几个模块
Mailbox:中断队列寄存器
INTISR:中断状态寄存器,取决于核号
SET/EN/CLR/STATUS:设置/使能状态/清除/查询状态寄存器
intbounce/intauto:中断发布寄存器
杂项寄存器:
isr/en/set/clr:中断状态/使能状态/使能/清除寄存器
ls2k的中断路由寄存器具体是干什么的?
x表示cpu的核号,例如,第一个cpu即为cpu0,每个cpu对应4个队列(Mailbox)。
这四个队列实际上也代表了四个外部中断优先级
为了表示中断在哪个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的中断发布控制寄存器
这个发布寄存器主要是用来处理多核的中断,分为三种模式:
轮转分发,忙碌分发,空闲分发
轮转分发比较简单,有新的中断产生时就直接分配到下一个核,如果后面没有核,则分配至第一个核。
忙碌分发就是看当前核是否忙碌(有中断未被处理),若有,则将新中断分配到下一个核,没有,则在此核中断。
空闲分发就是看当前核是否忙碌(有中断未被处理),若有,则将新中断分配到下一个核,没有,则在此核中断。若都有未被处理的终端,则在初始核进行处理。