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

📄 isr.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/

/*****************************************************
文件说明:中断服务例程管理
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
******************************************************/

#include <eframe.h> 
#include <estring.h>
#include <eassert.h>
#include <epcore.h>
#include <sysintr.h>

typedef struct _ISR_DATA
{
    LPISR lpISRFun;  //中断服务例程入口
	DWORD dwISRHandle;  //中断服务例程参数
}ISR_DATA;

int iISRActiveCount = 0;
BYTE bISRActives[SYSINTR_MAXIMUM];
BYTE bISRMasks[SYSINTR_MAXIMUM];   // used by DisableISR and EnableISR

#define MAX_MASK_COUNT 255
static BYTE nISRMaskCount[SYSINTR_MAXIMUM];
static ISR_DATA isrData[SYSINTR_MAXIMUM];

/**************************************************
声明:void CALLBACK ISR_Error( DWORD dwHandle )
参数:
	IN dwHandle - 中断服务例程参数,该参数为调用ISR_RegisterServer所传递的参数
  
返回值:
功能描述:
	中断服务例程默认处理函数
引用: 
************************************************/
static void CALLBACK ISR_DefHandler( DWORD dwHandle )
{// a error is hapend
	dwHandle++;
}

/**************************************************
声明:void ISR_Disable( UINT nIndex )
参数:
	IN nIndex - 中断服务例程索引
  
返回值:
功能描述:
	屏蔽索引指向的中断服务例程,当产生中断时,不会调用索引指向的中断服务例程,
	每调用一次该函数,该函数会增加对应的屏蔽计数器
引用: 
************************************************/

void ISR_Disable( UINT nIndex )
{
	ASSERT( nIndex < SYSINTR_MAXIMUM );
    if( nISRMaskCount[nIndex] < MAX_MASK_COUNT ) 
	    nISRMaskCount[nIndex]++;
	bISRMasks[nIndex] = 0;
}

/**************************************************
声明:void ISR_Enable( UINT nIndex )
参数:
	IN nIndex - 中断服务例程索引
  
返回值:
功能描述:
	打开索引指向的中断服务例程,当产生中断时,将会调用索引指向的中断服务例程。
	该函数减少对应的屏蔽计数器,当减为0时,打开中断服务
引用: 
************************************************/
void ISR_Enable( UINT nIndex )
{
    ASSERT( nIndex < SYSINTR_MAXIMUM );
	if( nISRMaskCount[nIndex] ) 
	    nISRMaskCount[nIndex]--;
    if( nISRMaskCount[nIndex] == 0 )
    {   // 打开中断服务
	    bISRMasks[nIndex] = 1;
    }
}

/**************************************************
声明:void ISR_Active( UINT nIndex )
参数:
	IN nIndex - 中断服务例程索引
  
返回值:
功能描述:
	激活索引指向的中断服务例程,例程将会在系统调用返回或当设备中断处理完返回时检查并调用ISR_Handler
引用: 
************************************************/
#define DEBUG_ISR_Active 0
void ISR_Active( UINT nIndex )
{
	if( nIndex < SYSINTR_MAXIMUM )
	{   // 是否已有信号
	    if( bISRActives[nIndex] == 0 )
		{   // 否,设置信号
		    bISRActives[nIndex] = 1;
	        iISRActiveCount++;
		}
	}
	else
	{
		ERRORMSG( DEBUG_ISR_Active, ( "error in ISR_Active :nIndex(%d), SYSINTR_MAXIMUM(%d).\r\n", nIndex, SYSINTR_MAXIMUM ) );
	}
}

//int iISREntry = 0;
/**************************************************
声明:void ISR_Handler( UINT idCurISR )
参数:
	IN idISR - 当前最新被激活的中断服务例程索引
  
返回值:
功能描述:
	中断服务例程处理中心,该函数将会在系统调用返回或当设备中断处理完返回时检查并调用;
	当调用该函数时,中断是关掉的
引用: 
************************************************/
void ISR_Handler( UINT idISR )
{
	static int nISRHandlerCount = 0;
	int idx;	
	LPBYTE lpbMask, lpbActive;

	ISR_DATA * lpisr;


    // 防止重入
	if( nISRHandlerCount++ )
		return;
	
    lpCurThread->nLockScheCount++;


	if( idISR < SYSINTR_MAXIMUM )
	{
		if( bISRActives[idISR] && bISRMasks[idISR] )
		{   //先处理当前的idISR
			bISRActives[idISR] = 0;
			iISRActiveCount--;
			INTR_ON();
			isrData[idISR].lpISRFun( isrData[idISR].dwISRHandle );
			INTR_OFF();
		}
	}

	// 是否有没有处理的中断
	if( iISRActiveCount )
	{   // 有,检查它们 enum all isr		
		
		lpisr = isrData;
		lpbMask = bISRMasks;
		lpbActive = bISRActives;
		for ( idx = 0; idx < SYSINTR_MAXIMUM && iISRActiveCount; idx++ ) 
		{
			if( *lpbMask && *lpbActive )
			{   // 没有屏蔽并且有信号
				*lpbActive = 0;
				iISRActiveCount--;
				INTR_ON();
				lpisr->lpISRFun( lpisr->dwISRHandle );
				INTR_OFF();
			}
			lpisr++;
			lpbMask++;
			lpbActive++;
		}
	}

	lpCurThread->nLockScheCount--;
	nISRHandlerCount = 0;
	
}

/**************************************************
声明:BOOL ISR_RegisterServer( UINT nIndex, LPISR lpISRFun, DWORD dwISRHandle )
参数:
	IN nIndex - 中断服务例程索引
	IN lpISRFun - 中断服务例程回调函数
	IN dwISRHandle - 传递给中断服务例程回调函数的参数
  
返回值:
	假如成功,返回TRUE;否则,返回FALSE
功能描述:
	注册一个中断服务例程
引用: 
************************************************/

BOOL ISR_RegisterServer( UINT nIndex, LPISR lpISRFun, DWORD dwISRHandle )
{
	if( nIndex < SYSINTR_MAXIMUM )
	{
		UINT uiSave;
		LockIRQSave( &uiSave ); // 保存 & 关中断
		isrData[nIndex].lpISRFun = lpISRFun;
		isrData[nIndex].dwISRHandle = dwISRHandle;
		nISRMaskCount[nIndex] = 0;  // enable
		bISRMasks[nIndex] = 1;  // enable
		bISRActives[nIndex] = 0; // no active
		UnlockIRQRestore( &uiSave ); // 恢复
		return TRUE;
	}
	return FALSE;
}

/**************************************************
声明:void ISR_Unregister( UINT nIndex )
参数:
	IN nIndex - 中断服务例程索引
	IN lpISRFun - 中断服务例程回调函数
	IN dwISRHandle - 传递给中断服务例程回调函数的参数
  
返回值:
功能描述:
	注销一个中断服务例程
引用: 
************************************************/

void ISR_Unregister( UINT nIndex )
{
	if( nIndex < SYSINTR_MAXIMUM )
	{
		ISR_Disable( nIndex );   // 先关掉它 disable

		bISRActives[nIndex] = 0; // no active
		isrData[nIndex].lpISRFun = ISR_DefHandler;
		isrData[nIndex].dwISRHandle = 0;
		bISRMasks[nIndex] = 0;
	}
}

/**************************************************
声明:void ISR_Init( void )
参数:
返回值:
功能描述:
	中断服务例程管理器初始化
引用: 
	被start.c调用
************************************************/
BOOL ISR_Init( void )
{
	int i=0;
	for( i = 0; i < SYSINTR_MAXIMUM; i++ )
	{
		nISRMaskCount[i] = 0;
		isrData[i].lpISRFun = ISR_DefHandler;
		isrData[i].dwISRHandle = 0;	
	}
	memset( bISRActives, 0, sizeof( bISRActives ) );
	memset( bISRMasks, 0, sizeof( bISRMasks ) );
	iISRActiveCount = 0;
	return TRUE;
}

⌨️ 快捷键说明

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