⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irqctrl.c

📁 一个航天航空用的Sparc处理器(配美国欧洲宇航局用的R_tems嵌入式操作系统)的VHDL源代码
💻 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 + -