isr.c

来自「嵌入式VxWorks开发所需典型例程源代码」· C语言 代码 · 共 82 行

C
82
字号
/* includes */
#include "vxWorks.h"
#include "intLib.h"
#include "taskLib.h"
#include "logLib.h"
#include "sysLib.h"
#include "iv.h"
#include "arch\i86\ivi86.h"
/*#include "intArchLib.h"*/


/* function prototypes */
void interruptHandler(int);
void interruptCatcher(void);
 
/* globals */
#define INTERRUPT_NUM 2
#define INTERRUPT_LEVEL 65
#define ITER1 40
#define LONG_TIME 1000000
#define PRIORITY 100
#define ONE_SECOND 100

void interruptGenerator(void) /* task to generate the SIGINT signal */
{
	int i,taskId;
	STATUS taskAlive;

	if((taskId = taskSpawn("interruptCatcher",PRIORITY,0x100,20000,(FUNCPTR)interruptCatcher,0,0,0,0,0,0,0,
				0,0,0)) == ERROR)
		logMsg("taskSpawn interruptCatcher failed\n",0,0,0,0,0,0);

	for (i=0; i < ITER1; i++)
	{
		taskDelay(ONE_SECOND);/* suspend interruptGenerator for one second */
		/* check to see if interruptCatcher task is alive! */
		if ((taskAlive = taskIdVerify(taskId)) == OK)
    		{ 		
    			logMsg("++++++++++++++++++++++++++Interrupt generated\n",0,0,0,0,0,0);   	
    			/* generate hardware interrupt 2 */
    			if((sysBusIntGen(INTERRUPT_NUM,INTERRUPT_LEVEL)) == ERROR)	 
    				logMsg("Interrupt not generated\n",0,0,0,0,0,0);   			
    		}
    		else  /* interruptCatcher is dead */
    		{
    			logMsg("Sorry , the interruptCatcher is dead\n",0,0,0,0,0,0);
    			break;
    		}
	}  
	logMsg("\n***************interruptGenerator Exited***************\n\n\n\n",0,0,0,0,0,0);
}

void interruptCatcher(void) /* task to handle the interrupt */
{
	int i, j;
	STATUS connected;

	/* connect the interrupt vector, INTERRUPT_LEVEL, to a specific interrupt 
	handler routine ,interruptHandler,  and pass an argument, i */ 
	if((connected = intConnect(INUM_TO_IVEC(INTERRUPT_LEVEL),(VOIDFUNCPTR)interruptHandler,i)) == ERROR)
		logMsg("intConnect failed\n",0,0,0,0,0,0);

	for (i=0; i < ITER1; i++)
  	{
    		for (j=0; j < LONG_TIME; j++);
    		logMsg("Normal processing in interruptCatcher\n",0,0,0,0,0,0);
    		taskDelay(10);
    	}	 	
	logMsg("\n+++++++++interruptCatcher Exited+++++\n",0,0,0,0,0,0);
}

void interruptHandler(int arg)  /* signal handler code */
{
	int i;

	logMsg("---------------interrupt caught\n",0,0,0,0,0,0);
	for (i=0; i < 5; i++)
		logMsg("interrupt processing\n",0,0,0,0,0,0);
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?