##// END OF EJS Templates
STAT task removec...
paul -
r239:1c5814170464 R3
parent child
Show More
@@ -1,2 +1,2
1 1 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters
2 e1bf35e31e3c8c1d1448d2e485c71f5f1259615c header/lfr_common_headers
2 721463c11a484e6a3439e16c99f8bd27720b9265 header/lfr_common_headers
@@ -19,16 +19,24 enum lfr_reset_cause_t{
19 19 UNEXP_RESET
20 20 };
21 21
22 extern gptimer_regs_t *gptimer_regs;
23
22 24 #define LFR_RESET_CAUSE_UNKNOWN_CAUSE 0
23 25
24 rtems_name name_hk_rate_monotonic; // name of the HK rate monotonic
25 rtems_id HK_id; // id of the HK rate monotonic period
26 rtems_name name_hk_rate_monotonic; // name of the HK rate monotonic
27 rtems_id HK_id; // id of the HK rate monotonic period
26 28
27 void configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
29 void timer_configure( unsigned char timer, unsigned int clock_divider,
28 30 unsigned char interrupt_level, rtems_isr (*timer_isr)() );
29 void timer_start( gptimer_regs_t *gptimer_regs, unsigned char timer );
30 void timer_stop( gptimer_regs_t *gptimer_regs, unsigned char timer );
31 void timer_set_clock_divider(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider);
31 void timer_start( unsigned char timer );
32 void timer_stop( unsigned char timer );
33 void timer_set_clock_divider(unsigned char timer, unsigned int clock_divider);
34
35 // WATCHDOG
36 rtems_isr watchdog_isr( rtems_vector_number vector );
37 void watchdog_configure(void);
38 void watchdog_stop(void);
39 void watchdog_start(void);
32 40
33 41 // SERIAL LINK
34 42 int send_console_outputs_on_apbuart_port( void );
@@ -36,7 +44,7 int enable_apbuart_transmitter( void );
36 44 void set_apbuart_scaler_reload_register(unsigned int regs, unsigned int value);
37 45
38 46 // RTEMS TASKS
39 rtems_task stat_task( rtems_task_argument argument );
47 rtems_task load_task( rtems_task_argument argument );
40 48 rtems_task hous_task( rtems_task_argument argument );
41 49 rtems_task dumb_task( rtems_task_argument unused );
42 50
@@ -97,11 +97,9 extern volatile spectral_matrix_regs_t *
97 97 extern rtems_name misc_name[5];
98 98 extern rtems_id Task_id[20]; /* array of task ids */
99 99
100 //
101 100 ring_node * getRingNodeForAveraging( unsigned char frequencyChannel);
102 101 // ISR
103 102 rtems_isr spectral_matrices_isr( rtems_vector_number vector );
104 rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector );
105 103
106 104 //******************
107 105 // Spectral Matrices
@@ -141,7 +141,7 rtems_task Init( rtems_task_argument ign
141 141 pa_bia_status_info = 0x00;
142 142
143 143 // waveform picker initialization
144 WFP_init_rings(); // initialize the waveform rings
144 WFP_init_rings(); LEON_Clear_interrupt( IRQ_SPARC_GPTIMER_WATCHDOG ); // initialize the waveform rings
145 145 WFP_reset_current_ring_nodes();
146 146 reset_waveform_picker_regs();
147 147
@@ -221,14 +221,6 rtems_task Init( rtems_task_argument ign
221 221 PRINTF1("in INIT *** in suspend_science_tasks *** ERR code: %d\n", status)
222 222 }
223 223
224 //******************************
225 // <SPECTRAL MATRICES SIMULATOR>
226 LEON_Mask_interrupt( IRQ_SM_SIMULATOR );
227 configure_timer((gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR, CLKDIV_SM_SIMULATOR,
228 IRQ_SPARC_SM_SIMULATOR, spectral_matrices_isr_simu );
229 // </SPECTRAL MATRICES SIMULATOR>
230 //*******************************
231
232 224 // configure IRQ handling for the waveform picker unit
233 225 status = rtems_interrupt_catch( waveforms_isr,
234 226 IRQ_SPARC_WAVEFORM_PICKER,
@@ -299,7 +291,7 void create_names( void ) // create all
299 291 Task_name[TASKID_RECV] = rtems_build_name( 'R', 'E', 'C', 'V' );
300 292 Task_name[TASKID_ACTN] = rtems_build_name( 'A', 'C', 'T', 'N' );
301 293 Task_name[TASKID_SPIQ] = rtems_build_name( 'S', 'P', 'I', 'Q' );
302 Task_name[TASKID_STAT] = rtems_build_name( 'S', 'T', 'A', 'T' );
294 Task_name[TASKID_LOAD] = rtems_build_name( 'L', 'O', 'A', 'D' );
303 295 Task_name[TASKID_AVF0] = rtems_build_name( 'A', 'V', 'F', '0' );
304 296 Task_name[TASKID_SWBD] = rtems_build_name( 'S', 'W', 'B', 'D' );
305 297 Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' );
@@ -481,12 +473,12 int create_all_tasks( void ) // create a
481 473
482 474 //*****
483 475 // MISC
484 if (status == RTEMS_SUCCESSFUL) // STAT
476 if (status == RTEMS_SUCCESSFUL) // LOAD
485 477 {
486 478 status = rtems_task_create(
487 Task_name[TASKID_STAT], TASK_PRIORITY_STAT, RTEMS_MINIMUM_STACK_SIZE,
479 Task_name[TASKID_LOAD], TASK_PRIORITY_LOAD, RTEMS_MINIMUM_STACK_SIZE,
488 480 RTEMS_DEFAULT_MODES,
489 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_STAT]
481 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_LOAD]
490 482 );
491 483 }
492 484 if (status == RTEMS_SUCCESSFUL) // DUMB
@@ -667,11 +659,11 int start_all_tasks( void ) // start all
667 659 BOOT_PRINTF("in INIT *** Error starting TASK_DUMB\n")
668 660 }
669 661 }
670 if (status == RTEMS_SUCCESSFUL) // STAT
662 if (status == RTEMS_SUCCESSFUL) // LOAD
671 663 {
672 status = rtems_task_start( Task_id[TASKID_STAT], stat_task, 1 );
664 status = rtems_task_start( Task_id[TASKID_LOAD], load_task, 1 );
673 665 if (status!=RTEMS_SUCCESSFUL) {
674 BOOT_PRINTF("in INIT *** Error starting TASK_STAT\n")
666 BOOT_PRINTF("in INIT *** Error starting TASK_LOAD\n")
675 667 }
676 668 }
677 669
@@ -7,7 +7,7
7 7
8 8 #include "fsw_misc.h"
9 9
10 void configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider,
10 void timer_configure(unsigned char timer, unsigned int clock_divider,
11 11 unsigned char interrupt_level, rtems_isr (*timer_isr)() )
12 12 {
13 13 /** This function configures a GPTIMER timer instantiated in the VHDL design.
@@ -33,10 +33,10 void configure_timer(gptimer_regs_t *gpt
33 33 PRINTF("in configure_timer *** ERR rtems_interrupt_catch\n")
34 34 }
35 35
36 timer_set_clock_divider( gptimer_regs, timer, clock_divider);
36 timer_set_clock_divider( timer, clock_divider);
37 37 }
38 38
39 void timer_start(gptimer_regs_t *gptimer_regs, unsigned char timer)
39 void timer_start(unsigned char timer)
40 40 {
41 41 /** This function starts a GPTIMER timer.
42 42 *
@@ -52,7 +52,7 void timer_start(gptimer_regs_t *gptimer
52 52 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000008; // IE interrupt enable
53 53 }
54 54
55 void timer_stop(gptimer_regs_t *gptimer_regs, unsigned char timer)
55 void timer_stop(unsigned char timer)
56 56 {
57 57 /** This function stops a GPTIMER timer.
58 58 *
@@ -66,7 +66,7 void timer_stop(gptimer_regs_t *gptimer_
66 66 gptimer_regs->timer[timer].ctrl = gptimer_regs->timer[timer].ctrl | 0x00000010; // clear pending IRQ if any
67 67 }
68 68
69 void timer_set_clock_divider(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider)
69 void timer_set_clock_divider(unsigned char timer, unsigned int clock_divider)
70 70 {
71 71 /** This function sets the clock divider of a GPTIMER timer.
72 72 *
@@ -79,6 +79,70 void timer_set_clock_divider(gptimer_reg
79 79 gptimer_regs->timer[timer].reload = clock_divider; // base clock frequency is 1 MHz
80 80 }
81 81
82 // WATCHDOG
83
84 rtems_isr watchdog_isr( rtems_vector_number vector )
85 {
86 rtems_status_code status_code;
87
88 status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_12 );
89 }
90
91 void watchdog_configure(void)
92 {
93 /** This function configure the watchdog.
94 *
95 * @param gptimer_regs points to the APB registers of the GPTIMER IP core.
96 * @param timer is the number of the timer in the IP core (several timers can be instantiated).
97 *
98 * The watchdog is a timer provided by the GPTIMER IP core of the GRLIB.
99 *
100 */
101
102 LEON_Mask_interrupt( IRQ_GPTIMER_WATCHDOG ); // mask gptimer/watchdog interrupt during configuration
103
104 timer_configure( TIMER_WATCHDOG, CLKDIV_WATCHDOG, IRQ_SPARC_GPTIMER_WATCHDOG, watchdog_isr );
105
106 LEON_Clear_interrupt( IRQ_GPTIMER_WATCHDOG ); // clear gptimer/watchdog interrupt
107 }
108
109 void watchdog_stop(void)
110 {
111 LEON_Mask_interrupt( IRQ_GPTIMER_WATCHDOG ); // mask gptimer/watchdog interrupt line
112 timer_stop( TIMER_WATCHDOG );
113 LEON_Clear_interrupt( IRQ_GPTIMER_WATCHDOG ); // clear gptimer/watchdog interrupt
114 }
115
116 void watchdog_reload(void)
117 {
118 /** This function reloads the watchdog timer counter with the timer reload value.
119 *
120 *
121 */
122
123 gptimer_regs->timer[TIMER_WATCHDOG].ctrl = gptimer_regs->timer[TIMER_WATCHDOG].ctrl | 0x00000004; // LD load value from the reload register
124 }
125
126 void watchdog_start(void)
127 {
128 /** This function starts the watchdog timer.
129 *
130 * @param gptimer_regs points to the APB registers of the GPTIMER IP core.
131 * @param timer is the number of the timer in the IP core (several timers can be instantiated).
132 *
133 */
134
135 LEON_Clear_interrupt( IRQ_GPTIMER_WATCHDOG );
136
137 gptimer_regs->timer[TIMER_WATCHDOG].ctrl = gptimer_regs->timer[TIMER_WATCHDOG].ctrl | 0x00000010; // clear pending IRQ if any
138 gptimer_regs->timer[TIMER_WATCHDOG].ctrl = gptimer_regs->timer[TIMER_WATCHDOG].ctrl | 0x00000004; // LD load value from the reload register
139 gptimer_regs->timer[TIMER_WATCHDOG].ctrl = gptimer_regs->timer[TIMER_WATCHDOG].ctrl | 0x00000001; // EN enable the timer
140 gptimer_regs->timer[TIMER_WATCHDOG].ctrl = gptimer_regs->timer[TIMER_WATCHDOG].ctrl | 0x00000008; // IE interrupt enable
141
142 LEON_Unmask_interrupt( IRQ_GPTIMER_WATCHDOG );
143
144 }
145
82 146 int send_console_outputs_on_apbuart_port( void ) // Send the console outputs on the apbuart port
83 147 {
84 148 struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) REGS_ADDR_APBUART;
@@ -117,25 +181,44 void set_apbuart_scaler_reload_register(
117 181 //************
118 182 // RTEMS TASKS
119 183
120 rtems_task stat_task(rtems_task_argument argument)
184 rtems_task load_task(rtems_task_argument argument)
121 185 {
122 int i;
123 int j;
186 BOOT_PRINTF("in LOAD *** \n")
187
188 rtems_status_code status;
189 unsigned int i;
190 unsigned int j;
191 rtems_name name_watchdog_rate_monotonic; // name of the watchdog rate monotonic
192 rtems_id watchdog_period_id; // id of the watchdog rate monotonic period
193
194 name_watchdog_rate_monotonic = rtems_build_name( 'L', 'O', 'A', 'D' );
195
196 status = rtems_rate_monotonic_create( name_watchdog_rate_monotonic, &watchdog_period_id );
197 if( status != RTEMS_SUCCESSFUL ) {
198 PRINTF1( "in LOAD *** rtems_rate_monotonic_create failed with status of %d\n", status )
199 }
200
124 201 i = 0;
125 202 j = 0;
126 BOOT_PRINTF("in STAT *** \n")
203
204 watchdog_configure();
205
206 watchdog_start();
207
127 208 while(1){
128 rtems_task_wake_after(1000);
129 PRINTF1("%d\n", j)
130 if (i == CPU_USAGE_REPORT_PERIOD) {
131 // #ifdef PRINT_TASK_STATISTICS
132 // rtems_cpu_usage_report();
133 // rtems_cpu_usage_reset();
134 // #endif
209 status = rtems_rate_monotonic_period( watchdog_period_id, WATCHDOG_PERIOD );
210 watchdog_reload();
211 i = i + 1;
212 if ( i == 10 )
213 {
135 214 i = 0;
215 j = j + 1;
216 PRINTF1("%d\n", j)
136 217 }
137 else i++;
138 j++;
218 if (j == 3 )
219 {
220 status = rtems_task_delete(RTEMS_SELF);
221 }
139 222 }
140 223 }
141 224
@@ -255,7 +338,7 rtems_task dumb_task( rtems_task_argumen
255 338 unsigned int fine_time = 0;
256 339 rtems_event_set event_out;
257 340
258 char *DumbMessages[12] = {"in DUMB *** default", // RTEMS_EVENT_0
341 char *DumbMessages[13] = {"in DUMB *** default", // RTEMS_EVENT_0
259 342 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1
260 343 "in DUMB *** f3 buffer changed", // RTEMS_EVENT_2
261 344 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3
@@ -266,7 +349,8 rtems_task dumb_task( rtems_task_argumen
266 349 "VHDL ERR *** spectral matrix", // RTEMS_EVENT_8
267 350 "tick", // RTEMS_EVENT_9
268 351 "VHDL ERR *** waveform picker", // RTEMS_EVENT_10
269 "VHDL ERR *** unexpected ready matrix values" // RTEMS_EVENT_11
352 "VHDL ERR *** unexpected ready matrix values", // RTEMS_EVENT_11
353 "WATCHDOG timer" // RTEMS_EVENT_12
270 354 };
271 355
272 356 BOOT_PRINTF("in DUMB *** \n")
@@ -274,7 +358,7 rtems_task dumb_task( rtems_task_argumen
274 358 while(1){
275 359 rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3
276 360 | RTEMS_EVENT_4 | RTEMS_EVENT_5 | RTEMS_EVENT_6 | RTEMS_EVENT_7
277 | RTEMS_EVENT_8 | RTEMS_EVENT_9,
361 | RTEMS_EVENT_8 | RTEMS_EVENT_9 | RTEMS_EVENT_12,
278 362 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT
279 363 intEventOut = (unsigned int) event_out;
280 364 for ( i=0; i<32; i++)
@@ -283,11 +367,9 rtems_task dumb_task( rtems_task_argumen
283 367 {
284 368 coarse_time = time_management_regs->coarse_time;
285 369 fine_time = time_management_regs->fine_time;
286 if (i==8)
370 if (i==12)
287 371 {
288 }
289 if (i==10)
290 {
372 PRINTF1("%s\n", DumbMessages[12])
291 373 }
292 374 }
293 375 }
@@ -246,55 +246,6 rtems_isr spectral_matrices_isr( rtems_v
246 246 spectral_matrix_isr_error_handler( statusReg );
247 247 }
248 248
249 rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector )
250 {
251 rtems_status_code status_code;
252
253 //***
254 // F0
255 nb_sm_f0 = nb_sm_f0 + 1;
256 if (nb_sm_f0 == NB_SM_BEFORE_AVF0 )
257 {
258 ring_node_for_averaging_sm_f0 = current_ring_node_sm_f0;
259 if (rtems_event_send( Task_id[TASKID_AVF0], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
260 {
261 status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 );
262 }
263 nb_sm_f0 = 0;
264 }
265
266 //***
267 // F1
268 nb_sm_f0_aux_f1 = nb_sm_f0_aux_f1 + 1;
269 if (nb_sm_f0_aux_f1 == 6)
270 {
271 nb_sm_f0_aux_f1 = 0;
272 nb_sm_f1 = nb_sm_f1 + 1;
273 }
274 if (nb_sm_f1 == NB_SM_BEFORE_AVF1 )
275 {
276 ring_node_for_averaging_sm_f1 = current_ring_node_sm_f1;
277 if (rtems_event_send( Task_id[TASKID_AVF1], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
278 {
279 status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 );
280 }
281 nb_sm_f1 = 0;
282 }
283
284 //***
285 // F2
286 nb_sm_f0_aux_f2 = nb_sm_f0_aux_f2 + 1;
287 if (nb_sm_f0_aux_f2 == 96)
288 {
289 nb_sm_f0_aux_f2 = 0;
290 ring_node_for_averaging_sm_f2 = current_ring_node_sm_f2;
291 if (rtems_event_send( Task_id[TASKID_AVF2], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL)
292 {
293 status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 );
294 }
295 }
296 }
297
298 249 //******************
299 250 // Spectral Matrices
300 251
@@ -566,12 +566,6 int stop_current_mode( void )
566 566 LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); // clear waveform picker interrupt
567 567 LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt
568 568
569 // <Spectral Matrices simulator>
570 LEON_Mask_interrupt( IRQ_SM_SIMULATOR ); // mask spectral matrix interrupt simulator
571 timer_stop( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR );
572 LEON_Clear_interrupt( IRQ_SM_SIMULATOR ); // clear spectral matrix interrupt simulator
573 // </Spectral Matrices simulator>
574
575 569 // suspend several tasks
576 570 if (lfrCurrentMode != LFR_MODE_STANDBY) {
577 571 status = suspend_science_tasks();
General Comments 0
You need to be logged in to leave comments. Login now