📄 irqctrl.c
字号:
#include "leon.h"
#include "test.h"
irq_test()
{
extern volatile char irqtbl[];
int i, a, psr;
volatile int marr[4];
volatile int larr[4];
report(IRQ_TEST); /* report test type */
lr->uartctrl1 = 0x0; /* clear uart1 ctrl */
lr->uartctrl2 = 0x0; /* clear uart2 ctrl */
lr->irqmask = 0x0; /* mask all interrupts */
lr->irqclear = -1; /* clear all pending interrupts */
irqtbl[0] = 1; /* init irqtable */
/* test that interrupts are properly prioritised */
lr->irqforce = 0x0fffe; /* force all interrupts */
if (lr->irqforce != 0x0fffe) fail(1); /* check force reg */
lr->irqmask = 0x0fffe; /* unmask all interrupts */
if (lr->irqmask != 0x0fffe) fail(2); /* check mask reg */
while (lr->irqforce) {}; /* wait until all iterrupts are taken */
/* check that all interrupts were take in right order */
if (irqtbl[0] != 16) fail(3);
for (i=1;i<16;i++) { if (irqtbl[i] != (0x20 - i)) fail(4);}
/* test priority of the two interrupt levels */
irqtbl[0] = 1; /* init irqtable */
lr->irqmask = 0xaaaafffe; /* odd irq -> level 1 */
if (lr->irqmask != 0xaaaafffe) fail(5); /* check mask reg */
lr->irqforce = 0x0fffe; /* force all interrupts */
while (lr->irqforce) {}; /* wait until all iterrupts are taken */
/* check that all interrupts were take in right order */
if (irqtbl[0] != 16) fail(6);
for (i=1;i<8;i++) { if (irqtbl[i] != (0x20 - (i*2-1)))
fail(7);}
for (i=2;i<8;i++) { if (irqtbl[i+8] != (0x20 - (i*2)))
fail(8);}
/* check interrupts of multi-cycle instructions */
marr[0] = 1; marr[1] = marr[0]+1; marr[2] = marr[1]+1;
a = marr[2]+1; marr[3] = a; larr[0] = 6;
lr->irqmask = 0x0; /* mask all interrupts */
irqtbl[0] = 1; /* init irqtable */
lr->irqmask = 0x00002; /* unmask interrupt */
#ifdef HWMUL
lr->irqforce = 0x00002; /* force interrupt */
asm("nop;");
marr[0] = a*a*a;
if (marr[0] != 4*4*4) fail(9);
#endif
lr->irqforce = 0x00002; /* force interrupt */
asm("nop;");
larr[1] = larr[0];
if (larr[0] != 6) fail(10);
lr->irqforce = 0x00002; /* force interrupt */
asm("nop;");
larr[1] = 0;
if (larr[1] != 0) fail(11);
while (lr->irqforce) {}; /* wait until all iterrupts are taken */
/* check number of interrupts */
if (irqtbl[0] != 4) fail(13);
lr->irqmask = 0x0; /* mask all interrupts */
/* check that PSR.PIL work properly */
lr->irqforce = 0x0fffe; /* force all interrupts */
irqtbl[0] = 1; /* init irqtable */
psr = getpsr() | (15 << 8);
setpsr(psr); /* PIL = 15 */
lr->irqmask = -1; /* enable all interrupts */
while (!lr->irqmask); /* avoid compiler optimisation */
if (irqtbl[0] != 2) fail(14);
if (irqtbl[1] != 0x1f) fail(15);
setpsr(getpsr() - (1 << 8));
for (i=2;i<16;i++) {
setpsr(getpsr() - (1 << 8));
if (irqtbl[0] != i+1) fail(14);
if (irqtbl[i] != (0x20 - i)) fail(15);
}
/* to be tested: interrupt clear function, real interrupts */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -