annotate packages/kernel/current/src/intr/intr.cxx @ 3101:e8b153151417

Fix compiler warnings about unused variables. [ Bugzilla 1001505 ]
author grante
date Tue, 06 Mar 2012 18:56:34 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
3 // intr/intr.cxx
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
5 // Interrupt class implementations
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2266
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
42 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
43 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
44 // Date: 1999-02-17
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
45 // Purpose: Interrupt class implementation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
46 // Description: This file contains the definitions of the interrupt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
47 // class.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 #include <cyg/kernel/instrmnt.h> // instrumentation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 #include <cyg/kernel/intr.hxx> // our header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 #include <cyg/kernel/sched.hxx> // scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 #include <cyg/kernel/sched.inl>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 // -------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
67 // Statics
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
68
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
69 volatile cyg_int32 Cyg_Interrupt::disable_counter[CYGNUM_KERNEL_CPU_MAX];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
70
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
71 Cyg_SpinLock Cyg_Interrupt::interrupt_disable_spinlock CYG_INIT_PRIORITY( INTERRUPTS );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
72
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
73 CYG_INTERRUPT_STATE Cyg_Interrupt::interrupt_disable_state[CYGNUM_KERNEL_CPU_MAX];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
74
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
75 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 Cyg_Interrupt::Cyg_Interrupt(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 cyg_vector vec, // Vector to attach to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 cyg_priority pri, // Queue priority
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 CYG_ADDRWORD d, // Data pointer
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 cyg_ISR *ir, // Interrupt Service Routine
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 cyg_DSR *dr // Deferred Service Routine
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
85 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
86 CYG_REPORT_FUNCARG5("vector=%d, priority=%d, data=%08x, isr=%08x, "
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
87 "dsr=%08x", vec, pri, d, ir, dr);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
88
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 vector = vec;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 priority = pri;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 isr = ir;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 dsr = dr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 data = d;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
96
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 dsr_count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 next_dsr = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 #ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 next = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
107
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
108 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 Cyg_Interrupt::~Cyg_Interrupt()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
116 CYG_REPORT_FUNCTION();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 detach();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
118 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 // DSR handling statics:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_TABLE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
126 Cyg_Interrupt *
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
127 Cyg_Interrupt::dsr_table[CYGNUM_KERNEL_CPU_MAX][CYGNUM_KERNEL_INTERRUPTS_DSRS_TABLE_SIZE];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
129 cyg_ucount32 Cyg_Interrupt::dsr_table_head[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
131 volatile cyg_ucount32 Cyg_Interrupt::dsr_table_tail[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
137 Cyg_Interrupt* volatile Cyg_Interrupt::dsr_list[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138
2266
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
139 # ifdef CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
140 Cyg_Interrupt* volatile Cyg_Interrupt::dsr_list_tail[CYGNUM_KERNEL_CPU_MAX];
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
141 # endif
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
142
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 // Call any pending DSRs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
148 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
149 Cyg_Interrupt::call_pending_DSRs_inner(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
153 HAL_SMP_CPU_TYPE cpu = CYG_KERNEL_CPU_THIS();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
154
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_TABLE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
157 while( dsr_table_head[cpu] != dsr_table_tail[cpu] )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
159 Cyg_Interrupt *intr = dsr_table[cpu][dsr_table_head[cpu]];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
161 dsr_table_head[cpu]++;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
162 if( dsr_table_head[cpu] >= CYGNUM_KERNEL_INTERRUPTS_DSRS_TABLE_SIZE )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
163 dsr_table_head[cpu] = 0;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 CYG_INSTRUMENT_INTR(CALL_DSR, intr->vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 18
diff changeset
167 CYG_ASSERT( intr->dsr != NULL , "No DSR defined");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 18
diff changeset
168
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 intr->dsr( intr->vector, 1, (CYG_ADDRWORD)intr->data );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175
2266
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
176 # ifdef CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
177
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
178 cyg_uint32 old_intr;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
179 HAL_DISABLE_INTERRUPTS(old_intr);
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
180 Cyg_Interrupt* intr = dsr_list[cpu];
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
181 CYG_ASSERT(intr != 0, "No DSRs are pended");
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
182 dsr_list[cpu] = 0;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
183 dsr_list_tail[cpu] = 0;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
184 while(true)
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
185 {
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
186 cyg_count32 count = intr->dsr_count;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
187 Cyg_Interrupt* next = intr->next_dsr;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
188 intr->dsr_count = 0;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
189 intr->next_dsr = 0;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
190 HAL_RESTORE_INTERRUPTS(old_intr);
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
191
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
192 CYG_ASSERT(intr->dsr != 0, "No DSR defined");
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
193 CYG_ASSERT(count > 0, "DSR posted but post count is zero");
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
194 intr->dsr(intr->vector, count, (CYG_ADDRWORD)intr->data);
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
195
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
196 if (!next)
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
197 break;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
198
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
199 intr = next;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
200 HAL_DISABLE_INTERRUPTS(old_intr);
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
201 }
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
202
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
203 # else // ! defined CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
204
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
205 while( dsr_list[cpu] != NULL )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 128
diff changeset
207 Cyg_Interrupt* intr;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 cyg_uint32 old_intr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 cyg_count32 count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 HAL_DISABLE_INTERRUPTS(old_intr);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
213 intr = dsr_list[cpu];
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
214 dsr_list[cpu] = intr->next_dsr;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 count = intr->dsr_count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 intr->dsr_count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 HAL_RESTORE_INTERRUPTS(old_intr);
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 18
diff changeset
219
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 18
diff changeset
220 CYG_ASSERT( intr->dsr != NULL , "No DSR defined");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222 intr->dsr( intr->vector, count, (CYG_ADDRWORD)intr->data );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225
2266
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
226 # endif // ! defined CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
227
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
228 #endif // defined CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
229
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
232 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
233 cyg_interrupt_call_pending_DSRs(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
234 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
235 Cyg_Interrupt::call_pending_DSRs_inner();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
236 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
237
8
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
238 //
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
239 // Use HAL supported function to run through the DSRs, but executing using
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
240 // the separate interrupt stack if available. This function calls back
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
241 // into this module via 'cyg_interrupt_call_pending_DSRs' above, to keep
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
242 // the whole process as general as possible.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
243
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
244 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
245 Cyg_Interrupt::call_pending_DSRs(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
246 {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 128
diff changeset
247 CYG_ASSERT( Cyg_Scheduler::get_sched_lock() == 1,
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 128
diff changeset
248 "DSRs being called with sched_lock not equal to 1");
8
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 2
diff changeset
249 HAL_INTERRUPT_STACK_CALL_PENDING_DSRS();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
250 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
251
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
252
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
255 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
256 Cyg_Interrupt::post_dsr(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258 // CYG_REPORT_FUNCTION();
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
259 HAL_SMP_CPU_TYPE cpu = CYG_KERNEL_CPU_THIS();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
260
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261 CYG_INSTRUMENT_INTR(POST_DSR, vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 cyg_uint32 old_intr;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 // We need to disable interrupts during this part to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 // guard against nested interrupts.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 HAL_DISABLE_INTERRUPTS(old_intr);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_TABLE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
272 dsr_table[cpu][dsr_table_tail[cpu]++] = this;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
273 if( dsr_table_tail[cpu] >= CYGNUM_KERNEL_INTERRUPTS_DSRS_TABLE_SIZE )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
274 dsr_table_tail[cpu] = 0;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
276 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280 // Only add the interrupt to the dsr list if this is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 // the first DSR call.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 if( dsr_count++ == 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 {
2266
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
284 # ifdef CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
285
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
286 // Add to the tail of the list.
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
287 Cyg_Interrupt* tail = dsr_list_tail[cpu];
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
288 dsr_list_tail[cpu] = this;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
289 if( tail )
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
290 {
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
291 CYG_ASSERT( 0 != dsr_list[cpu] ,
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
292 "DSR list is not empty but its head is 0");
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
293 tail->next_dsr = this;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
294 }
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
295 else
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
296 {
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
297 CYG_ASSERT( 0 == dsr_list[cpu] ,
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
298 "DSR list tail is 0 but its head is not");
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
299 dsr_list[cpu] = this;
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
300 }
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
301
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
302 # else // ! defined CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
303
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
304 // At present DSRs are pushed onto the list and will be called
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
305 // in reverse order. We do not define the order in which DSRs
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
306 // are called, so this is acceptable.
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
307 next_dsr = dsr_list[cpu];
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
308 dsr_list[cpu] = this;
2266
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
309
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
310 # endif // ! defined CYGSEM_KERNEL_INTERRUPTS_DSRS_LIST_FIFO
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
311
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 }
2266
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
313
13625e7b9d1f Implement FIFO variant of scheduling of DSRs and make it the
nickg
parents: 210
diff changeset
314 #endif // defined CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 HAL_RESTORE_INTERRUPTS(old_intr);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 // -------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
320 // A C callable interface to Cyg_Interrupt::post_dsr() that can be used from
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
321 // the HAL.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
323 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
324 cyg_interrupt_post_dsr( CYG_ADDRWORD intr_obj )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
325 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
326 Cyg_Interrupt* intr = (Cyg_Interrupt*) intr_obj;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
327 intr->post_dsr ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
328 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
329
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
330 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
331
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
332 // FIXME: should have better name - Jifl
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
333 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
334 interrupt_end(
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335 cyg_uint32 isr_ret,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 Cyg_Interrupt *intr,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 HAL_SavedRegisters *regs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
340 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
342 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
343 Cyg_Scheduler::lock();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
344 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
345
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
346 // Sometimes we have a NULL intr object pointer.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
347 cyg_vector vector = (intr!=NULL)?intr->vector:0;
86
6512add4f5d6 Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents: 66
diff changeset
348
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
349 CYG_INSTRUMENT_INTR(END, vector, isr_ret);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
350
86
6512add4f5d6 Merge from eCos master repository on 2000-05-05-07:47:05-BST
jlarmour
parents: 66
diff changeset
351 CYG_UNUSED_PARAM( cyg_vector, vector ); // prevent compiler warning
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
352
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
353 #ifndef CYGIMP_KERNEL_INTERRUPTS_CHAIN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355 // Only do this if we are in a non-chained configuration.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
356 // If we are chained, then chain_isr below will do the DSR
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357 // posting.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
359 if( isr_ret & Cyg_Interrupt::CALL_DSR && intr != NULL ) intr->post_dsr();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
360
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
361 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
362
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 #ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365 // If we have GDB support enabled, and there is the possibility
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366 // that this thread will be context switched as a result of this
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367 // interrupt, then save the pointer to the saved thread context in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368 // the thread object so that GDB can get a meaningful context to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369 // look at.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371 Cyg_Scheduler::get_current_thread()->set_saved_context(regs);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 // Now unlock the scheduler, which may also call DSRs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 // and cause a thread switch to happen.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380 #ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382 Cyg_Scheduler::get_current_thread()->set_saved_context(0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
386 CYG_INSTRUMENT_INTR(RESTORE, vector, 0);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390 // Interrupt chaining statics.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392 #ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
394 Cyg_Interrupt *Cyg_Interrupt::chain_list[CYGNUM_HAL_ISR_TABLE_SIZE];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
396 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
399 // Chaining ISR inserted in HAL vector
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401 #ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
403 cyg_uint32
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
404 Cyg_Interrupt::chain_isr(cyg_vector vector, CYG_ADDRWORD data)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 Cyg_Interrupt *p = *(Cyg_Interrupt **)data;
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
407 register cyg_uint32 isr_ret = 0;
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents: 86
diff changeset
408 register cyg_uint32 isr_chain_ret = 0;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents: 86
diff changeset
409
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 CYG_INSTRUMENT_INTR(CHAIN_ISR, vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 while( p != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 if( p->vector == vector )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 {
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
416 isr_ret = p->isr(vector, p->data);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents: 86
diff changeset
418 isr_chain_ret |= isr_ret;
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents: 86
diff changeset
419
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
420 if( isr_ret & Cyg_Interrupt::CALL_DSR ) p->post_dsr();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
422 if( isr_ret & Cyg_Interrupt::HANDLED ) break;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425 p = p->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427
18
7253dcc42a09 Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents: 10
diff changeset
428 #ifdef HAL_DEFAULT_ISR
103
95f3e12a6327 Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents: 86
diff changeset
429 if( (isr_chain_ret & (Cyg_Interrupt::HANDLED|Cyg_Interrupt::CALL_DSR)) == 0 )
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
430 {
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
431 // If we finished the loop for some reason other than that an
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
432 // ISR has handled the interrupt, call any default ISR to either
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
433 // report the spurious interrupt, or do some other HAL level processing
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
434 // such as GDB interrupt detection etc.
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
435
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 103
diff changeset
436 HAL_DEFAULT_ISR( vector, 0 );
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
437 }
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
438 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 130
diff changeset
439
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 130
diff changeset
440 return isr_ret & ~Cyg_Interrupt::CALL_DSR;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 // Attach an ISR to an interrupt vector.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
448 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
449 Cyg_Interrupt::attach(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
451 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
453 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
454 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
456 CYG_INSTRUMENT_INTR(ATTACH, vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
457
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
458 HAL_INTERRUPT_SET_LEVEL( vector, priority );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460 #ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462 CYG_ASSERT( next == NULL , "Cyg_Interrupt already on a list");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464 cyg_uint32 index;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 HAL_TRANSLATE_VECTOR( vector, index );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
468 if( chain_list[index] == NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
469 {
3101
e8b153151417 Fix compiler warnings about unused variables. [ Bugzilla 1001505 ]
grante
parents: 2729
diff changeset
470 int in_use CYGBLD_ATTRIB_UNUSED;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
471 // First Interrupt on this chain, just assign it and register
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
472 // the chain_isr with the HAL.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
473
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474 chain_list[index] = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
475
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
476 HAL_INTERRUPT_IN_USE( vector, in_use );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
477 CYG_ASSERT( 0 == in_use, "Interrupt vector not free.");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
478 HAL_INTERRUPT_ATTACH( vector, chain_isr, &chain_list[index], NULL );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
479 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
481 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482 // There are already interrupts chained, add this one into the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 // chain in priority order.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485 Cyg_Interrupt **p = &chain_list[index];
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
486
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
487 while( *p != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489 Cyg_Interrupt *n = *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
490
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491 if( n->priority < priority ) break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
493 p = &n->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
494 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
495 next = *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
496 *p = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
497 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
498
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
499 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
500
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
501 {
3101
e8b153151417 Fix compiler warnings about unused variables. [ Bugzilla 1001505 ]
grante
parents: 2729
diff changeset
502 int in_use CYGBLD_ATTRIB_UNUSED;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
503
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
504 HAL_INTERRUPT_IN_USE( vector, in_use );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
505 CYG_ASSERT( 0 == in_use, "Interrupt vector not free.");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
506
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
507 HAL_INTERRUPT_ATTACH( vector, isr, data, this );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
508 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
509
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
510 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
511 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
512 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
513
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
514 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
515 // Detach the ISR from the vector
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
517 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
518 Cyg_Interrupt::detach(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
519 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
520 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
521
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
522 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
523 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
524
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
525 CYG_INSTRUMENT_INTR(DETACH, vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
526
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
527 #ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
528
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
529 // Remove the interrupt object from the vector chain.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
530
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
531 cyg_uint32 index;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
532
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
533 HAL_TRANSLATE_VECTOR( vector, index );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
534
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
535 Cyg_Interrupt **p = &chain_list[index];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
536
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
537 while( *p != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
538 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
539 Cyg_Interrupt *n = *p;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
540
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
541 if( n == this )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
542 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
543 *p = next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
544 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
545 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
546
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
547 p = &n->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
548 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
549
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
550 // If this was the last one, detach the vector.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
552 if( chain_list[index] == NULL )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553 HAL_INTERRUPT_DETACH( vector, chain_isr );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
554
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
557 HAL_INTERRUPT_DETACH( vector, isr );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
560
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
561 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
564
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
565 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
566 // Get the current service routine
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
568 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
569 Cyg_Interrupt::get_vsr(cyg_vector vector, cyg_VSR **vsr)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
571 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
572 CYG_REPORT_FUNCARG2("vector = %d, mem to put VSR in is at %08x", vector,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
573 vsr);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
575 CYG_ASSERT( vector >= CYGNUM_HAL_VSR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
576 CYG_ASSERT( vector <= CYGNUM_HAL_VSR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
577
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578 HAL_VSR_GET( vector, vsr );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
579
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
580 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
581 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
583 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
584 // Install a vector service routine
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
585
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
586 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
587 Cyg_Interrupt::set_vsr(cyg_vector vector, cyg_VSR *vsr, cyg_VSR **old)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
588 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
589 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
590
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
591 CYG_REPORT_FUNCARG3( "vector = %d, new vsr is at %08x, mem to put "
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
592 "old VSR in is at %08x", vector, vsr, old);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
593
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594 CYG_INSTRUMENT_INTR(SET_VSR, vector, vsr);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
596 CYG_ASSERT( vector >= CYGNUM_HAL_VSR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
597 CYG_ASSERT( vector <= CYGNUM_HAL_VSR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
598
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
599 CYG_INTERRUPT_STATE old_ints;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601 HAL_DISABLE_INTERRUPTS(old_ints);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
602
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603 HAL_VSR_SET( vector, vsr, old );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
604
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605 HAL_RESTORE_INTERRUPTS(old_ints);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
606
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
607 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 // Disable interrupts at the CPU
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
614 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
615 Cyg_Interrupt::disable_interrupts(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
618
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
619 CYG_INSTRUMENT_INTR(DISABLE, disable_counter[CYG_KERNEL_CPU_THIS()]+1, 0);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
621 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
623 // If the disable_counter is zero, disable interrupts and claim the spinlock.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
624
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
625 if( 0 == disable_counter[cpu_this] )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
626 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
627 // Claim the spinlock and disable interrupts. We save the original interrupt
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
628 // enable state to restore later.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
629 interrupt_disable_spinlock.spin_intsave(&interrupt_disable_state[cpu_this]);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
630 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
631
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
632 // Now increment our disable counter.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
633
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
634 disable_counter[cpu_this]++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
635
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
636 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
637 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
638
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
639
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
640 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
641 // Re-enable CPU interrupts
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
642
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
643 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
644 Cyg_Interrupt::enable_interrupts(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
645 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
646 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
647
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
648 CYG_INSTRUMENT_INTR(ENABLE, disable_counter[CYG_KERNEL_CPU_THIS()], 0);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
649
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
650 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
651
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
652 CYG_ASSERT( disable_counter[cpu_this] > 0 , "Disable counter not greater than zero");
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
653
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
654 // If the disable counter goes to zero, then release the spinlock and restore
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
655 // the previous interrupt state.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
656
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
657 if( --disable_counter[cpu_this] == 0 )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
658 {
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
659 interrupt_disable_spinlock.clear_intsave(interrupt_disable_state[cpu_this]);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
660 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
661
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
662 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 // Mask a specific interrupt in a PIC
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
668 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
669 Cyg_Interrupt::mask_interrupt(cyg_vector vector)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
672 CYG_REPORT_FUNCARG1("vector=%d", vector);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
674 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
675 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677 CYG_INSTRUMENT_INTR(MASK, vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
678
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
679 CYG_INTERRUPT_STATE old_ints;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
680
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
681 HAL_DISABLE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
682 HAL_INTERRUPT_MASK( vector );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
683 HAL_RESTORE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
684
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
685 CYG_REPORT_RETURN();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
686 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
687
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
688 // -------------------------------------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
689 // Mask a specific interrupt in a PIC (but not interrupt safe)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
690
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
691 void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
692 Cyg_Interrupt::mask_interrupt_intunsafe(cyg_vector vector)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
693 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
694 CYG_REPORT_FUNCTION();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
695 CYG_REPORT_FUNCARG1("vector=%d", vector);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
696
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
697
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
698 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
699 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
700
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
701 CYG_INSTRUMENT_INTR(MASK, vector, 0);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
702
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
703 HAL_INTERRUPT_MASK( vector );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
704
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
705 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
706 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
707
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
708 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
709 // Clear PIC mask
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
710
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
711 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
712 Cyg_Interrupt::unmask_interrupt(cyg_vector vector)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
713 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
715
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
716 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
717 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
718
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
719 CYG_INSTRUMENT_INTR(UNMASK, vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
721 CYG_INTERRUPT_STATE old_ints;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
722
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
723 HAL_DISABLE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
724 HAL_INTERRUPT_UNMASK( vector );
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
725 HAL_RESTORE_INTERRUPTS(old_ints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
726
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
727 CYG_REPORT_RETURN();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
728 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
729
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
730
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
731 // -------------------------------------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
732 // Clear PIC mask (but not interrupt safe)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
733
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
734 void
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
735 Cyg_Interrupt::unmask_interrupt_intunsafe(cyg_vector vector)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
736 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
737 CYG_REPORT_FUNCTION();
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
738
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
739 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
740 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
741
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
742 CYG_INSTRUMENT_INTR(UNMASK, vector, 0);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 182
diff changeset
743
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
744 HAL_INTERRUPT_UNMASK( vector );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
745
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
746 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
750 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
751 // Acknowledge interrupt at PIC
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
752
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
753 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
754 Cyg_Interrupt::acknowledge_interrupt(cyg_vector vector)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
755 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
756 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
758 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
759 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
760
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
761 CYG_INSTRUMENT_INTR(ACK, vector, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
762
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
763 HAL_INTERRUPT_ACKNOWLEDGE( vector );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
764 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
765
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
766 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
767 // Change interrupt detection at PIC
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
768
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
769 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
770 Cyg_Interrupt::configure_interrupt(
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
771 cyg_vector vector, // vector to control
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
772 cyg_bool level, // level or edge triggered
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
773 cyg_bool up // hi/lo level, rising/falling edge
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
774 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
775 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
776 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
777 CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
778 up);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
779
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
780 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
781 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
782
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
783 CYG_INSTRUMENT_INTR(CONFIGURE, vector, (level<<1)|up);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
784
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
785 HAL_INTERRUPT_CONFIGURE( vector, level, up );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
786
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
787 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
788 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
789
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
790 // -------------------------------------------------------------------------
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
791 // SMP support for setting/getting interrupt CPU
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
792
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
793 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
794
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
795 void
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
796 Cyg_Interrupt::set_cpu(
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
797 cyg_vector vector, // vector to control
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
798 HAL_SMP_CPU_TYPE cpu // CPU to set
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
799 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
800 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
801 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
802 CYG_REPORT_FUNCARG2("vector = %d, cpu = %d", vector, cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
803
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
804 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
805 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
806
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
807 CYG_INSTRUMENT_INTR(SET_CPU, vector, cpu);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
808
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
809 HAL_INTERRUPT_SET_CPU( vector, cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
810
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
811 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
812 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
813
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
814 HAL_SMP_CPU_TYPE
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
815 Cyg_Interrupt::get_cpu(
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
816 cyg_vector vector // vector to control
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
817 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
818 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
819 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
820 CYG_REPORT_FUNCARG1("vector = %d", vector);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
821
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
822 CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
823 CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
824
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
825 HAL_SMP_CPU_TYPE cpu = 0;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
826
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
827 HAL_INTERRUPT_GET_CPU( vector, cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
828
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
829 CYG_INSTRUMENT_INTR(GET_CPU, vector, cpu);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
830
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
831 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
832
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
833 return cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
834 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
835
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
836 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
837
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 174
diff changeset
838 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839 // EOF intr/intr.cxx