?? irq.c
字號:
/*****************************************************************************
* 中斷服務程序設置
******************************************************************************/
#include "define.h"
#if INTERRPUT_EN
/******************************************************************************
** 函數名: DefaultVICHandler
**
** 函數功能: 默認的VIC中斷處理,用于處理偽中斷.
** 如果中斷服務程序讀VICaddress 寄存器, 而IRQ slot 響應如下描述將返回這個地址.
** 入口參數:
** 出口參數:
**
******************************************************************************/
void DefaultVICHandler (void) __irq
{
/*如果IRQ沒有裝入VIC, 而中斷產生,這個默認的VIC address 將會北使用. 這將會產生無限循環.
在調試中用這個死循環進行調試跟蹤. */
VICVectAddr = 0;
while ( 1 );
}
/******************************************************************************
** 函數名 : init_VIC
**
** 功能描述: 初始化VIC interrupt 控制器.
**
******************************************************************************/
void init_VIC(void)
{
uint8 i = 0;
uint32 *vect_addr, *vect_cntl;
/* 初始化 VIC*/
VICIntEnClr = 0xffffffff; /*清所有中斷*/
VICVectAddr = 0;
VICIntSelect = 0;
/*設置所有中斷向量為0 */
for ( i = 0; i < VIC_SIZE; i++ )
{
vect_addr = (uint32 *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
vect_cntl = (uint32 *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
*vect_addr = 0;
*vect_cntl = 0;
}
/* 裝入默認的中斷處理地址*/
VICDefVectAddr = (uint32*)DefaultVICHandler;
}
/******************************************************************************
** 函數名: install_irq
**
** 功能描述: 裝入中斷處理,最大數目為16, 但這里有32個中斷功能. 所以不能同時裝入所有服務.
** 對中斷請求的規則是先發生服務
** 入口參數: 中斷號和中斷服務地址
** 出口參數: 0或者1
**
******************************************************************************/
boolen install_irq( uint8 IntNumber, void *HandlerAddr )
{
uint8 i;
uint32 *vect_addr;
uint32 *vect_cntl;
VICIntEnClr = 1 << IntNumber; /* 禁止中斷 */
for ( i = 0; i < VIC_SIZE; i++ )
{
/* 找出第一個未分配服務地址 */
vect_addr = (uint32 *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
vect_cntl = (uint32 *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
if ( *vect_addr == (uint32)NULL )
{
*vect_addr = (uint32)HandlerAddr; /* 設置中斷向量 */
*vect_cntl = (uint32)(IRQ_SLOT_EN | IntNumber);
break;
}
}
if ( i == VIC_SIZE )
{
return( FALSE ); /* 沒有空的vector slot */
}
VICIntEnable = 1 << IntNumber; /* 使能Interrupt */
return( TRUE );
}
/******************************************************************************
** 函數名: uninstall_irq
**
** 功能描述: 卸載中斷處理
** 通過中斷號找到該服務地址, 并設置為空來實現卸載.
** 入口參數: 中斷號
**出口參數: 0、1成功與否
**
******************************************************************************/
boolen uninstall_irq( uint8 IntNumber )
{
uint8 i;
uint32 *vect_addr;
uint32 *vect_cntl;
VICIntEnClr = 1 << IntNumber;
for ( i = 0; i < VIC_SIZE; i++ )
{
/* 找到第一個未分配的VIC address */
vect_addr = (uint32 *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
vect_cntl = (uint32 *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
if ( (*vect_cntl & ~IRQ_SLOT_EN ) == IntNumber )
{
*vect_addr = (uint32)NULL; /* 清VIC地址 */
*vect_cntl &= ~IRQ_SLOT_EN; /*清使能位 */
break;
}
}
if ( i == VIC_SIZE )
{
return( FALSE );
}
VICIntEnable = 1 << IntNumber;
return( TRUE );
}
#endif
/******************************************************************************
** End Of File
******************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -