@@ -0,0 +1,64 | |||
|
1 | #ifndef FSW_SPOOL_H_INCLUDED | |
|
2 | #define FSW_SPOOL_H_INCLUDED | |
|
3 | ||
|
4 | #include <rtems.h> | |
|
5 | #include <stdio.h> | |
|
6 | ||
|
7 | #include "fsw_params.h" | |
|
8 | #include "fsw_processing.h" | |
|
9 | ||
|
10 | rtems_name name_spool_rate_monotonic; // name of the SPOOL rate monotonic | |
|
11 | rtems_id spool_period_id; // id of the SPOOL rate monotonic period | |
|
12 | ||
|
13 | extern unsigned char lfrCurrentMode; | |
|
14 | ||
|
15 | extern waveform_picker_regs_new_t *waveform_picker_regs; | |
|
16 | extern spectral_matrix_regs_t *spectral_matrix_regs; | |
|
17 | ||
|
18 | // WAVEFORMS | |
|
19 | extern ring_node *current_ring_node_f0; | |
|
20 | extern ring_node *ring_node_to_send_swf_f0; | |
|
21 | extern ring_node *current_ring_node_f1; | |
|
22 | extern ring_node *ring_node_to_send_swf_f1; | |
|
23 | extern ring_node *ring_node_to_send_cwf_f1; | |
|
24 | extern ring_node *current_ring_node_f2; | |
|
25 | extern ring_node *ring_node_to_send_swf_f2; | |
|
26 | extern ring_node *ring_node_to_send_cwf_f2; | |
|
27 | extern ring_node *current_ring_node_f3; | |
|
28 | extern ring_node *ring_node_to_send_cwf_f3; | |
|
29 | ||
|
30 | // SPECTRAL MATRICES | |
|
31 | unsigned int spool_nb_sm_f0; | |
|
32 | unsigned int spool_nb_sm_f1; | |
|
33 | extern ring_node_sm *current_ring_node_sm_f0; | |
|
34 | extern ring_node_sm *current_ring_node_sm_f1; | |
|
35 | extern ring_node_sm *current_ring_node_sm_f2; | |
|
36 | extern ring_node_sm *ring_node_for_averaging_sm_f0; | |
|
37 | extern ring_node_sm *ring_node_for_averaging_sm_f1; | |
|
38 | extern ring_node_sm *ring_node_for_averaging_sm_f2; | |
|
39 | ||
|
40 | extern rtems_id Task_id[]; /* array of task ids */ | |
|
41 | ||
|
42 | extern bool swf_f0_ready; | |
|
43 | extern bool swf_f1_ready; | |
|
44 | extern bool swf_f2_ready; | |
|
45 | ||
|
46 | extern bool wake_up_task_wfrm; | |
|
47 | extern bool wake_up_task_cwf_f1; | |
|
48 | extern bool wake_up_task_cwf_f2_burst; | |
|
49 | extern bool wake_up_task_cwf_f2_sbm2; | |
|
50 | extern bool wake_up_task_cwf_f3; | |
|
51 | ||
|
52 | //*********** | |
|
53 | // RTEMS_TASK | |
|
54 | rtems_task spoo_task( rtems_task_argument argument ); | |
|
55 | ||
|
56 | // OTHER FUNCTIONS | |
|
57 | void spool_waveforms( void ); | |
|
58 | void spool_spectral_matrices_f0( void ); | |
|
59 | void spool_spectral_matrices_f1( void ); | |
|
60 | void spool_spectral_matrices_f2( void ); | |
|
61 | void spool_spectral_matrices( void ); | |
|
62 | void spool_reset_nb_sm( void ); | |
|
63 | ||
|
64 | #endif // FSW_SPOOL_H_INCLUDED |
@@ -0,0 +1,276 | |||
|
1 | /** Functions and tasks related to waveform packet generation. | |
|
2 | * | |
|
3 | * @file | |
|
4 | * @author P. LEROY | |
|
5 | * | |
|
6 | * A group of functions to handle waveforms, in snapshot or continuous format.\n | |
|
7 | * | |
|
8 | */ | |
|
9 | ||
|
10 | #include "fsw_spool.h" | |
|
11 | ||
|
12 | //********************* | |
|
13 | // Interrupt SubRoutine | |
|
14 | ||
|
15 | void spool_waveforms( void ) | |
|
16 | { | |
|
17 | /** This is the interrupt sub routine called by the waveform picker core. | |
|
18 | * | |
|
19 | * This ISR launch different actions depending mainly on two pieces of information: | |
|
20 | * 1. the values read in the registers of the waveform picker. | |
|
21 | * 2. the current LFR mode. | |
|
22 | * | |
|
23 | */ | |
|
24 | ||
|
25 | rtems_status_code status; | |
|
26 | ||
|
27 | if ( (lfrCurrentMode == LFR_MODE_NORMAL) || (lfrCurrentMode == LFR_MODE_BURST) // in BURST the data are used to place v, e1 and e2 in the HK packet | |
|
28 | || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) | |
|
29 | { // in modes other than STANDBY and BURST, send the CWF_F3 data | |
|
30 | if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full | |
|
31 | // (1) change the receiving buffer for the waveform picker | |
|
32 | ring_node_to_send_cwf_f3 = current_ring_node_f3; | |
|
33 | current_ring_node_f3 = current_ring_node_f3->next; | |
|
34 | waveform_picker_regs->addr_data_f3 = current_ring_node_f3->buffer_address; | |
|
35 | // (2) send an event for the waveforms transmission | |
|
36 | if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { | |
|
37 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); | |
|
38 | } | |
|
39 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2); | |
|
40 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111] | |
|
41 | } | |
|
42 | } | |
|
43 | ||
|
44 | switch(lfrCurrentMode) | |
|
45 | { | |
|
46 | //******** | |
|
47 | // STANDBY | |
|
48 | case(LFR_MODE_STANDBY): | |
|
49 | break; | |
|
50 | ||
|
51 | //****** | |
|
52 | // NORMAL | |
|
53 | case(LFR_MODE_NORMAL): | |
|
54 | if ( (waveform_picker_regs->status & 0xff8) != 0x00) // [1000] check the error bits | |
|
55 | { | |
|
56 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); | |
|
57 | } | |
|
58 | if ( (waveform_picker_regs->status & 0x07) == 0x07) // [0111] check the f2, f1, f0 full bits | |
|
59 | { | |
|
60 | // change F0 ring node | |
|
61 | ring_node_to_send_swf_f0 = current_ring_node_f0; | |
|
62 | current_ring_node_f0 = current_ring_node_f0->next; | |
|
63 | waveform_picker_regs->addr_data_f0 = current_ring_node_f0->buffer_address; | |
|
64 | // change F1 ring node | |
|
65 | ring_node_to_send_swf_f1 = current_ring_node_f1; | |
|
66 | current_ring_node_f1 = current_ring_node_f1->next; | |
|
67 | waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; | |
|
68 | // change F2 ring node | |
|
69 | ring_node_to_send_swf_f2 = current_ring_node_f2; | |
|
70 | current_ring_node_f2 = current_ring_node_f2->next; | |
|
71 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; | |
|
72 | // | |
|
73 | if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) | |
|
74 | { | |
|
75 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); | |
|
76 | } | |
|
77 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] | |
|
78 | } | |
|
79 | break; | |
|
80 | ||
|
81 | //****** | |
|
82 | // BURST | |
|
83 | case(LFR_MODE_BURST): | |
|
84 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit | |
|
85 | // (1) change the receiving buffer for the waveform picker | |
|
86 | ring_node_to_send_cwf_f2 = current_ring_node_f2; | |
|
87 | current_ring_node_f2 = current_ring_node_f2->next; | |
|
88 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; | |
|
89 | // (2) send an event for the waveforms transmission | |
|
90 | if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) { | |
|
91 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); | |
|
92 | } | |
|
93 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 | |
|
94 | } | |
|
95 | break; | |
|
96 | ||
|
97 | //***** | |
|
98 | // SBM1 | |
|
99 | case(LFR_MODE_SBM1): | |
|
100 | if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit | |
|
101 | // (1) change the receiving buffer for the waveform picker | |
|
102 | ring_node_to_send_cwf_f1 = current_ring_node_f1; | |
|
103 | current_ring_node_f1 = current_ring_node_f1->next; | |
|
104 | waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; | |
|
105 | // (2) send an event for the the CWF1 task for transmission (and snapshot extraction if needed) | |
|
106 | status = rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ); | |
|
107 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bits = 0 | |
|
108 | } | |
|
109 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit | |
|
110 | swf_f0_ready = true; | |
|
111 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1111 1110 1110 1110] f0 bits = 0 | |
|
112 | } | |
|
113 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ) { // [0100] check the f2 full bit | |
|
114 | swf_f2_ready = true; | |
|
115 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0 | |
|
116 | } | |
|
117 | break; | |
|
118 | ||
|
119 | //***** | |
|
120 | // SBM2 | |
|
121 | case(LFR_MODE_SBM2): | |
|
122 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit | |
|
123 | // (1) change the receiving buffer for the waveform picker | |
|
124 | ring_node_to_send_cwf_f2 = current_ring_node_f2; | |
|
125 | current_ring_node_f2 = current_ring_node_f2->next; | |
|
126 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; | |
|
127 | // (2) send an event for the waveforms transmission | |
|
128 | status = rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ); | |
|
129 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 | |
|
130 | } | |
|
131 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit | |
|
132 | swf_f0_ready = true; | |
|
133 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1111 1110 1110 1110] f0 bits = 0 | |
|
134 | } | |
|
135 | if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit | |
|
136 | swf_f1_ready = true; | |
|
137 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1, f0 bits = 0 | |
|
138 | } | |
|
139 | break; | |
|
140 | ||
|
141 | //******** | |
|
142 | // DEFAULT | |
|
143 | default: | |
|
144 | break; | |
|
145 | } | |
|
146 | } | |
|
147 | ||
|
148 | void spool_waveforms_alt( void ) | |
|
149 | { | |
|
150 | // WFRM | |
|
151 | if (wake_up_task_wfrm == true) | |
|
152 | { | |
|
153 | rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ); | |
|
154 | wake_up_task_wfrm = false; | |
|
155 | } | |
|
156 | // CWF_F1 | |
|
157 | if (wake_up_task_cwf_f1 == true) | |
|
158 | { | |
|
159 | rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ); | |
|
160 | wake_up_task_cwf_f1 = false; | |
|
161 | } | |
|
162 | // CWF_F2 BURST | |
|
163 | if (wake_up_task_cwf_f2_burst == true) | |
|
164 | { | |
|
165 | rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ); | |
|
166 | wake_up_task_cwf_f2_burst = false; | |
|
167 | } | |
|
168 | // CWF_F2 SBM2 | |
|
169 | if (wake_up_task_cwf_f2_sbm2 == true) | |
|
170 | { | |
|
171 | rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ); | |
|
172 | wake_up_task_cwf_f2_sbm2 = false; | |
|
173 | } | |
|
174 | // CWF_F3 | |
|
175 | if (wake_up_task_cwf_f3 == true) | |
|
176 | { | |
|
177 | rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ); | |
|
178 | wake_up_task_cwf_f3 = false; | |
|
179 | } | |
|
180 | } | |
|
181 | ||
|
182 | void spool_spectral_matrices( void ) | |
|
183 | { | |
|
184 | // STATUS REGISTER | |
|
185 | // input_fifo_write(2) *** input_fifo_write(1) *** input_fifo_write(0) | |
|
186 | // 10 9 8 | |
|
187 | // buffer_full ** bad_component_err ** f2_1 ** f2_0 ** f1_1 ** f1_0 ** f0_1 ** f0_0 | |
|
188 | // 7 6 5 4 3 2 1 0 | |
|
189 | ||
|
190 | unsigned char status_f0; | |
|
191 | unsigned char status_f1; | |
|
192 | unsigned char status_f2; | |
|
193 | static unsigned int counter = 0; | |
|
194 | ||
|
195 | rtems_interrupt_level level; | |
|
196 | ||
|
197 | rtems_interrupt_disable( level ); | |
|
198 | ||
|
199 | status_f0 = spectral_matrix_regs->status & 0x03; // [0011] get the status_ready_matrix_f0_x bits | |
|
200 | status_f1 = (spectral_matrix_regs->status & 0x0c) >> 2; // [0011] get the status_ready_matrix_f0_x bits | |
|
201 | status_f2 = (spectral_matrix_regs->status & 0x30) >> 4; // [0011] get the status_ready_matrix_f0_x bits | |
|
202 | ||
|
203 | // if ( status_f0 == 0x03) | |
|
204 | // { | |
|
205 | // printf("%d \n", counter); | |
|
206 | // } | |
|
207 | if ( status_f1 == 0x03) | |
|
208 | { | |
|
209 | printf("f1 %d \n", counter); | |
|
210 | } | |
|
211 | if ( status_f2 == 0x03) | |
|
212 | { | |
|
213 | printf("f2 %d \n", counter); | |
|
214 | } | |
|
215 | ||
|
216 | spectral_matrices_isr_f0(); | |
|
217 | ||
|
218 | spectral_matrices_isr_f1(); | |
|
219 | ||
|
220 | spectral_matrices_isr_f2(); | |
|
221 | ||
|
222 | spectral_matrix_isr_error_handler(); | |
|
223 | ||
|
224 | rtems_interrupt_enable( level ); | |
|
225 | ||
|
226 | counter = counter + 1; | |
|
227 | } | |
|
228 | ||
|
229 | //************ | |
|
230 | // RTEMS TASKS | |
|
231 | ||
|
232 | rtems_task spoo_task(rtems_task_argument argument) | |
|
233 | { | |
|
234 | rtems_status_code status; | |
|
235 | ||
|
236 | BOOT_PRINTF("in SPOOL ***\n") | |
|
237 | ||
|
238 | if (rtems_rate_monotonic_ident( name_spool_rate_monotonic, &spool_period_id) != RTEMS_SUCCESSFUL) { | |
|
239 | status = rtems_rate_monotonic_create( name_spool_rate_monotonic, &spool_period_id ); | |
|
240 | if( status != RTEMS_SUCCESSFUL ) { | |
|
241 | PRINTF1( "in SPOO *** rtems_rate_monotonic_create failed with status %d\n", status ) | |
|
242 | } | |
|
243 | } | |
|
244 | ||
|
245 | status = rtems_rate_monotonic_cancel( spool_period_id ); | |
|
246 | if( status != RTEMS_SUCCESSFUL ) | |
|
247 | { | |
|
248 | PRINTF1( "ERR *** in SPOOL *** rtems_rate_monotonic_cancel(spool_period_id) ***code: %d\n", status ) | |
|
249 | } | |
|
250 | else | |
|
251 | { | |
|
252 | DEBUG_PRINTF("OK *** in SPOOL *** rtems_rate_monotonic_cancel(spool_period_id)\n") | |
|
253 | } | |
|
254 | ||
|
255 | while(1){ // launch the rate monotonic task | |
|
256 | // status = rtems_rate_monotonic_period( spool_period_id, SPOOL_TIMEOUT_in_ticks ); | |
|
257 | rtems_task_wake_after( SPOOL_TIMEOUT_in_ticks / 2 ); | |
|
258 | spool_waveforms_alt(); | |
|
259 | spool_spectral_matrices(); | |
|
260 | // if ( status != RTEMS_SUCCESSFUL ) | |
|
261 | // { | |
|
262 | // PRINTF1( "in SPOOL *** ERR period: %d\n", status); | |
|
263 | // } | |
|
264 | // else | |
|
265 | // { | |
|
266 | // spool_waveforms(); | |
|
267 | // spool_spectral_matrices(); | |
|
268 | // } | |
|
269 | } | |
|
270 | ||
|
271 | PRINTF("in SPOOL *** deleting task\n") | |
|
272 | ||
|
273 | status = rtems_task_delete( RTEMS_SELF ); // should not return | |
|
274 | printf( "rtems_task_delete returned with status of %d.\n", status ); | |
|
275 | return; | |
|
276 | } |
@@ -1,6 +1,6 | |||
|
1 | 1 | ############################################################################# |
|
2 | 2 | # Makefile for building: bin/fsw |
|
3 |
# Generated by qmake (2.01a) (Qt 4.8.6) on: Tu |
|
|
3 | # Generated by qmake (2.01a) (Qt 4.8.6) on: Thu Jul 17 15:49:45 2014 | |
|
4 | 4 | # Project: fsw-qt.pro |
|
5 | 5 | # Template: app |
|
6 | 6 | # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro |
@@ -10,7 +10,7 | |||
|
10 | 10 | |
|
11 | 11 | CC = sparc-rtems-gcc |
|
12 | 12 | CXX = sparc-rtems-g++ |
|
13 |
DEFINES = -DSW_VERSION_N1=2 -DSW_VERSION_N2=0 -DSW_VERSION_N3=1 -DSW_VERSION_N4= |
|
|
13 | DEFINES = -DSW_VERSION_N1=2 -DSW_VERSION_N2=0 -DSW_VERSION_N3=1 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -DPRINT_TASK_STATISTICS -DFAST_SCHEDULER | |
|
14 | 14 | CFLAGS = -pipe -O3 -Wall $(DEFINES) |
|
15 | 15 | CXXFLAGS = -pipe -O3 -Wall $(DEFINES) |
|
16 | 16 | INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../header/processing -I../src/LFR_basic-parameters |
@@ -57,7 +57,8 SOURCES = ../src/wf_handler.c \ | |||
|
57 | 57 | ../src/processing/avf1_prc1.c \ |
|
58 | 58 | ../src/processing/avf2_prc2.c \ |
|
59 | 59 | ../src/lfr_cpu_usage_report.c \ |
|
60 | ../src/LFR_basic-parameters/basic_parameters.c | |
|
60 | ../src/LFR_basic-parameters/basic_parameters.c \ | |
|
61 | ../src/fsw_spool.c | |
|
61 | 62 | OBJECTS = obj/wf_handler.o \ |
|
62 | 63 | obj/tc_handler.o \ |
|
63 | 64 | obj/fsw_misc.o \ |
@@ -72,7 +73,8 OBJECTS = obj/wf_handler.o \ | |||
|
72 | 73 | obj/avf1_prc1.o \ |
|
73 | 74 | obj/avf2_prc2.o \ |
|
74 | 75 | obj/lfr_cpu_usage_report.o \ |
|
75 | obj/basic_parameters.o | |
|
76 | obj/basic_parameters.o \ | |
|
77 | obj/fsw_spool.o | |
|
76 | 78 | DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \ |
|
77 | 79 | /usr/lib64/qt4/mkspecs/common/linux.conf \ |
|
78 | 80 | /usr/lib64/qt4/mkspecs/common/gcc-base.conf \ |
@@ -263,6 +265,9 obj/lfr_cpu_usage_report.o: ../src/lfr_c | |||
|
263 | 265 | obj/basic_parameters.o: ../src/LFR_basic-parameters/basic_parameters.c |
|
264 | 266 | $(CC) -c $(CFLAGS) $(INCPATH) -o obj/basic_parameters.o ../src/LFR_basic-parameters/basic_parameters.c |
|
265 | 267 | |
|
268 | obj/fsw_spool.o: ../src/fsw_spool.c | |
|
269 | $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_spool.o ../src/fsw_spool.c | |
|
270 | ||
|
266 | 271 | ####### Install |
|
267 | 272 | |
|
268 | 273 | install: FORCE |
@@ -1,10 +1,9 | |||
|
1 | 1 | SREC_PREFIX = RpwLfrApp |
|
2 |
SREC_COUNTER |
|
|
3 | SREC_COUNTER_DATA = 0004 | |
|
4 | SREC_FSW_REF = rev-1-0-0-7 | |
|
2 | SREC_COUNTER = 0003 | |
|
3 | SREC_FSW_REF = rev-2-0-1-0 | |
|
5 | 4 | SREC_SUFFIX = .srec |
|
6 |
SREC_TEXT = $(SREC_PREFIX)_$(SREC_COUNTER |
|
|
7 |
SREC_DATA = $(SREC_PREFIX)_$(SREC_COUNTER |
|
|
5 | SREC_TEXT = $(SREC_PREFIX)_$(SREC_COUNTER)_text_$(SREC_FSW_REF)$(SREC_SUFFIX) | |
|
6 | SREC_DATA = $(SREC_PREFIX)_$(SREC_COUNTER)_data_$(SREC_FSW_REF)$(SREC_SUFFIX) | |
|
8 | 7 | OBJCOPY = sparc-rtems-objcopy |
|
9 | 8 | OBJCOPY_OPT = -g -v |
|
10 | 9 |
@@ -1,7 +1,7 | |||
|
1 | 1 | TEMPLATE = app |
|
2 | 2 | # CONFIG += console v8 sim |
|
3 | 3 | # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** vhdl_dev *** debug_tch |
|
4 | CONFIG += console verbose | |
|
4 | CONFIG += console verbose fast_scheduler cpu_usage_report | |
|
5 | 5 | CONFIG -= qt |
|
6 | 6 | |
|
7 | 7 | include(./sparc.pri) |
@@ -11,7 +11,7 SWVERSION=-1-0 | |||
|
11 | 11 | DEFINES += SW_VERSION_N1=2 # major |
|
12 | 12 | DEFINES += SW_VERSION_N2=0 # minor |
|
13 | 13 | DEFINES += SW_VERSION_N3=1 # patch |
|
14 |
DEFINES += SW_VERSION_N4= |
|
|
14 | DEFINES += SW_VERSION_N4=1 # internal | |
|
15 | 15 | |
|
16 | 16 | contains( CONFIG, debug_tch ) { |
|
17 | 17 | DEFINES += DEBUG_TCH |
@@ -41,6 +41,10 contains( CONFIG, boot_messages ) { | |||
|
41 | 41 | DEFINES += BOOT_MESSAGES |
|
42 | 42 | } |
|
43 | 43 | |
|
44 | contains( CONFIG, fast_scheduler ) { | |
|
45 | DEFINES += FAST_SCHEDULER | |
|
46 | } | |
|
47 | ||
|
44 | 48 | #doxygen.target = doxygen |
|
45 | 49 | #doxygen.commands = doxygen ../doc/Doxyfile |
|
46 | 50 | #QMAKE_EXTRA_TARGETS += doxygen |
@@ -68,7 +72,8 SOURCES += \ | |||
|
68 | 72 | ../src/processing/avf1_prc1.c \ |
|
69 | 73 | ../src/processing/avf2_prc2.c \ |
|
70 | 74 | ../src/lfr_cpu_usage_report.c \ |
|
71 | ../src/LFR_basic-parameters/basic_parameters.c | |
|
75 | ../src/LFR_basic-parameters/basic_parameters.c \ | |
|
76 | ../src/fsw_spool.c | |
|
72 | 77 | |
|
73 | 78 | HEADERS += \ |
|
74 | 79 | ../header/wf_handler.h \ |
@@ -91,5 +96,6 HEADERS += \ | |||
|
91 | 96 | ../header/fsw_params_wf_handler.h \ |
|
92 | 97 | ../header/lfr_cpu_usage_report.h \ |
|
93 | 98 | ../src/LFR_basic-parameters/basic_parameters.h \ |
|
94 | ../src/LFR_basic-parameters/basic_parameters_params.h | |
|
99 | ../src/LFR_basic-parameters/basic_parameters_params.h \ | |
|
100 | ../header/fsw_spool.h | |
|
95 | 101 |
@@ -1,6 +1,6 | |||
|
1 | 1 | <?xml version="1.0" encoding="UTF-8"?> |
|
2 | 2 | <!DOCTYPE QtCreatorProject> |
|
3 |
<!-- Written by QtCreator 3. |
|
|
3 | <!-- Written by QtCreator 3.1.2, 2014-08-28T14:53:30. --> | |
|
4 | 4 | <qtcreator> |
|
5 | 5 | <data> |
|
6 | 6 | <variable>ProjectExplorer.Project.ActiveTarget</variable> |
@@ -29,9 +29,12 | |||
|
29 | 29 | <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> |
|
30 | 30 | <value type="int" key="EditorConfiguration.IndentSize">4</value> |
|
31 | 31 | <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> |
|
32 | <value type="int" key="EditorConfiguration.MarginColumn">80</value> | |
|
33 | <value type="bool" key="EditorConfiguration.MouseHiding">true</value> | |
|
32 | 34 | <value type="bool" key="EditorConfiguration.MouseNavigation">true</value> |
|
33 | 35 | <value type="int" key="EditorConfiguration.PaddingMode">1</value> |
|
34 | 36 | <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> |
|
37 | <value type="bool" key="EditorConfiguration.ShowMargin">false</value> | |
|
35 | 38 | <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> |
|
36 | 39 | <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> |
|
37 | 40 | <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> |
@@ -15,9 +15,10 | |||
|
15 | 15 | #include "avf0_prc0.h" |
|
16 | 16 | #include "avf1_prc1.h" |
|
17 | 17 | #include "avf2_prc2.h" |
|
18 | #include "fsw_spool.h" | |
|
18 | 19 | |
|
19 |
extern rtems_name Task_name[ |
|
|
20 |
extern rtems_id Task_id[ |
|
|
20 | extern rtems_name Task_name[]; /* array of task names */ | |
|
21 | extern rtems_id Task_id[]; /* array of task ids */ | |
|
21 | 22 | |
|
22 | 23 | // RTEMS TASKS |
|
23 | 24 | rtems_task Init( rtems_task_argument argument); |
@@ -140,11 +140,25 typedef struct ring_node | |||
|
140 | 140 | |
|
141 | 141 | //***** |
|
142 | 142 | // TIME |
|
143 | #ifdef FAST_SCHEDULER | |
|
143 | 144 | #define CLKDIV_SM_SIMULATOR (10416 - 1) // 10 ms => nominal is 1/96 = 0.010416667, 10417 - 1 = 10416 |
|
144 | 145 | #define TIMER_SM_SIMULATOR 1 |
|
145 |
#define HK_PERIOD 100 |
|
|
146 | #define HK_PERIOD 1000 // 1000 * 1ms = 1s | |
|
147 | #define SY_LFR_TIME_SYN_TIMEOUT_in_ms 2000 | |
|
148 | #define SY_LFR_TIME_SYN_TIMEOUT_in_ticks 2000 // 2000 * 1ms = 2s | |
|
149 | #define SPOOL_TIMEOUT_in_ms 10 | |
|
150 | #define SPOOL_TIMEOUT_in_ticks 5 // 10 * 1ms = 10ms | |
|
151 | #define STAT_TASK_PERIOD 10000 // 10000 * 1ms = 10s | |
|
152 | #else | |
|
153 | #define CLKDIV_SM_SIMULATOR (10416 - 1) // 10 ms => nominal is 1/96 = 0.010416667, 10417 - 1 = 10416 | |
|
154 | #define TIMER_SM_SIMULATOR 1 | |
|
155 | #define HK_PERIOD 100 // 100 * 10ms = 1s | |
|
146 | 156 | #define SY_LFR_TIME_SYN_TIMEOUT_in_ms 2000 |
|
147 | 157 | #define SY_LFR_TIME_SYN_TIMEOUT_in_ticks 200 // 200 * 10 ms = 2 s |
|
158 | #define SPOOL_TIMEOUT_in_ms 10 | |
|
159 | #define SPOOL_TIMEOUT_in_ticks 1 // 200 * 10 ms = 2 s | |
|
160 | #define STAT_TASK_PERIOD 1000 // 1000 * 10ms = 10s | |
|
161 | #endif | |
|
148 | 162 | |
|
149 | 163 | //********** |
|
150 | 164 | // LPP CODES |
@@ -173,6 +187,7 typedef struct ring_node | |||
|
173 | 187 | #define TASKID_PRC1 17 |
|
174 | 188 | #define TASKID_AVF2 18 |
|
175 | 189 | #define TASKID_PRC2 19 |
|
190 | #define TASKID_SPOO 20 | |
|
176 | 191 | |
|
177 | 192 | #define TASK_PRIORITY_SPIQ 5 |
|
178 | 193 | #define TASK_PRIORITY_WTDG 20 |
@@ -191,6 +206,7 typedef struct ring_node | |||
|
191 | 206 | #define TASK_PRIORITY_PRC1 100 |
|
192 | 207 | #define TASK_PRIORITY_AVF2 110 |
|
193 | 208 | #define TASK_PRIORITY_PRC2 110 |
|
209 | #define TASK_PRIORITY_SPOO 150 | |
|
194 | 210 | #define TASK_PRIORITY_STAT 200 |
|
195 | 211 | #define TASK_PRIORITY_DUMB 200 |
|
196 | 212 |
@@ -60,10 +60,14 extern struct param_local_str param_loca | |||
|
60 | 60 | extern time_management_regs_t *time_management_regs; |
|
61 | 61 | extern spectral_matrix_regs_t *spectral_matrix_regs; |
|
62 | 62 | |
|
63 |
extern rtems_name misc_name[ |
|
|
64 |
extern rtems_id Task_id[ |
|
|
63 | extern rtems_name misc_name[]; | |
|
64 | extern rtems_id Task_id[]; /* array of task ids */ | |
|
65 | 65 | |
|
66 | 66 | // ISR |
|
67 | void spectral_matrices_isr_f0( void ); | |
|
68 | void spectral_matrices_isr_f1( void ); | |
|
69 | void spectral_matrices_isr_f2( void ); | |
|
70 | void spectral_matrix_isr_error_handler( void ); | |
|
67 | 71 | rtems_isr spectral_matrices_isr( rtems_vector_number vector ); |
|
68 | 72 | rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector ); |
|
69 | 73 |
@@ -42,7 +42,9 int enter_mode( unsigned char mode , uns | |||
|
42 | 42 | int restart_science_tasks(unsigned char lfrRequestedMode ); |
|
43 | 43 | int suspend_science_tasks(); |
|
44 | 44 | void launch_waveform_picker(unsigned char mode , unsigned int transitionCoarseTime); |
|
45 | void launch_waveform_picker_spool(unsigned char mode , unsigned int transitionCoarseTime); | |
|
45 | 46 | void launch_spectral_matrix( void ); |
|
47 | void launch_spectral_matrix_spool( void ); | |
|
46 | 48 | void launch_spectral_matrix_simu( void ); |
|
47 | 49 | void set_irq_on_new_ready_matrix(unsigned char value ); |
|
48 | 50 | void set_run_matrix_spectral( unsigned char value ); |
@@ -32,7 +32,7 extern struct param_local_str param_loca | |||
|
32 | 32 | extern unsigned short sequenceCounters_SCIENCE_NORMAL_BURST; |
|
33 | 33 | extern unsigned short sequenceCounters_SCIENCE_SBM1_SBM2; |
|
34 | 34 | |
|
35 |
extern rtems_id Task_id[ |
|
|
35 | extern rtems_id Task_id[]; /* array of task ids */ | |
|
36 | 36 | |
|
37 | 37 | extern unsigned char lfrCurrentMode; |
|
38 | 38 | |
@@ -40,6 +40,7 extern unsigned char lfrCurrentMode; | |||
|
40 | 40 | // RTEMS_ISR |
|
41 | 41 | void reset_extractSWF( void ); |
|
42 | 42 | rtems_isr waveforms_isr( rtems_vector_number vector ); |
|
43 | rtems_isr waveforms_isr_alt( rtems_vector_number vector ); | |
|
43 | 44 | |
|
44 | 45 | //*********** |
|
45 | 46 | // RTEMS_TASK |
@@ -25,8 +25,8 | |||
|
25 | 25 | // RTEMS GLOBAL VARIABLES |
|
26 | 26 | rtems_name misc_name[5]; |
|
27 | 27 | rtems_id misc_id[5]; |
|
28 |
rtems_name Task_name[2 |
|
|
29 |
rtems_id Task_id[2 |
|
|
28 | rtems_name Task_name[21]; /* array of task names */ | |
|
29 | rtems_id Task_id[21]; /* array of task ids */ | |
|
30 | 30 | unsigned int maxCount; |
|
31 | 31 | int fdSPW = 0; |
|
32 | 32 | int fdUART = 0; |
@@ -26,7 +26,7 | |||
|
26 | 26 | #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER |
|
27 | 27 | #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER |
|
28 | 28 | |
|
29 |
#define CONFIGURE_MAXIMUM_TASKS 2 |
|
|
29 | #define CONFIGURE_MAXIMUM_TASKS 21 | |
|
30 | 30 | #define CONFIGURE_RTEMS_INIT_TASKS_TABLE |
|
31 | 31 | #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE) |
|
32 | 32 | #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32 |
@@ -40,6 +40,9 | |||
|
40 | 40 | #ifdef PRINT_STACK_REPORT |
|
41 | 41 | #define CONFIGURE_STACK_CHECKER_ENABLED |
|
42 | 42 | #endif |
|
43 | #ifdef FAST_SCHEDULER | |
|
44 | #define CONFIGURE_MICROSECONDS_PER_TICK 1000 /* 1 millisecond */ | |
|
45 | #endif | |
|
43 | 46 | |
|
44 | 47 | #include <rtems/confdefs.h> |
|
45 | 48 | |
@@ -194,13 +197,13 rtems_task Init( rtems_task_argument ign | |||
|
194 | 197 | //******************************* |
|
195 | 198 | |
|
196 | 199 | // configure IRQ handling for the waveform picker unit |
|
197 | status = rtems_interrupt_catch( waveforms_isr, | |
|
200 | status = rtems_interrupt_catch( waveforms_isr_alt, | |
|
198 | 201 | IRQ_SPARC_WAVEFORM_PICKER, |
|
199 | 202 | &old_isr_handler) ; |
|
200 | 203 | // configure IRQ handling for the spectral matrices unit |
|
201 | status = rtems_interrupt_catch( spectral_matrices_isr, | |
|
202 | IRQ_SPARC_SPECTRAL_MATRIX, | |
|
203 | &old_isr_handler) ; | |
|
204 | // status = rtems_interrupt_catch( spectral_matrices_isr, | |
|
205 | // IRQ_SPARC_SPECTRAL_MATRIX, | |
|
206 | // &old_isr_handler) ; | |
|
204 | 207 | |
|
205 | 208 | // if the spacewire link is not up then send an event to the SPIQ task for link recovery |
|
206 | 209 | if ( status_spw != RTEMS_SUCCESSFUL ) |
@@ -277,9 +280,11 void create_names( void ) // create all | |||
|
277 | 280 | Task_name[TASKID_PRC1] = rtems_build_name( 'P', 'R', 'C', '1' ); |
|
278 | 281 | Task_name[TASKID_AVF2] = rtems_build_name( 'A', 'V', 'F', '2' ); |
|
279 | 282 | Task_name[TASKID_PRC2] = rtems_build_name( 'P', 'R', 'C', '2' ); |
|
283 | Task_name[TASKID_SPOO] = rtems_build_name( 'S', 'P', 'O', 'O' ); | |
|
280 | 284 | |
|
281 | 285 | // rate monotonic period names |
|
282 |
name_hk_rate_monotonic = rtems_build_name( 'H', ' |
|
|
286 | name_hk_rate_monotonic = rtems_build_name( 'R', '_', 'H', 'K' ); | |
|
287 | name_spool_rate_monotonic = rtems_build_name( 'R', '_', 'S', 'P' ); | |
|
283 | 288 | |
|
284 | 289 | misc_name[QUEUE_RECV] = rtems_build_name( 'Q', '_', 'R', 'V' ); |
|
285 | 290 | misc_name[QUEUE_SEND] = rtems_build_name( 'Q', '_', 'S', 'D' ); |
@@ -467,6 +472,14 int create_all_tasks( void ) // create a | |||
|
467 | 472 | RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_HOUS] |
|
468 | 473 | ); |
|
469 | 474 | } |
|
475 | if (status == RTEMS_SUCCESSFUL) // SPOO | |
|
476 | { | |
|
477 | status = rtems_task_create( | |
|
478 | Task_name[TASKID_SPOO], TASK_PRIORITY_SPOO, RTEMS_MINIMUM_STACK_SIZE, | |
|
479 | RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT, | |
|
480 | RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPOO] | |
|
481 | ); | |
|
482 | } | |
|
470 | 483 | |
|
471 | 484 | return status; |
|
472 | 485 | } |
@@ -636,6 +649,13 int start_all_tasks( void ) // start all | |||
|
636 | 649 | BOOT_PRINTF("in INIT *** Error starting TASK_STAT\n") |
|
637 | 650 | } |
|
638 | 651 | } |
|
652 | if (status == RTEMS_SUCCESSFUL) // SPOO | |
|
653 | { | |
|
654 | status = rtems_task_start( Task_id[TASKID_SPOO], spoo_task, 1 ); | |
|
655 | if (status!=RTEMS_SUCCESSFUL) { | |
|
656 | BOOT_PRINTF("in INIT *** Error starting TASK_SPOO\n") | |
|
657 | } | |
|
658 | } | |
|
639 | 659 | |
|
640 | 660 | return status; |
|
641 | 661 | } |
@@ -125,7 +125,7 rtems_task stat_task(rtems_task_argument | |||
|
125 | 125 | j = 0; |
|
126 | 126 | BOOT_PRINTF("in STAT *** \n") |
|
127 | 127 | while(1){ |
|
128 |
rtems_task_wake_after( |
|
|
128 | rtems_task_wake_after(STAT_TASK_PERIOD); | |
|
129 | 129 | PRINTF1("%d\n", j) |
|
130 | 130 | if (i == CPU_USAGE_REPORT_PERIOD) { |
|
131 | 131 | // #ifdef PRINT_TASK_STATISTICS |
@@ -156,7 +156,7 rtems_task hous_task(rtems_task_argument | |||
|
156 | 156 | if (rtems_rate_monotonic_ident( name_hk_rate_monotonic, &HK_id) != RTEMS_SUCCESSFUL) { |
|
157 | 157 | status = rtems_rate_monotonic_create( name_hk_rate_monotonic, &HK_id ); |
|
158 | 158 | if( status != RTEMS_SUCCESSFUL ) { |
|
159 | PRINTF1( "rtems_rate_monotonic_create failed with status of %d\n", status ) | |
|
159 | PRINTF1( "in HOUS *** rtems_rate_monotonic_create failed with status of %d\n", status ) | |
|
160 | 160 | } |
|
161 | 161 | } |
|
162 | 162 | |
@@ -524,6 +524,3 void get_cpu_load( unsigned char *resour | |||
|
524 | 524 | #endif |
|
525 | 525 | |
|
526 | 526 | } |
|
527 | ||
|
528 | ||
|
529 |
@@ -208,6 +208,7 rtems_task send_task( rtems_task_argumen | |||
|
208 | 208 | size_t size; // size of the incoming TC packet |
|
209 | 209 | u_int32_t count; |
|
210 | 210 | rtems_id queue_id; |
|
211 | rtems_interrupt_level level; | |
|
211 | 212 | |
|
212 | 213 | status = get_message_queue_id_send( &queue_id ); |
|
213 | 214 | if (status != RTEMS_SUCCESSFUL) |
@@ -221,7 +222,7 rtems_task send_task( rtems_task_argumen | |||
|
221 | 222 | { |
|
222 | 223 | status = rtems_message_queue_receive( queue_id, incomingData, &size, |
|
223 | 224 | RTEMS_WAIT, RTEMS_NO_TIMEOUT ); |
|
224 | ||
|
225 | rtems_interrupt_disable( level ); | |
|
225 | 226 | if (status!=RTEMS_SUCCESSFUL) |
|
226 | 227 | { |
|
227 | 228 | PRINTF1("in SEND *** (1) ERR = %d\n", status) |
@@ -257,6 +258,8 rtems_task send_task( rtems_task_argumen | |||
|
257 | 258 | maxCount = count; |
|
258 | 259 | } |
|
259 | 260 | } |
|
261 | ||
|
262 | rtems_interrupt_enable( level ); | |
|
260 | 263 | } |
|
261 | 264 | } |
|
262 | 265 |
@@ -173,10 +173,12 void spectral_matrices_isr_f2( void ) | |||
|
173 | 173 | |
|
174 | 174 | void spectral_matrix_isr_error_handler( void ) |
|
175 | 175 | { |
|
176 | if (spectral_matrix_regs->status & 0x7c0) // [0111 1100 0000] | |
|
177 | { | |
|
178 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); | |
|
179 | } | |
|
176 | // if (spectral_matrix_regs->status & 0x7c0) // [0111 1100 0000] | |
|
177 | // { | |
|
178 | // rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); | |
|
179 | // } | |
|
180 | ||
|
181 | spectral_matrix_regs->status = spectral_matrix_regs->status & 0x83f; | |
|
180 | 182 | } |
|
181 | 183 | |
|
182 | 184 | rtems_isr spectral_matrices_isr( rtems_vector_number vector ) |
@@ -531,9 +531,16 int enter_mode( unsigned char mode, unsi | |||
|
531 | 531 | maxCount = 0; |
|
532 | 532 | #endif |
|
533 | 533 | status = restart_science_tasks( mode ); |
|
534 | //**************** | |
|
535 | // WAVEFORM PICKER | |
|
534 | 536 | launch_waveform_picker( mode, transitionCoarseTime ); |
|
535 | launch_spectral_matrix( ); | |
|
537 | // launch_waveform_picker_spool( mode, transitionCoarseTime ); | |
|
538 | ||
|
539 | //****************** | |
|
540 | // SPECTRAL MATRICES | |
|
541 | // launch_spectral_matrix( ); | |
|
536 | 542 | // launch_spectral_matrix_simu( ); |
|
543 | launch_spectral_matrix_spool( ); | |
|
537 | 544 | } |
|
538 | 545 | else if ( mode == LFR_MODE_STANDBY ) |
|
539 | 546 | { |
@@ -575,7 +582,7 int restart_science_tasks(unsigned char | |||
|
575 | 582 | * |
|
576 | 583 | */ |
|
577 | 584 | |
|
578 |
rtems_status_code status[1 |
|
|
585 | rtems_status_code status[11]; | |
|
579 | 586 | rtems_status_code ret; |
|
580 | 587 | |
|
581 | 588 | ret = RTEMS_SUCCESSFUL; |
@@ -640,11 +647,19 int restart_science_tasks(unsigned char | |||
|
640 | 647 | PRINTF1("in restart_science_task *** PRC2 ERR %d\n", status[9]) |
|
641 | 648 | } |
|
642 | 649 | |
|
650 | status[10] = rtems_task_restart( Task_id[TASKID_SPOO], 1 ); | |
|
651 | if (status[10] != RTEMS_SUCCESSFUL) | |
|
652 | { | |
|
653 | PRINTF1("in restart_science_task *** SPOO ERR %d\n", status[10]) | |
|
654 | } | |
|
655 | ||
|
656 | ||
|
643 | 657 | if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || |
|
644 | 658 | (status[2] != RTEMS_SUCCESSFUL) || (status[3] != RTEMS_SUCCESSFUL) || |
|
645 | 659 | (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) || |
|
646 | 660 | (status[6] != RTEMS_SUCCESSFUL) || (status[7] != RTEMS_SUCCESSFUL) || |
|
647 |
(status[8] != RTEMS_SUCCESSFUL) || (status[9] != RTEMS_SUCCESSFUL) |
|
|
661 | (status[8] != RTEMS_SUCCESSFUL) || (status[9] != RTEMS_SUCCESSFUL) || | |
|
662 | (status[10]!= RTEMS_SUCCESSFUL) ) | |
|
648 | 663 | { |
|
649 | 664 | ret = RTEMS_UNSATISFIED; |
|
650 | 665 | } |
@@ -742,10 +757,35 int suspend_science_tasks() | |||
|
742 | 757 | PRINTF1("in suspend_science_task *** CWF1 ERR %d\n", status) |
|
743 | 758 | } |
|
744 | 759 | } |
|
760 | if (status == RTEMS_SUCCESSFUL) // suspend SPOO | |
|
761 | { | |
|
762 | status = rtems_task_suspend( Task_id[TASKID_SPOO] ); | |
|
763 | if (status != RTEMS_SUCCESSFUL) | |
|
764 | { | |
|
765 | PRINTF1("in suspend_science_task *** SPOO ERR %d\n", status) | |
|
766 | } | |
|
767 | } | |
|
745 | 768 | |
|
746 | 769 | return status; |
|
747 | 770 | } |
|
748 | 771 | |
|
772 | void launch_waveform_picker_spool( unsigned char mode, unsigned int transitionCoarseTime ) | |
|
773 | { | |
|
774 | WFP_reset_current_ring_nodes(); | |
|
775 | reset_waveform_picker_regs(); | |
|
776 | set_wfp_burst_enable_register( mode ); | |
|
777 | ||
|
778 | waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x80; // [1000 0000] | |
|
779 | if (transitionCoarseTime == 0) | |
|
780 | { | |
|
781 | waveform_picker_regs->start_date = time_management_regs->coarse_time; | |
|
782 | } | |
|
783 | else | |
|
784 | { | |
|
785 | waveform_picker_regs->start_date = transitionCoarseTime; | |
|
786 | } | |
|
787 | } | |
|
788 | ||
|
749 | 789 | void launch_waveform_picker( unsigned char mode, unsigned int transitionCoarseTime ) |
|
750 | 790 | { |
|
751 | 791 | WFP_reset_current_ring_nodes(); |
@@ -766,6 +806,20 void launch_waveform_picker( unsigned ch | |||
|
766 | 806 | } |
|
767 | 807 | } |
|
768 | 808 | |
|
809 | void launch_spectral_matrix_spool( void ) | |
|
810 | { | |
|
811 | SM_reset_current_ring_nodes(); | |
|
812 | reset_spectral_matrix_regs(); | |
|
813 | reset_nb_sm(); | |
|
814 | ||
|
815 | struct grgpio_regs_str *grgpio_regs = (struct grgpio_regs_str *) REGS_ADDR_GRGPIO; | |
|
816 | grgpio_regs->io_port_direction_register = | |
|
817 | grgpio_regs->io_port_direction_register | 0x01; // [0000 0001], 0 = output disabled, 1 = output enabled | |
|
818 | grgpio_regs->io_port_output_register = grgpio_regs->io_port_output_register & 0xfffffffe; // set the bit 0 to 0 | |
|
819 | set_irq_on_new_ready_matrix( 0 ); | |
|
820 | set_run_matrix_spectral( 1 ); | |
|
821 | } | |
|
822 | ||
|
769 | 823 | void launch_spectral_matrix( void ) |
|
770 | 824 | { |
|
771 | 825 | SM_reset_current_ring_nodes(); |
@@ -44,6 +44,12 bool swf_f0_ready = false; | |||
|
44 | 44 | bool swf_f1_ready = false; |
|
45 | 45 | bool swf_f2_ready = false; |
|
46 | 46 | |
|
47 | bool wake_up_task_wfrm = false; | |
|
48 | bool wake_up_task_cwf_f1 = false; | |
|
49 | bool wake_up_task_cwf_f2_burst = false; | |
|
50 | bool wake_up_task_cwf_f2_sbm2 = false; | |
|
51 | bool wake_up_task_cwf_f3 = false; | |
|
52 | ||
|
47 | 53 | int wf_snap_extracted[ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) + TIME_OFFSET ]; |
|
48 | 54 | |
|
49 | 55 | //********************* |
@@ -190,6 +196,135 rtems_isr waveforms_isr( rtems_vector_nu | |||
|
190 | 196 | } |
|
191 | 197 | } |
|
192 | 198 | |
|
199 | rtems_isr waveforms_isr_alt( rtems_vector_number vector ) | |
|
200 | { | |
|
201 | /** This is the interrupt sub routine called by the waveform picker core. | |
|
202 | * | |
|
203 | * This ISR launch different actions depending mainly on two pieces of information: | |
|
204 | * 1. the values read in the registers of the waveform picker. | |
|
205 | * 2. the current LFR mode. | |
|
206 | * | |
|
207 | */ | |
|
208 | ||
|
209 | rtems_interrupt_level level; | |
|
210 | ||
|
211 | rtems_interrupt_disable( level ); | |
|
212 | ||
|
213 | if ( (lfrCurrentMode == LFR_MODE_NORMAL) || (lfrCurrentMode == LFR_MODE_BURST) // in BURST the data are used to place v, e1 and e2 in the HK packet | |
|
214 | || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) | |
|
215 | { // in modes other than STANDBY and BURST, send the CWF_F3 data | |
|
216 | if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full | |
|
217 | // (1) change the receiving buffer for the waveform picker | |
|
218 | ring_node_to_send_cwf_f3 = current_ring_node_f3; | |
|
219 | current_ring_node_f3 = current_ring_node_f3->next; | |
|
220 | waveform_picker_regs->addr_data_f3 = current_ring_node_f3->buffer_address; | |
|
221 | // (2) send an event for the waveforms transmission | |
|
222 | wake_up_task_cwf_f3 = true; | |
|
223 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111] | |
|
224 | } | |
|
225 | } | |
|
226 | ||
|
227 | switch(lfrCurrentMode) | |
|
228 | { | |
|
229 | //******** | |
|
230 | // STANDBY | |
|
231 | case(LFR_MODE_STANDBY): | |
|
232 | break; | |
|
233 | ||
|
234 | //****** | |
|
235 | // NORMAL | |
|
236 | case(LFR_MODE_NORMAL): | |
|
237 | if ( (waveform_picker_regs->status & 0xff8) != 0x00) // [1000] check the error bits | |
|
238 | { | |
|
239 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); | |
|
240 | } | |
|
241 | if ( (waveform_picker_regs->status & 0x07) == 0x07) // [0111] check the f2, f1, f0 full bits | |
|
242 | { | |
|
243 | // change F0 ring node | |
|
244 | ring_node_to_send_swf_f0 = current_ring_node_f0; | |
|
245 | current_ring_node_f0 = current_ring_node_f0->next; | |
|
246 | waveform_picker_regs->addr_data_f0 = current_ring_node_f0->buffer_address; | |
|
247 | // change F1 ring node | |
|
248 | ring_node_to_send_swf_f1 = current_ring_node_f1; | |
|
249 | current_ring_node_f1 = current_ring_node_f1->next; | |
|
250 | waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; | |
|
251 | // change F2 ring node | |
|
252 | ring_node_to_send_swf_f2 = current_ring_node_f2; | |
|
253 | current_ring_node_f2 = current_ring_node_f2->next; | |
|
254 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; | |
|
255 | // | |
|
256 | wake_up_task_wfrm = true; | |
|
257 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] | |
|
258 | } | |
|
259 | break; | |
|
260 | ||
|
261 | //****** | |
|
262 | // BURST | |
|
263 | case(LFR_MODE_BURST): | |
|
264 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit | |
|
265 | // (1) change the receiving buffer for the waveform picker | |
|
266 | ring_node_to_send_cwf_f2 = current_ring_node_f2; | |
|
267 | current_ring_node_f2 = current_ring_node_f2->next; | |
|
268 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; | |
|
269 | // (2) send an event for the waveforms transmission | |
|
270 | wake_up_task_cwf_f2_burst = true; | |
|
271 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 | |
|
272 | } | |
|
273 | break; | |
|
274 | ||
|
275 | //***** | |
|
276 | // SBM1 | |
|
277 | case(LFR_MODE_SBM1): | |
|
278 | if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit | |
|
279 | // (1) change the receiving buffer for the waveform picker | |
|
280 | ring_node_to_send_cwf_f1 = current_ring_node_f1; | |
|
281 | current_ring_node_f1 = current_ring_node_f1->next; | |
|
282 | waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; | |
|
283 | // (2) send an event for the the CWF1 task for transmission (and snapshot extraction if needed) | |
|
284 | wake_up_task_cwf_f1 = true; | |
|
285 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bits = 0 | |
|
286 | } | |
|
287 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit | |
|
288 | swf_f0_ready = true; | |
|
289 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1111 1110 1110 1110] f0 bits = 0 | |
|
290 | } | |
|
291 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ) { // [0100] check the f2 full bit | |
|
292 | swf_f2_ready = true; | |
|
293 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bits = 0 | |
|
294 | } | |
|
295 | break; | |
|
296 | ||
|
297 | //***** | |
|
298 | // SBM2 | |
|
299 | case(LFR_MODE_SBM2): | |
|
300 | if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit | |
|
301 | // (1) change the receiving buffer for the waveform picker | |
|
302 | ring_node_to_send_cwf_f2 = current_ring_node_f2; | |
|
303 | current_ring_node_f2 = current_ring_node_f2->next; | |
|
304 | waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; | |
|
305 | // (2) send an event for the waveforms transmission | |
|
306 | wake_up_task_cwf_f2_sbm2 = true; | |
|
307 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 | |
|
308 | } | |
|
309 | if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit | |
|
310 | swf_f0_ready = true; | |
|
311 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1111 1110 1110 1110] f0 bits = 0 | |
|
312 | } | |
|
313 | if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit | |
|
314 | swf_f1_ready = true; | |
|
315 | waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1, f0 bits = 0 | |
|
316 | } | |
|
317 | break; | |
|
318 | ||
|
319 | //******** | |
|
320 | // DEFAULT | |
|
321 | default: | |
|
322 | break; | |
|
323 | } | |
|
324 | ||
|
325 | rtems_interrupt_enable( level ); | |
|
326 | } | |
|
327 | ||
|
193 | 328 | //************ |
|
194 | 329 | // RTEMS TASKS |
|
195 | 330 | |
@@ -379,6 +514,7 rtems_task cwf1_task(rtems_task_argument | |||
|
379 | 514 | rtems_event_set event_out; |
|
380 | 515 | rtems_id queue_id; |
|
381 | 516 | rtems_status_code status; |
|
517 | rtems_interrupt_level level = 0; | |
|
382 | 518 | |
|
383 | 519 | init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 ); |
|
384 | 520 | |
@@ -390,10 +526,17 rtems_task cwf1_task(rtems_task_argument | |||
|
390 | 526 | |
|
391 | 527 | BOOT_PRINTF("in CWF1 ***\n") |
|
392 | 528 | |
|
529 | printf("(0) level = %x\n", (unsigned int) level); | |
|
530 | ||
|
393 | 531 | while(1){ |
|
394 | 532 | // wait for an RTEMS_EVENT |
|
395 | 533 | rtems_event_receive( RTEMS_EVENT_MODE_SBM1, |
|
396 | 534 | RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); |
|
535 | ||
|
536 | rtems_interrupt_disable( level ); | |
|
537 | ||
|
538 | printf("(1) level = %x\n", (unsigned int) level); | |
|
539 | ||
|
397 | 540 | send_waveform_CWF( (volatile int*) ring_node_to_send_cwf_f1->buffer_address, SID_SBM1_CWF_F1, headerCWF_F1, queue_id ); |
|
398 | 541 | // launch snapshot extraction if needed |
|
399 | 542 | if (extractSWF == true) |
@@ -414,6 +557,10 rtems_task cwf1_task(rtems_task_argument | |||
|
414 | 557 | swf_f1_ready = false; |
|
415 | 558 | swf_f2_ready = false; |
|
416 | 559 | } |
|
560 | ||
|
561 | rtems_interrupt_enable( level ); | |
|
562 | ||
|
563 | printf("(2) level = %x\n", (unsigned int) level); | |
|
417 | 564 | } |
|
418 | 565 | } |
|
419 | 566 |
General Comments 0
You need to be logged in to leave comments.
Login now