source: rtems/c/src/librtems++/src/rtemsInterrupt.cc @ 43d55f8

4.104.115
Last change on this file since 43d55f8 was 43d55f8, checked in by Ralf Corsepius <ralf.corsepius@…>, on 11/23/09 at 15:29:33

#include <cstdlib>.

  • Property mode set to 100644
File size: 2.8 KB
RevLine 
[0074691a]1/*
2  ------------------------------------------------------------------------
3  $Id$
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
[fa9ef954]12  http://www.rtems.com/license/LICENSE.
[0074691a]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
[f692d7e0]30static rtemsInterrupt **interrupt_table;
[0074691a]31
32// has the table been initialised
33static bool initialised = false;
34
35/* ----
36   rtemsInterrupt
37*/
38
[43d55f8]39#include <cstdlib>
[f692d7e0]40
[0074691a]41rtemsInterrupt::rtemsInterrupt()
42  : vector(0),
43    caught(false),
44    old_handler(0),
45    old_interrupt(0)
46{
47  if (!initialised)
48  {
[f692d7e0]49    interrupt_table = (rtemsInterrupt **)
50        malloc(sizeof(rtemsInterrupt *) * CPU_INTERRUPT_NUMBER_OF_VECTORS);
[0074691a]51    for (rtems_vector_number vec = 0;
52         vec < CPU_INTERRUPT_NUMBER_OF_VECTORS;
53         vec++)
54    {
[bd547e3]55      interrupt_table[vec] = 0;
[0074691a]56    }
57    initialised = true;
58  }
59}
60
[bf4cdb70]61rtemsInterrupt::~rtemsInterrupt()
62{
63  release();
64}
65
[0074691a]66const 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
[bd547e3]74  old_interrupt = interrupt_table[vec];
75  interrupt_table[vec] = this;
[0074691a]76  vector = vec;
77 
[b9ff10f3]78#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
[0074691a]79  set_status_code(rtems_interrupt_catch(redirector,
80                                        vector,
81                                        &old_handler));
[b9ff10f3]82#else
83  set_status_code(RTEMS_NOT_DEFINED);
84#endif
[0074691a]85  if (successful())
86    caught = true;
87  else
88  {
89    interrupt_table[vector] = old_interrupt;
90    old_interrupt = 0;
91    old_handler = 0;
92    vector = 0;
93  }
94 
95  return last_status_code();
96}
97
98const rtems_status_code rtemsInterrupt::release(void)
99{
100  if (caught)
101  {
[b9ff10f3]102#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
[0074691a]103    set_status_code(rtems_interrupt_catch(old_handler,
104                                          vector,
105                                          &old_handler));
[b9ff10f3]106#else
107  set_status_code(RTEMS_NOT_DEFINED);
108#endif
[0074691a]109    interrupt_table[vector] = old_interrupt;
110    old_interrupt = 0;
111    old_handler = 0;
112    vector = 0;
113    caught = false;
114  }
115  else
116    set_status_code(RTEMS_SUCCESSFUL);
117 
118  return last_status_code();
119}
120
121void rtemsInterrupt::redirector(rtems_vector_number vector)
122{
123  if (interrupt_table[vector])
124    interrupt_table[vector]->handler();
125}
Note: See TracBrowser for help on using the repository browser.