?? isr_test.c
字號:
/* ISR_test.c */
/*********************************************************************
** 文件描述 :SUMSUNG ARM 4510 EVM板的外中斷測試程序,
** 當EINT0 按下時,LED0點亮
** 當EINT1 按下時,LED1點亮
** 當EINT2 按下時,LED2點亮
** 當EINT3 按下時,LED3點亮
** 使 用 :建立downloadable 工程,添加本文件編譯生成.o文件下載到目標機中
** 在windSh中敲入IsrTest()回車,按ENIT0按鍵就會產生中斷,并在控制
** 臺中顯示相應的信息
**********************************************************************/
#include "vxWorks.h"
#include "intLib.h"
#include "taskLib.h"
#include "iv.h"
#include "logLib.h"
/*function prototype*/
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_SENCOND 100
/* interrupt intnum */
#define INT_LVL_EXTINT0 0 /* External Interrupt0 */
#define INT_LVL_EXTINT1 1 /* External Interrupt1 */
#define INT_LVL_EXTINT2 2 /* External Interrupt2 */
#define INT_LVL_EXTINT3 3 /* External Interrupt3 */
#define INT_VEC_EXTINT0 IVEC_TO_INUM(INT_LVL_EXTINT0) /* External Interrupt0*/
#define INT_VEC_EXTINT1 IVEC_TO_INUM(INT_LVL_EXTINT1) /* External Interrupt1*/
#define INT_VEC_EXTINT2 IVEC_TO_INUM(INT_LVL_EXTINT2) /* External Interrupt2*/
#define INT_VEC_EXTINT3 IVEC_TO_INUM(INT_LVL_EXTINT3) /* External Interrupt3*/
#define IOPMOD *(unsigned *)(0x3ff5000)
#define IOPCON *(unsigned *)(0x3ff5004)
#define IOPDATA *(unsigned *)(0x3ff5008)
#define INTMODE *(unsigned *)(0x3ff4000) /*set irq=0 firq=1*/
#define INTPEND *(unsigned *)(0x3ff4004) /*0 clear pend */
#define INTMASK *(unsigned *)(0x3ff4008) /*1 disable 0 enable*/
#define INTOFFSET *(unsigned *)(0x3ff4024)
#define INTPENDTST *(unsigned *)(0x3ff402c)
/********************************************************************
** 函數名稱 : IsrTest
** 功 能 : 啟動中斷捕捉任務
** 入 口 : 無
** 出 口 : 無
** 返 回 : 無。
** 被調函數 : taskSpawn
** 調用函數 :
** 版 本 : V1.0
** 創建日期 : 2006.02.10
** 作 者 :zhyg
** 修改紀錄 :
*********************************************************************/
void IsrTest(void)
{
int i,j,taskId,priority;
STATUS taskAlive;
IOPMOD|=0x0ff; /*led control reg ,set i/o output mode*/
if((taskId=taskSpawn("interruptCatcher",PRIORITY,0x100,20000,(FUNCPTR)interruptCatcher,0,0,0,0,0,0,0,0,0,0))==ERROR)
logMsg("taskSpawn interCatcher failed\n",0,0,0,0,0,0);
for(i=0;i<ITER1;i++)
{
taskDelay(ONE_SENCOND);
if((taskAlive=taskIdVerify(taskId))==OK)
{
logMsg("++++++++interrupt generated\n",0,0,0,0,0,0);
/*if(sysBusIntGen(INTERRUPT_NUM,INTERRUPT_LEVEL)==ERROR)
logMsg("interrupt not generated\n",0,0,0,0,0,0);*/
}
else
break;
}
logMsg("\n*****************interruptGenerator exited **********\n\n\n\n",0,0,0,0,0,0);
}
/*********************************************************************
** 函數名稱 : interruptCatcher
** 功 能 : 中斷捕捉任務,中斷掛接
** 入 口 : 無
** 出 口 : 無
** 返 回 : 無。
** 被調函數 : intConnect() intEnable()
** 調用函數 :
** 版 本 : V1.0
** 創建日期 : 2006.02.10
** 作 者 : zhyg
** 修改紀錄 :
*********************************************************************/
void interruptCatcher(void)
{
int i,j;
STATUS connected;
IOPCON|=0x0b5ad6; /*4個外中斷均打開 */
/*INTMODE&=0xfffffff0;
INTMASK&=0xfffffff0;
INTPEND&=0xfffffff0;*/
/* irq0---EINT0*/
/* irq1---EINT1*/
if((connected=intConnect ( ( VOIDFUNCPTR * )INUM_TO_IVEC(INT_LVL_EXTINT0), (VOIDFUNCPTR)interruptHandler, 0) )==ERROR)
logMsg("intConnect failed\n",0,0,0,0,0,0);
/*使能這中斷0 */
if(intEnable (INT_LVL_EXTINT0)==ERROR)
logMsg("intEnable fail \n",0,0,0,0,0,0);
if((connected=intConnect ( ( VOIDFUNCPTR * )INUM_TO_IVEC(INT_LVL_EXTINT1), (VOIDFUNCPTR)interruptHandler, 1 ) )==ERROR)
logMsg("intConnect failed\n",0,0,0,0,0,0);
/*使能這中斷1 */
if(intEnable (INT_LVL_EXTINT1)==ERROR)
logMsg("intEnable fail \n",0,0,0,0,0,0);
if((connected=intConnect ( ( VOIDFUNCPTR * )INUM_TO_IVEC(INT_LVL_EXTINT2), (VOIDFUNCPTR)interruptHandler, 2) )==ERROR)
logMsg("intConnect failed\n",0,0,0,0,0,0);
/*使能這中斷2 */
if(intEnable (INT_LVL_EXTINT2)==ERROR)
logMsg("intEnable fail \n",0,0,0,0,0,0);
if((connected=intConnect ( ( VOIDFUNCPTR * )INUM_TO_IVEC(INT_LVL_EXTINT3), (VOIDFUNCPTR)interruptHandler, 3 ) )==ERROR)
logMsg("intConnect failed\n",0,0,0,0,0,0);
/*使能這中斷3 */
if(intEnable (INT_LVL_EXTINT3)==ERROR)
logMsg("intEnable fail \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);
}
logMsg("\n++++++++++++interruptCatcher exited +++++\n",0,0,0,0,0,0);
}
/*********************************************************************
** 函數名稱 : interruptHandler
** 功 能 : 中斷服務程序,4個外中斷掛接到本服務程序上,通過arg 區分
** 入 口 : int arg 識別外中斷的號
** 出 口 : 無
** 返 回 : 無。
** 被調函數 : logMsg();
** 調用函數 :
** 版 本 : V1.0
** 創建日期 : 2006.02.10
** 作 者 : zhyg
** 修改紀錄 :
*********************************************************************/
void interruptHandler(int arg)
{
int i;
switch(arg)
{
case 0:
IOPDATA=~(1);
break;
case 1:
IOPDATA=~(1<<1);
break;
case 2:
IOPDATA=~(1<<2);
break;
case 3:
IOPDATA=~(1<<3);
break;
default:
IOPDATA=0xff;
}
logMsg("--------------interrupt caught%d\n",arg,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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -