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

📄 genpvec.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/*  genpvec.c * *  These routines handle the external exception.  Multiple ISRs occur off *  of this one interrupt.  This method will allow multiple ISRs to be *  called using the same IRQ index.  However, removing the ISR routines is *  presently not supported. * *  The external exception vector numbers begin with DMV170_IRQ_FIRST. *  DMV170_IRQ_FIRST is defined to be one greater than the last processor *  interrupt.   * *  COPYRIGHT (c) 1989-1999. *  On-Line Applications Research Corporation (OAR). * *  The license and distribution terms for this file may in *  the file LICENSE in this distribution or at *  http://www.rtems.com/license/LICENSE. * *  $Id: genpvec.c,v 1.10.2.1 2003/09/04 18:44:59 joel Exp $ */#include <bsp.h>#include <chain.h>#include <assert.h>#define   NUM_LIRQ_HANDLERS   20#define   NUM_LIRQ            ( MAX_BOARD_IRQS - PPC_IRQ_LAST )/*  * Structure to for one of possible multiple interrupt handlers for  * a given interrupt. */typedef struct{  Chain_Node          Node;  rtems_isr_entry     handler;                  /* isr routine        */  rtems_vector_number vector;                   /* vector number      */} EE_ISR_Type;/* * Note:  The following will not work if we add a method to remove *        handlers at a later time. */EE_ISR_Type       ISR_Nodes [NUM_LIRQ_HANDLERS];rtems_unsigned16  Nodes_Used; Chain_Control     ISR_Array  [NUM_LIRQ];/*PAGE * * external_exception_ISR * * This interrupt service routine is called for an External Exception. * *  Input parameters: *    vector - vector number representing the external exception vector. * *  Output parameters:  NONE * *  Return values:  */rtems_isr external_exception_ISR (  rtems_vector_number   vector             /* IN  */){   rtems_unsigned16      index;  rtems_boolean         is_active=FALSE;  rtems_unsigned32      scv64_status;  Chain_Node           *node;  EE_ISR_Type          *ee_isr;    /*   * Get all active interrupts.    */  scv64_status = SCV64_Get_Interrupt();  scv64_status &= SCV64_Get_Interrupt_Enable();  /*   * Process any set interrupts.   */  for (index = 0; index <= 5; index++) {    switch(index) {      case 0:        is_active = SCV64_Is_IRQ0( scv64_status );        break;      case 1:        is_active = SCV64_Is_IRQ1( scv64_status );        break;      case 2:        is_active = SCV64_Is_IRQ2( scv64_status );        break;      case 3:        is_active = SCV64_Is_IRQ3( scv64_status );        break;      case 4:        is_active = SCV64_Is_IRQ4( scv64_status );        break;      case 5:        is_active = SCV64_Is_IRQ5( scv64_status );        break;    }    if (is_active) {      /*       * Read vector.       */      node = ISR_Array[ index ].first;      while ( !_Chain_Is_tail( &ISR_Array[ index ], node ) ) {        ee_isr = (EE_ISR_Type *) node;        (*ee_isr->handler)( ee_isr->vector );        node = node->next;      }    }  }}/*PAGE * *  initialize_external_exception_vector * *  This routine initializes the external exception vector *  *  Input parameters: NONE * *  Output parameters:  NONE * *  Return values: NONE */void initialize_external_exception_vector (){  int i;  rtems_isr_entry previous_isr;  rtems_status_code status;  extern void SCV64_Initialize( void );   Nodes_Used = 0;  /*   * Initialize the SCV64 chip   */  SCV64_Initialize();   for (i=0; i <NUM_LIRQ; i++)    Chain_Initialize_empty( &ISR_Array[i] );  /*     * Install external_exception_ISR () as the handler for    *  the General Purpose Interrupt.   */  status = rtems_interrupt_catch( external_exception_ISR,            PPC_IRQ_EXTERNAL , (rtems_isr_entry *) &previous_isr );}/*PAGE * *  set_EE_vector * *  This routine installs one of multiple ISRs for the general purpose  *  inerrupt. * *  Input parameters: *    handler - handler to call at exception *    vector  - vector number associated with this handler. * *  Output parameters:  NONE * *  Return values: */rtems_isr_entry  set_EE_vector(  rtems_isr_entry     handler,      /* isr routine        */  rtems_vector_number vector        /* vector number      */){  rtems_unsigned16 vec_idx  = vector - DMV170_IRQ_FIRST;  rtems_unsigned32 index;    /*    *  Verify that all of the nodes have not been used.   */  assert  (Nodes_Used < NUM_LIRQ_HANDLERS);     /*   *  If we have already installed this handler for this vector, then   *  just reset it.   */  for ( index=0 ; index <= Nodes_Used ; index++ ) {    if ( ISR_Nodes[index].vector == vector &&         ISR_Nodes[index].handler == handler )      return 0;  }  /*   * Increment the number of nedes used and set the index for the node   * array.   */    Nodes_Used++;   index = Nodes_Used - 1;  /*   * Write the values of the handler and the vector to this node.   */  ISR_Nodes[index].handler = handler;  ISR_Nodes[index].vector  = vector;  /*   * Connect this node to the chain at the location of the    * vector index.     */  Chain_Append( &ISR_Array[vec_idx], &ISR_Nodes[index].Node );  /*   * Enable the LIRQ interrupt.   */  SCV64_Generate_DUART_Interrupts();  /*   * No interrupt service routine was removed so return 0   */  return 0;}

⌨️ 快捷键说明

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