Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315781
  • 博文数量: 49
  • 博客积分: 1346
  • 博客等级: 中尉
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-21 01:49
文章分类

全部博文(49)

文章存档

2013年(7)

2012年(12)

2011年(30)

我的朋友

分类: LINUX

2012-02-18 19:21:06

XLP832中断系统

 

1 中断

      MIPS架构的中断使能条件:Status寄存器的IE=1, EXL=0, ERL=0

1.1 MIPS64R2VIEIC模式

       VI模式:CAUSE寄存器中存放的是8个优先级中断,STATUS寄存器中存放的是掩码;

EIC模式:CAUSE寄存器中存放的RIPL,共有63RIPL级别,0表示无中断;STATUS寄存器中存放的是CPL;当RIPL>CPL时才触发中断;

 

因此,标准定义的EIC模式支持63个中断向量,VI模式支持8个中断向量。

1.2 XLP832中断模式

   支持2种中断模式:VI模式和兼容模式;XLP832CONFIG3.VInt永远为1CONFIG3.VEIC永远为0,表示实现了VInt模式,没有实现EIC模式。

1.2.1 VI模式

       XLP832实现了VI(Vectored Interrupt)模式,不支持EIC(External Interrupt Controller)模式,但有外部PIC,可以接收外部中断(160个输入Interrupt Lines)

VI模式开启条件,下面所有条件同时满足:

1) STATUS.BEV0

2) CAUSE.IV1

3) IntCtl.VS1

 

VI模式的默认中断向量起始入口:0xFFFF_FFFF_8000_0200

VectorOffset = 0x200 (VectorNumber x (IntCtl & 0x3E0)),基址位于EBASE寄存器

 

虽然MIPS64R2架构规定的标准VI模式下只有8个中断向量,但XLP832VI模式下,每个硬件线程增加了一对64EIMREIRR寄存器来扩展StatusCause寄存器,从而实现了64个中断向量,采用外部PIC来接收外部中断或内部中断(如PIC内部定时器,IPI)。

注:兼容模式下,EIMREIRR扩展寄存器也是存在且含义依然一样的,和VI模式的区别只是中断向量入口变成了非向量化即一个统一的入口。

1.2.2兼容模式

兼容模式(Compatibility Mode)开启条件,下面任意一个条件满足:

1) STATUS.BEV1

2) CAUSE.IV0

3) IntCtl.VS0

兼容模式模式的默认中断向量入口:

1.3 XLP832PIC

PIC的核心是Interrupt Redirection Table(IRT)IRT可以定义中断分发给哪个硬件线程(Thread,即XLP32个超线程CPU)PIC使用独立的PIC时钟。

 

XLP832 PIC功能:

1) 8个系统定时器,2个看门狗定时器(可配置成NMI看门狗定时器,不同的IRT Entry);

2) 支持IPI

3) 16032IRT,依次对应160个硬件Interrupt Lines

4) 8128ITE(Interrupt Thread Enable),包含了4个节点的128个硬件线程使能位;

5) 64个中断向量;

6) 局部和全局Round-Robin策略分发中断到相应硬件线程。

 

外设的中断请求需要经过PIC时钟进行同步后接收,XLP832 PIC4个节点共享的。

PIC时钟频率66MHz

1.3.1中断触发方式

Level方式

XLP832所有的中断都是level方式高电平触发,level方式向处理器提交中断时会独占请求资源(同时PIC会对此中断请求相关的设备执行assert ACK信号;每一个设备都有独立的ACK信号,assert ACK后此设备的ACK信号产生),当处理器处理完中断请求后系统软件需要回应ACK信号来清除中断源(deassert ACK,软件向64INT_ACK寄存器中写入硬件Interrupt Line-值为0~159;写入后该设备的ACK信号会被清除),当中断源被清除后,本设备的其它中断请求才会继续被接收(即可以申请请求资源了)。

 

Edge方式

level方式与edge方式相比可能会长时间独占中断请求资源,但优点是不会丢失中断;edge方式也是需要中断控制器周期采样高低电平,来决定发生了上升沿还是上降沿中断,如果采样不及时会导致edge方式中断丢失或产生Spurious中断;edge方式优点是不会独占中断请求资源,因此不用回复ACK信号来清除中断源。

 

中断处理过程

Level方式中断由产生到结束的整个过程:

request & pending->arbiter->assert & delivery->service-> de-assert

1) 硬件设备产生中断(request & pending);

2)不同的设备中断请求可能同时到达,PIC接收仲裁负责选择一个合适的请求(arbiter)

3)PIC接收仲裁设置此中断相关的ACK(assert),分发(delivery)请求到目的硬件线程

(通过IRT信息判断);

4)所分发的中断请求被处理(service);

5)处理完成后,系统软件需要通过写相关寄存器(INT_ACK)清除本次中断源(de-assert)

6)2)继续处理下一个中断请求。

注:只有当中断请求的ACK位没有置位时,PIC接收仲裁才会分发此中断请求。

1.3.2 IRT Register

1.3.3 PIC寄存器

XLP832 PIC几类重要的寄存器:

1) 164 bit INT_ACK寄存器

Device 0/8/16/24, Function 4, Register 0x50

2) 16064bit IRT寄存器

Device 0/8/16/24, Function 4, Registers 0xB4 - 0x1F2

3) 164EIRR/EIMR寄存器

  每个硬件线程独立,位于COP0协处理器中

4) 8128bit ITE寄存器(IRT.DTITE模式时,由IRT.DB值选中)

Device 0/8/16/24, Function 4, Register 0x94 - 0xB2

1.3.4 IPI中断

    只有一个IPI中断,通过写IPI_CTRL寄存器在PIC内部产生:

IPI中断没有IRT EntryIPI_CTRL类似于IRT EntryID模式的功能,一次中断可最广播至16个硬件线程(物理CPU的低16个或高16个,DTE可设置掩码)。

IPI中断支持NMI方式,可用于广播NMI Watchdog中断。

1.3.5 System Timers

864bit System Timersmaxcount寄存器,产生中断时,Cause.TI置位,PIC_STATUS.STS[i]置位,PIC_CTRL.STE[i]可以使能这2个寄存器。

定时器中断到来后,系统软件必须写1PIC_STATUS.STS[i]后清除中断。

Count寄存器自动从max寄存器中载入计数值的2个条件(任一个条件满足):

a) PIC_CTRL.STE[i]1即已使能的情况下,系统软件向max寄存器写入数据;

b) count寄存器递减(每个PIC时钟周期值减1)为零。

1.3.6 Watchdog Timers

2Watchdog Timers,可以配置成产生NMI中断。

System Timers相比,多了Heartbeat寄存器用于喂狗和每个硬件线程使能寄存器;当count寄存器递减为0时任一个使能的硬件线程的Heartbeat位为0,表示这个硬件线程的Heartbeat丢失出了问题,就会产生中断;每次count寄存器减为0时会自动将心跳清0后重新从max寄存器载入计数值(64bit),每个硬件线程上运行的系统软件需要在count寄存器减为0之前设置各自的Heartbeat位(通过写入beat-command寄存来设置)。

Count寄存器自动从max寄存器中载入计数值的2个条件(任一个条件满足):

a) PIC_CTRL.WTE[i]1即使能,所有使能的硬件线程的Heartbeat都置位;

b) count寄存器递减(每个PIC时钟周期值减1)为零。

 

Watchdog默认产生NMI中断,NMI wrap-around count默认值为1Reset wrap-around count默认值为2(关于wrap-around count请参考PIC_CTRL寄存器)。

Watchdog产生NMI中断时,会查询其所对应的IRT(参见附录中的IRT Entry2IRT Entry3)CPU0NMI中断处理中可发多次NMI IPI来广播此NMI中断至其它任何硬件线程。

 

After reset, software must follow the sequence below:

1. Program the max-value register to a value that is high enough to allow the slowest

monitored thread to complete its main loop before the count register has decremented to

zero.

2. Enable the watchdog timer by setting a bit in the PIC Control register

3. Enable heartbeats for each thread to be monitored by setting the corresponding

thread-specific bits in the enable registers.

 

测试XLP832 Linux-2.6.32的中断响应时延

#include

struct timespec ipi_delay;

int sysctl_ipicpu = 1;

 

extern int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int wait);

 

static void ipi_delay_func(void *data)

{

    struct timespec ts;

 

    getnstimeofday(&ts);

    ipi_delay = timespec_sub(ts, ipi_delay);

    printk("CPU%d received IPI\n", raw_smp_processor_id()); 

    printk("IPI delay:%lds:%ldns\n", ipi_delay.tv_sec, ipi_delay.tv_nsec);

}

 

static void ipi_trigger()

{

        /* in case of being preempted, but can still be interrupted, so try it multiple times. */

        preempt_disable();

if (sysctl_ipicpu != raw_smp_processor_id() ) {

    smp_call_function_single(sysctl_ipicpu, ipi_delay_func, NULL, 0);

} else {

    preempt_enable();

    printk("The same CPU, please try again");

    return;

}

 

getnstimeofday(&ipi_delay);

printk("CPU%d send IPI success\n\n", raw_smp_processor_id());

preempt_enable();

}

 

测试结果表明:1.2us

 

160 IRT Entries

阅读(2545) | 评论(0) | 转发(0) |
0

上一篇:实时任务带宽控制

下一篇:diablo newwords

给主人留下些什么吧!~~