lansy的笔记 https://bbs.21ic.com/?198187 [收藏] [复制] [RSS]

日志

我的简易操作系统-ISR.c(4)

已有 1055 次阅读2006-4-15 20:36 |个人分类:凌阳单片机|系统分类:单片机


 /*----------------------------------------------------------------------------------------
文件名称:ISR.c
描述:建立中断服务程序
------------------------------------------------------------------------------------------*/


#include "..\include\ISR.h"


#define INT_SOURCE_MAX 19    // 中断类型个数


/////////////////////////////////////////////////////////////////
//
typedef struct
{
 void (*pfnInterrupt)(void);
 
}ISR;


//////////////////////////////////////////////////////////////////
// 函数指针数组,用于指向中断函数
static ISR isr[INT_SOURCE_MAX];


///////////////////////////////////////////////////////////////////
// 注册须中断调用的函数,详解见头文件ISR.h
BOOL RegInterrupt(void (*pfn)(void), INT16U isrSource)

 if (isrSource > INT_SOURCE_MAX-1)
 {
  return 0;
 }
 
 isr[isrSource].pfnInterrupt = pfn;
 
 return 1;
}


//////////////////////////////////////////////////////////////////
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
 isr[IRQ_BREAK].pfnInterrupt();
}


void FIQ(void) __attribute__ ((ISR));
void FIQ(void)
{
    if (*P_INT_Ctrl & C_FIQ_TMA)
    {
     *P_INT_Clear = C_FIQ_TMA;
     isr[FIQ_TMA].pfnInterrupt();
 }
 
    else if (*P_INT_Ctrl & C_FIQ_TMB)
    {
     *P_INT_Clear = C_FIQ_TMB;
    isr[FIQ_TMB].pfnInterrupt();
    }
    
    else
    {
     *P_INT_Clear = C_FIQ_PWM;
     isr[FIQ_PWM].pfnInterrupt();
    }
}


void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
 *P_INT_Clear = C_IRQ0_PWM;
 isr[IRQ0_PWM].pfnInterrupt();
}


void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{
 *P_INT_Clear = C_IRQ0_PWM;
 isr[IRQ1_TMA].pfnInterrupt();
}


void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
 *P_INT_Clear = C_IRQ2_TMB;
 isr[IRQ2_TMB].pfnInterrupt();
}


void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
 if (*P_INT_Ctrl & C_IRQ3_EXT1)
 {
  *P_INT_Clear = C_IRQ3_EXT1;
  isr[IRQ3_EXT1].pfnInterrupt();
 }
 else if (*P_INT_Ctrl & C_IRQ3_EXT2)
 {
  *P_INT_Clear = C_IRQ3_EXT2;
  isr[IRQ3_EXT2].pfnInterrupt();
 }
 else
 {
  *P_INT_Clear = C_IRQ3_KEY;
  isr[IRQ3_KEY].pfnInterrupt();
 }
}


void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
 if  (*P_INT_Ctrl & C_IRQ4_1KHz)
 {
  *P_INT_Clear = C_IRQ4_1KHz;
  isr[IRQ4_1KHz].pfnInterrupt();
 }
 else if (*P_INT_Ctrl & C_IRQ4_2KHz)
 {
  *P_INT_Clear = C_IRQ4_2KHz;
  isr[IRQ4_2KHz].pfnInterrupt();
 }
 else
 {
  *P_INT_Clear = C_IRQ4_4KHz;
  isr[IRQ4_4KHz].pfnInterrupt();
 }
}


void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
 if (*P_INT_Ctrl & C_IRQ5_2Hz)
 {
  *P_INT_Clear = C_IRQ5_2Hz;
  isr[IRQ5_2Hz].pfnInterrupt();
 }
 else
 {
  *P_INT_Clear = C_IRQ5_4Hz;
  isr[IRQ5_4Hz].pfnInterrupt();
 }
}


void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
 if (*P_INT_Ctrl & C_IRQ6_TMB1)
 {
  *P_INT_Clear = C_IRQ6_TMB1;
  isr[IRQ6_TMB1].pfnInterrupt();
 }
 else
 {
  *P_INT_Clear = C_IRQ6_TMB2;
  isr[IRQ6_TMB2].pfnInterrupt();
 }
}


void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
 if (*P_UART_Command2 & C_UART_Tx_RDY)
 {
  isr[IRQ7_UART_Tx].pfnInterrupt();
 }
 else
 {
  isr[IRQ7_UART_Rx].pfnInterrupt();
 }
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)