OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [librtems++/] [src/] [rtemsInterrupt.cc] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*
2
  ------------------------------------------------------------------------
3
  rtemsInterrupt.cc,v 1.3 2001/01/08 18:12:27 joel Exp
4
  ------------------------------------------------------------------------
5
 
6
  COPYRIGHT (c) 1997
7
  Objective Design Systems Ltd Pty (ODS)
8
  All rights reserved (R) Objective Design Systems Ltd Pty
9
 
10
  The license and distribution terms for this file may be found in the
11
  file LICENSE in this distribution or at
12
  http://www.OARcorp.com/rtems/license.html.
13
 
14
  ------------------------------------------------------------------------
15
 
16
  See header file.
17
 
18
  ------------------------------------------------------------------------
19
*/
20
 
21
#include <rtems++/rtemsInterrupt.h>
22
 
23
/* ----
24
   Interrupt Table
25
 
26
   This table is used to re-direct the call from RTEMS to a user
27
   object
28
*/
29
 
30
static rtemsInterrupt **interrupt_table;
31
 
32
// has the table been initialised
33
static bool initialised = false;
34
 
35
/* ----
36
   rtemsInterrupt
37
*/
38
 
39
#include <stdlib.h> /* for malloc */
40
 
41
rtemsInterrupt::rtemsInterrupt()
42
  : vector(0),
43
    caught(false),
44
    old_handler(0),
45
    old_interrupt(0)
46
{
47
  if (!initialised)
48
  {
49
    interrupt_table = (rtemsInterrupt **)
50
        malloc(sizeof(rtemsInterrupt *) * CPU_INTERRUPT_NUMBER_OF_VECTORS);
51
    for (rtems_vector_number vec = 0;
52
         vec < CPU_INTERRUPT_NUMBER_OF_VECTORS;
53
         vec++)
54
    {
55
      interrupt_table[vector] = 0;
56
    }
57
    initialised = true;
58
  }
59
}
60
 
61
rtemsInterrupt::~rtemsInterrupt()
62
{
63
  release();
64
}
65
 
66
const rtems_status_code rtemsInterrupt::isr_catch(const rtems_vector_number vec)
67
{
68
  if (vec >= CPU_INTERRUPT_NUMBER_OF_VECTORS)
69
    return set_status_code(RTEMS_INVALID_NUMBER);
70
 
71
  if (caught)
72
    return set_status_code(RTEMS_RESOURCE_IN_USE);
73
 
74
  old_interrupt = interrupt_table[vector];
75
  interrupt_table[vector] = this;
76
  vector = vec;
77
 
78
  set_status_code(rtems_interrupt_catch(redirector,
79
                                        vector,
80
                                        &old_handler));
81
 
82
  if (successful())
83
    caught = true;
84
  else
85
  {
86
    interrupt_table[vector] = old_interrupt;
87
    old_interrupt = 0;
88
    old_handler = 0;
89
    vector = 0;
90
  }
91
 
92
  return last_status_code();
93
}
94
 
95
const rtems_status_code rtemsInterrupt::release(void)
96
{
97
  if (caught)
98
  {
99
    set_status_code(rtems_interrupt_catch(old_handler,
100
                                          vector,
101
                                          &old_handler));
102
 
103
    interrupt_table[vector] = old_interrupt;
104
    old_interrupt = 0;
105
    old_handler = 0;
106
    vector = 0;
107
    caught = false;
108
  }
109
  else
110
    set_status_code(RTEMS_SUCCESSFUL);
111
 
112
  return last_status_code();
113
}
114
 
115
void rtemsInterrupt::redirector(rtems_vector_number vector)
116
{
117
  if (interrupt_table[vector])
118
    interrupt_table[vector]->handler();
119
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.