##// END OF EJS Templates
Switched to cmake, more portable and better conf options!
jeandet -
r301:04a96444cae4 R3_plus draft
parent child
Show More
@@ -0,0 +1,29
1 cmake_minimum_required (VERSION 2.6)
2 project (LFR_FSW)
3
4 if(NOT CMAKE_BUILD_TYPE)
5 set(CMAKE_BUILD_TYPE "Release" CACHE STRING
6 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
7 endif(NOT CMAKE_BUILD_TYPE)
8
9 set(LFR_BP_SRC ${CMAKE_CURRENT_SOURCE_DIR}/LFR_basic-parameters/basic_parameters.c)
10
11 SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/sparc/")
12
13 include_directories("header"
14 "header/lfr_common_headers"
15 "header/processing"
16 "LFR_basic-parameters"
17 "src")
18
19 add_subdirectory(src)
20
21
22
23 option(test "Build all tests." ON) # Makes boolean 'test' available.
24
25
26 if (test)
27
28
29 endif()
@@ -0,0 +1,8
1 set(CMAKE_SYSTEM_NAME rtems)
2
3 set(CMAKE_C_COMPILER /opt/rtems-4.10/bin/sparc-rtems-gcc)
4 set(CMAKE_CXX_COMPILER /opt/rtems-4.10/bin/sparc-rtems-g++)
5 set(CMAKE_LINKER /opt/rtems-4.10/bin/sparc-rtems-g++)
6 SET(CMAKE_EXE_LINKER_FLAGS "-static")
7 set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
8 include_directories("/opt/rtems-4.10/sparc-rtems/leon3/lib/include")
@@ -0,0 +1,72
1 cmake_minimum_required (VERSION 2.6)
2 project (FSW)
3
4 include(sparc-rtems)
5
6
7 set(SOURCES wf_handler.c
8 tc_handler.c
9 fsw_misc.c
10 fsw_init.c
11 fsw_globals.c
12 fsw_spacewire.c
13 tc_load_dump_parameters.c
14 tm_lfr_tc_exe.c
15 tc_acceptance.c
16 processing/fsw_processing.c
17 processing/avf0_prc0.c
18 processing/avf1_prc1.c
19 processing/avf2_prc2.c
20 lfr_cpu_usage_report.c
21 ${LFR_BP_SRC}
22 )
23
24
25 option(verbose "Enable verbose LFR" ON)
26 option(boot_messages "Enable LFR boot messages" ON)
27 option(debug_messages "Enable LFR debug messages" ON)
28 option(cpu_usage_report "Enable LFR cpu usage report" OFF)
29 option(stack_report "Enable LFR stack report" OFF)
30 option(vhdl_dev "?" OFF)
31 option(lpp_dpu_destid "Set to debug at LPP" ON)
32 option(debug_watchdog "Enable debug watchdog" OFF)
33 option(debug_tch "?" OFF)
34
35
36 if (verbose)
37 add_definitions(-DPRINT_MESSAGES_ON_CONSOLE)
38 endif()
39 if (boot_messages)
40 add_definitions(-DBOOT_MESSAGES)
41 endif()
42 if (debug_messages)
43 add_definitions(-DDEBUG_MESSAGES)
44 endif()
45 if (cpu_usage_report)
46 add_definitions(-DPRINT_TASK_STATISTICS)
47 endif()
48 if (stack_report)
49 add_definitions(-DPRINT_STACK_REPORT)
50 endif()
51 if (vhdl_dev)
52 add_definitions(-DVHDL_DEV)
53 endif()
54 if (lpp_dpu_destid)
55 add_definitions(-DLPP_DPU_DESTID)
56 endif()
57 if (debug_watchdog)
58 add_definitions(-DDEBUG_WATCHDOG)
59 endif()
60 if (debug_tch)
61 add_definitions(-DDEBUG_TCH)
62 endif()
63
64 add_definitions(-DMSB_FIRST_TCH)
65
66 add_definitions(-DSWVERSION=-1-0)
67 add_definitions(-DSW_VERSION_N1=3)
68 add_definitions(-DSW_VERSION_N2=1)
69 add_definitions(-DSW_VERSION_N3=0)
70 add_definitions(-DSW_VERSION_N4=4)
71
72 add_executable(FSW ${SOURCES})
@@ -1,22 +1,23
1 1 syntax: glob
2 2 *.pdf
3 3 *~
4 4 *.o
5 5 *.gcno
6 6 *.gcda
7 7 *.html
8 8 *.zip
9 9 tests/*.err
10 10 doc
11 11 *.srec
12 12 FSW-qt/bin/fsw
13 13 timegen-qt/bin/timegen
14 14 src/LFR_basic-parameters
15 15 *.pro.user.*
16 16 FSW-qt/bin/spectralmatrix/asm_f0_test_20140403_case1.txt
17 17 FSW-qt/bin/spectralmatrix/asm_f0_test_20140403_case2.txt
18 18 FSW-qt/bin/spectralmatrix/asm_f0_test_paul_1.txt
19 19 run2/src
20 20 run2/trace
21 21 run3/src
22 22 run3/trace
23 *CMakeLists.txt.user
@@ -1,955 +1,955
1 1 /** This is the RTEMS initialization module.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * This module contains two very different information:
7 7 * - specific instructions to configure the compilation of the RTEMS executive
8 8 * - functions related to the fligth softwre initialization, especially the INIT RTEMS task
9 9 *
10 10 */
11 11
12 12 //*************************
13 13 // GPL reminder to be added
14 14 //*************************
15 15
16 16 #include <rtems.h>
17 17
18 18 /* configuration information */
19 19
20 20 #define CONFIGURE_INIT
21 21
22 22 #include <bsp.h> /* for device driver prototypes */
23 23
24 24 /* configuration information */
25 25
26 26 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
27 27 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
28 28
29 29 #define CONFIGURE_MAXIMUM_TASKS 21 // number of tasks concurrently active including INIT
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
33 33 #define CONFIGURE_INIT_TASK_PRIORITY 1 // instead of 100
34 34 #define CONFIGURE_INIT_TASK_MODE (RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT)
35 35 #define CONFIGURE_INIT_TASK_ATTRIBUTES (RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT)
36 36 #define CONFIGURE_MAXIMUM_DRIVERS 16
37 37 #define CONFIGURE_MAXIMUM_PERIODS 5 // [hous] [load] [avgv]
38 38 #define CONFIGURE_MAXIMUM_TIMERS 5 // [spiq] [link] [spacewire_reset_link]
39 39 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 5
40 40 #ifdef PRINT_STACK_REPORT
41 41 #define CONFIGURE_STACK_CHECKER_ENABLED
42 42 #endif
43 43
44 44 #include <rtems/confdefs.h>
45 45
46 46 /* If --drvmgr was enabled during the configuration of the RTEMS kernel */
47 47 #ifdef RTEMS_DRVMGR_STARTUP
48 48 #ifdef LEON3
49 49 /* Add Timer and UART Driver */
50 50
51 51 #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
52 52 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GPTIMER
53 53 #endif
54 54
55 55 #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
56 56 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_APBUART
57 57 #endif
58 58
59 59 #endif
60 60 #define CONFIGURE_DRIVER_AMBAPP_GAISLER_GRSPW /* GRSPW Driver */
61 61
62 62 #include <drvmgr/drvmgr_confdefs.h>
63 63 #endif
64 64
65 65 #include "fsw_init.h"
66 66 #include "fsw_config.c"
67 67 #include "GscMemoryLPP.hpp"
68 68
69 69 void initCache()
70 70 {
71 71 // ASI 2 contains a few control registers that have not been assigned as ancillary state registers.
72 72 // These should only be read and written using 32-bit LDA/STA instructions.
73 73 // All cache registers are accessed through load/store operations to the alternate address space (LDA/STA), using ASI = 2.
74 74 // The table below shows the register addresses:
75 75 // 0x00 Cache control register
76 76 // 0x04 Reserved
77 77 // 0x08 Instruction cache configuration register
78 78 // 0x0C Data cache configuration register
79 79
80 80 // Cache Control Register Leon3 / Leon3FT
81 81 // 31..30 29 28 27..24 23 22 21 20..19 18 17 16
82 82 // RFT PS TB DS FD FI FT ST IB
83 83 // 15 14 13..12 11..10 9..8 7..6 5 4 3..2 1..0
84 84 // IP DP ITE IDE DTE DDE DF IF DCS ICS
85 85
86 86 unsigned int cacheControlRegister;
87 87
88 88 CCR_resetCacheControlRegister();
89 89 ASR16_resetRegisterProtectionControlRegister();
90 90
91 91 cacheControlRegister = CCR_getValue();
92 92 PRINTF1("(0) CCR - Cache Control Register = %x\n", cacheControlRegister);
93 93 PRINTF1("(0) ASR16 = %x\n", *asr16Ptr);
94 94
95 95 CCR_enableInstructionCache(); // ICS bits
96 96 CCR_enableDataCache(); // DCS bits
97 97 CCR_enableInstructionBurstFetch(); // IB bit
98 98
99 99 faultTolerantScheme();
100 100
101 101 cacheControlRegister = CCR_getValue();
102 102 PRINTF1("(1) CCR - Cache Control Register = %x\n", cacheControlRegister);
103 103 PRINTF1("(1) ASR16 Register protection control register = %x\n", *asr16Ptr);
104 104
105 105 PRINTF("\n");
106 106 }
107 107
108 108 rtems_task Init( rtems_task_argument ignored )
109 109 {
110 110 /** This is the RTEMS INIT taks, it is the first task launched by the system.
111 111 *
112 112 * @param unused is the starting argument of the RTEMS task
113 113 *
114 114 * The INIT task create and run all other RTEMS tasks.
115 115 *
116 116 */
117 117
118 118 //***********
119 119 // INIT CACHE
120 120
121 121 unsigned char *vhdlVersion;
122 122
123 123 reset_lfr();
124 124
125 125 reset_local_time();
126 126
127 127 rtems_cpu_usage_reset();
128 128
129 129 rtems_status_code status;
130 130 rtems_status_code status_spw;
131 131 rtems_isr_entry old_isr_handler;
132 132
133 133 // UART settings
134 134 enable_apbuart_transmitter();
135 135 set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE);
136 136
137 137 DEBUG_PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n")
138 138
139 139
140 140 PRINTF("\n\n\n\n\n")
141 141
142 142 initCache();
143 143
144 144 PRINTF("*************************\n")
145 145 PRINTF("** LFR Flight Software **\n")
146 146 PRINTF1("** %d-", SW_VERSION_N1)
147 147 PRINTF1("%d-" , SW_VERSION_N2)
148 148 PRINTF1("%d-" , SW_VERSION_N3)
149 149 PRINTF1("%d **\n", SW_VERSION_N4)
150 150
151 151 vhdlVersion = (unsigned char *) (REGS_ADDR_VHDL_VERSION);
152 152 PRINTF("** VHDL **\n")
153 153 PRINTF1("** %d.", vhdlVersion[1])
154 154 PRINTF1("%d." , vhdlVersion[2])
155 155 PRINTF1("%d **\n", vhdlVersion[3])
156 156 PRINTF("*************************\n")
157 157 PRINTF("\n\n")
158 158
159 159 init_parameter_dump();
160 160 init_kcoefficients_dump();
161 161 init_local_mode_parameters();
162 162 init_housekeeping_parameters();
163 163 init_k_coefficients_prc0();
164 164 init_k_coefficients_prc1();
165 165 init_k_coefficients_prc2();
166 166 pa_bia_status_info = 0x00;
167 167 cp_rpw_sc_rw_f_flags = 0x00;
168 168 cp_rpw_sc_rw1_f1 = 0.0;
169 169 cp_rpw_sc_rw1_f2 = 0.0;
170 170 cp_rpw_sc_rw2_f1 = 0.0;
171 171 cp_rpw_sc_rw2_f2 = 0.0;
172 172 cp_rpw_sc_rw3_f1 = 0.0;
173 173 cp_rpw_sc_rw3_f2 = 0.0;
174 174 cp_rpw_sc_rw4_f1 = 0.0;
175 175 cp_rpw_sc_rw4_f2 = 0.0;
176 176 // initialize filtering parameters
177 177 filterPar.spare_sy_lfr_pas_filter_enabled = DEFAULT_SY_LFR_PAS_FILTER_ENABLED;
178 178 filterPar.sy_lfr_pas_filter_modulus = DEFAULT_SY_LFR_PAS_FILTER_MODULUS;
179 179 filterPar.sy_lfr_pas_filter_tbad = DEFAULT_SY_LFR_PAS_FILTER_TBAD;
180 180 filterPar.sy_lfr_pas_filter_offset = DEFAULT_SY_LFR_PAS_FILTER_OFFSET;
181 181 filterPar.sy_lfr_pas_filter_shift = DEFAULT_SY_LFR_PAS_FILTER_SHIFT;
182 182 filterPar.sy_lfr_sc_rw_delta_f = DEFAULT_SY_LFR_SC_RW_DELTA_F;
183 183 update_last_valid_transition_date( DEFAULT_LAST_VALID_TRANSITION_DATE );
184 184
185 185 // waveform picker initialization
186 186 WFP_init_rings();
187 187 LEON_Clear_interrupt( IRQ_SPARC_GPTIMER_WATCHDOG ); // initialize the waveform rings
188 188 WFP_reset_current_ring_nodes();
189 189 reset_waveform_picker_regs();
190 190
191 191 // spectral matrices initialization
192 192 SM_init_rings(); // initialize spectral matrices rings
193 193 SM_reset_current_ring_nodes();
194 194 reset_spectral_matrix_regs();
195 195
196 196 // configure calibration
197 197 configureCalibration( false ); // true means interleaved mode, false is for normal mode
198 198
199 199 updateLFRCurrentMode( LFR_MODE_STANDBY );
200 200
201 201 BOOT_PRINTF1("in INIT *** lfrCurrentMode is %d\n", lfrCurrentMode)
202 202
203 203 create_names(); // create all names
204 204
205 205 status = create_timecode_timer(); // create the timer used by timecode_irq_handler
206 206 if (status != RTEMS_SUCCESSFUL)
207 207 {
208 208 PRINTF1("in INIT *** ERR in create_timer_timecode, code %d", status)
209 209 }
210 210
211 211 status = create_message_queues(); // create message queues
212 212 if (status != RTEMS_SUCCESSFUL)
213 213 {
214 214 PRINTF1("in INIT *** ERR in create_message_queues, code %d", status)
215 215 }
216 216
217 217 status = create_all_tasks(); // create all tasks
218 218 if (status != RTEMS_SUCCESSFUL)
219 219 {
220 220 PRINTF1("in INIT *** ERR in create_all_tasks, code %d\n", status)
221 221 }
222 222
223 223 // **************************
224 224 // <SPACEWIRE INITIALIZATION>
225 225 status_spw = spacewire_open_link(); // (1) open the link
226 226 if ( status_spw != RTEMS_SUCCESSFUL )
227 227 {
228 228 PRINTF1("in INIT *** ERR spacewire_open_link code %d\n", status_spw )
229 229 }
230 230
231 231 if ( status_spw == RTEMS_SUCCESSFUL ) // (2) configure the link
232 232 {
233 233 status_spw = spacewire_configure_link( fdSPW );
234 234 if ( status_spw != RTEMS_SUCCESSFUL )
235 235 {
236 236 PRINTF1("in INIT *** ERR spacewire_configure_link code %d\n", status_spw )
237 237 }
238 238 }
239 239
240 240 if ( status_spw == RTEMS_SUCCESSFUL) // (3) start the link
241 241 {
242 242 status_spw = spacewire_start_link( fdSPW );
243 243 if ( status_spw != RTEMS_SUCCESSFUL )
244 244 {
245 245 PRINTF1("in INIT *** ERR spacewire_start_link code %d\n", status_spw )
246 246 }
247 247 }
248 248 // </SPACEWIRE INITIALIZATION>
249 249 // ***************************
250 250
251 251 status = start_all_tasks(); // start all tasks
252 252 if (status != RTEMS_SUCCESSFUL)
253 253 {
254 254 PRINTF1("in INIT *** ERR in start_all_tasks, code %d", status)
255 255 }
256 256
257 257 // start RECV and SEND *AFTER* SpaceWire Initialization, due to the timeout of the start call during the initialization
258 258 status = start_recv_send_tasks();
259 259 if ( status != RTEMS_SUCCESSFUL )
260 260 {
261 261 PRINTF1("in INIT *** ERR start_recv_send_tasks code %d\n", status )
262 262 }
263 263
264 264 // suspend science tasks, they will be restarted later depending on the mode
265 265 status = suspend_science_tasks(); // suspend science tasks (not done in stop_current_mode if current mode = STANDBY)
266 266 if (status != RTEMS_SUCCESSFUL)
267 267 {
268 268 PRINTF1("in INIT *** in suspend_science_tasks *** ERR code: %d\n", status)
269 269 }
270 270
271 271 // configure IRQ handling for the waveform picker unit
272 272 status = rtems_interrupt_catch( waveforms_isr,
273 273 IRQ_SPARC_WAVEFORM_PICKER,
274 274 &old_isr_handler) ;
275 275 // configure IRQ handling for the spectral matrices unit
276 276 status = rtems_interrupt_catch( spectral_matrices_isr,
277 277 IRQ_SPARC_SPECTRAL_MATRIX,
278 278 &old_isr_handler) ;
279 279
280 280 // if the spacewire link is not up then send an event to the SPIQ task for link recovery
281 281 if ( status_spw != RTEMS_SUCCESSFUL )
282 282 {
283 283 status = rtems_event_send( Task_id[TASKID_SPIQ], SPW_LINKERR_EVENT );
284 284 if ( status != RTEMS_SUCCESSFUL ) {
285 285 PRINTF1("in INIT *** ERR rtems_event_send to SPIQ code %d\n", status )
286 286 }
287 287 }
288 288
289 289 BOOT_PRINTF("delete INIT\n")
290 290
291 291 set_hk_lfr_sc_potential_flag( true );
292 292
293 293 // start the timer to detect a missing spacewire timecode
294 294 // the timeout is larger because the spw IP needs to receive several valid timecodes before generating a tickout
295 295 // if a tickout is generated, the timer is restarted
296 296 status = rtems_timer_fire_after( timecode_timer_id, TIMECODE_TIMER_TIMEOUT_INIT, timecode_timer_routine, NULL );
297 297
298 298 grspw_timecode_callback = &timecode_irq_handler;
299 299
300 300 status = rtems_task_delete(RTEMS_SELF);
301 301
302 302 }
303 303
304 304 void init_local_mode_parameters( void )
305 305 {
306 306 /** This function initialize the param_local global variable with default values.
307 307 *
308 308 */
309 309
310 310 unsigned int i;
311 311
312 312 // LOCAL PARAMETERS
313 313
314 314 BOOT_PRINTF1("local_sbm1_nb_cwf_max %d \n", param_local.local_sbm1_nb_cwf_max)
315 315 BOOT_PRINTF1("local_sbm2_nb_cwf_max %d \n", param_local.local_sbm2_nb_cwf_max)
316 BOOT_PRINTF1("nb_interrupt_f0_MAX = %d\n", param_local.local_nb_interrupt_f0_MAX)
316 //BOOT_PRINTF1("nb_interrupt_f0_MAX = %d\n", param_local.local_nb_interrupt_f0_MAX)
317 317
318 318 // init sequence counters
319 319
320 320 for(i = 0; i<SEQ_CNT_NB_DEST_ID; i++)
321 321 {
322 322 sequenceCounters_TC_EXE[i] = 0x00;
323 323 sequenceCounters_TM_DUMP[i] = 0x00;
324 324 }
325 325 sequenceCounters_SCIENCE_NORMAL_BURST = 0x00;
326 326 sequenceCounters_SCIENCE_SBM1_SBM2 = 0x00;
327 327 sequenceCounterHK = TM_PACKET_SEQ_CTRL_STANDALONE << 8;
328 328 }
329 329
330 330 void reset_local_time( void )
331 331 {
332 332 time_management_regs->ctrl = time_management_regs->ctrl | 0x02; // [0010] software reset, coarse time = 0x80000000
333 333 }
334 334
335 335 void create_names( void ) // create all names for tasks and queues
336 336 {
337 337 /** This function creates all RTEMS names used in the software for tasks and queues.
338 338 *
339 339 * @return RTEMS directive status codes:
340 340 * - RTEMS_SUCCESSFUL - successful completion
341 341 *
342 342 */
343 343
344 344 // task names
345 345 Task_name[TASKID_AVGV] = rtems_build_name( 'A', 'V', 'G', 'V' );
346 346 Task_name[TASKID_RECV] = rtems_build_name( 'R', 'E', 'C', 'V' );
347 347 Task_name[TASKID_ACTN] = rtems_build_name( 'A', 'C', 'T', 'N' );
348 348 Task_name[TASKID_SPIQ] = rtems_build_name( 'S', 'P', 'I', 'Q' );
349 349 Task_name[TASKID_LOAD] = rtems_build_name( 'L', 'O', 'A', 'D' );
350 350 Task_name[TASKID_AVF0] = rtems_build_name( 'A', 'V', 'F', '0' );
351 351 Task_name[TASKID_SWBD] = rtems_build_name( 'S', 'W', 'B', 'D' );
352 352 Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' );
353 353 Task_name[TASKID_DUMB] = rtems_build_name( 'D', 'U', 'M', 'B' );
354 354 Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' );
355 355 Task_name[TASKID_PRC0] = rtems_build_name( 'P', 'R', 'C', '0' );
356 356 Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' );
357 357 Task_name[TASKID_CWF2] = rtems_build_name( 'C', 'W', 'F', '2' );
358 358 Task_name[TASKID_CWF1] = rtems_build_name( 'C', 'W', 'F', '1' );
359 359 Task_name[TASKID_SEND] = rtems_build_name( 'S', 'E', 'N', 'D' );
360 360 Task_name[TASKID_LINK] = rtems_build_name( 'L', 'I', 'N', 'K' );
361 361 Task_name[TASKID_AVF1] = rtems_build_name( 'A', 'V', 'F', '1' );
362 362 Task_name[TASKID_PRC1] = rtems_build_name( 'P', 'R', 'C', '1' );
363 363 Task_name[TASKID_AVF2] = rtems_build_name( 'A', 'V', 'F', '2' );
364 364 Task_name[TASKID_PRC2] = rtems_build_name( 'P', 'R', 'C', '2' );
365 365
366 366 // rate monotonic period names
367 367 name_hk_rate_monotonic = rtems_build_name( 'H', 'O', 'U', 'S' );
368 368 name_avgv_rate_monotonic = rtems_build_name( 'A', 'V', 'G', 'V' );
369 369
370 370 misc_name[QUEUE_RECV] = rtems_build_name( 'Q', '_', 'R', 'V' );
371 371 misc_name[QUEUE_SEND] = rtems_build_name( 'Q', '_', 'S', 'D' );
372 372 misc_name[QUEUE_PRC0] = rtems_build_name( 'Q', '_', 'P', '0' );
373 373 misc_name[QUEUE_PRC1] = rtems_build_name( 'Q', '_', 'P', '1' );
374 374 misc_name[QUEUE_PRC2] = rtems_build_name( 'Q', '_', 'P', '2' );
375 375
376 376 timecode_timer_name = rtems_build_name( 'S', 'P', 'T', 'C' );
377 377 }
378 378
379 379 int create_all_tasks( void ) // create all tasks which run in the software
380 380 {
381 381 /** This function creates all RTEMS tasks used in the software.
382 382 *
383 383 * @return RTEMS directive status codes:
384 384 * - RTEMS_SUCCESSFUL - task created successfully
385 385 * - RTEMS_INVALID_ADDRESS - id is NULL
386 386 * - RTEMS_INVALID_NAME - invalid task name
387 387 * - RTEMS_INVALID_PRIORITY - invalid task priority
388 388 * - RTEMS_MP_NOT_CONFIGURED - multiprocessing not configured
389 389 * - RTEMS_TOO_MANY - too many tasks created
390 390 * - RTEMS_UNSATISFIED - not enough memory for stack/FP context
391 391 * - RTEMS_TOO_MANY - too many global objects
392 392 *
393 393 */
394 394
395 395 rtems_status_code status;
396 396
397 397 //**********
398 398 // SPACEWIRE
399 399 // RECV
400 400 status = rtems_task_create(
401 401 Task_name[TASKID_RECV], TASK_PRIORITY_RECV, RTEMS_MINIMUM_STACK_SIZE,
402 402 RTEMS_DEFAULT_MODES,
403 403 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_RECV]
404 404 );
405 405 if (status == RTEMS_SUCCESSFUL) // SEND
406 406 {
407 407 status = rtems_task_create(
408 408 Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE * 2,
409 409 RTEMS_DEFAULT_MODES,
410 410 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_SEND]
411 411 );
412 412 }
413 413 if (status == RTEMS_SUCCESSFUL) // LINK
414 414 {
415 415 status = rtems_task_create(
416 416 Task_name[TASKID_LINK], TASK_PRIORITY_LINK, RTEMS_MINIMUM_STACK_SIZE,
417 417 RTEMS_DEFAULT_MODES,
418 418 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_LINK]
419 419 );
420 420 }
421 421 if (status == RTEMS_SUCCESSFUL) // ACTN
422 422 {
423 423 status = rtems_task_create(
424 424 Task_name[TASKID_ACTN], TASK_PRIORITY_ACTN, RTEMS_MINIMUM_STACK_SIZE,
425 425 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
426 426 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_ACTN]
427 427 );
428 428 }
429 429 if (status == RTEMS_SUCCESSFUL) // SPIQ
430 430 {
431 431 status = rtems_task_create(
432 432 Task_name[TASKID_SPIQ], TASK_PRIORITY_SPIQ, RTEMS_MINIMUM_STACK_SIZE,
433 433 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
434 434 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SPIQ]
435 435 );
436 436 }
437 437
438 438 //******************
439 439 // SPECTRAL MATRICES
440 440 if (status == RTEMS_SUCCESSFUL) // AVF0
441 441 {
442 442 status = rtems_task_create(
443 443 Task_name[TASKID_AVF0], TASK_PRIORITY_AVF0, RTEMS_MINIMUM_STACK_SIZE,
444 444 RTEMS_DEFAULT_MODES,
445 445 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0]
446 446 );
447 447 }
448 448 if (status == RTEMS_SUCCESSFUL) // PRC0
449 449 {
450 450 status = rtems_task_create(
451 451 Task_name[TASKID_PRC0], TASK_PRIORITY_PRC0, RTEMS_MINIMUM_STACK_SIZE * 2,
452 452 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
453 453 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_PRC0]
454 454 );
455 455 }
456 456 if (status == RTEMS_SUCCESSFUL) // AVF1
457 457 {
458 458 status = rtems_task_create(
459 459 Task_name[TASKID_AVF1], TASK_PRIORITY_AVF1, RTEMS_MINIMUM_STACK_SIZE,
460 460 RTEMS_DEFAULT_MODES,
461 461 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF1]
462 462 );
463 463 }
464 464 if (status == RTEMS_SUCCESSFUL) // PRC1
465 465 {
466 466 status = rtems_task_create(
467 467 Task_name[TASKID_PRC1], TASK_PRIORITY_PRC1, RTEMS_MINIMUM_STACK_SIZE * 2,
468 468 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
469 469 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_PRC1]
470 470 );
471 471 }
472 472 if (status == RTEMS_SUCCESSFUL) // AVF2
473 473 {
474 474 status = rtems_task_create(
475 475 Task_name[TASKID_AVF2], TASK_PRIORITY_AVF2, RTEMS_MINIMUM_STACK_SIZE,
476 476 RTEMS_DEFAULT_MODES,
477 477 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF2]
478 478 );
479 479 }
480 480 if (status == RTEMS_SUCCESSFUL) // PRC2
481 481 {
482 482 status = rtems_task_create(
483 483 Task_name[TASKID_PRC2], TASK_PRIORITY_PRC2, RTEMS_MINIMUM_STACK_SIZE * 2,
484 484 RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT,
485 485 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_PRC2]
486 486 );
487 487 }
488 488
489 489 //****************
490 490 // WAVEFORM PICKER
491 491 if (status == RTEMS_SUCCESSFUL) // WFRM
492 492 {
493 493 status = rtems_task_create(
494 494 Task_name[TASKID_WFRM], TASK_PRIORITY_WFRM, RTEMS_MINIMUM_STACK_SIZE,
495 495 RTEMS_DEFAULT_MODES,
496 496 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_WFRM]
497 497 );
498 498 }
499 499 if (status == RTEMS_SUCCESSFUL) // CWF3
500 500 {
501 501 status = rtems_task_create(
502 502 Task_name[TASKID_CWF3], TASK_PRIORITY_CWF3, RTEMS_MINIMUM_STACK_SIZE,
503 503 RTEMS_DEFAULT_MODES,
504 504 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_CWF3]
505 505 );
506 506 }
507 507 if (status == RTEMS_SUCCESSFUL) // CWF2
508 508 {
509 509 status = rtems_task_create(
510 510 Task_name[TASKID_CWF2], TASK_PRIORITY_CWF2, RTEMS_MINIMUM_STACK_SIZE,
511 511 RTEMS_DEFAULT_MODES,
512 512 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_CWF2]
513 513 );
514 514 }
515 515 if (status == RTEMS_SUCCESSFUL) // CWF1
516 516 {
517 517 status = rtems_task_create(
518 518 Task_name[TASKID_CWF1], TASK_PRIORITY_CWF1, RTEMS_MINIMUM_STACK_SIZE,
519 519 RTEMS_DEFAULT_MODES,
520 520 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_CWF1]
521 521 );
522 522 }
523 523 if (status == RTEMS_SUCCESSFUL) // SWBD
524 524 {
525 525 status = rtems_task_create(
526 526 Task_name[TASKID_SWBD], TASK_PRIORITY_SWBD, RTEMS_MINIMUM_STACK_SIZE,
527 527 RTEMS_DEFAULT_MODES,
528 528 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_SWBD]
529 529 );
530 530 }
531 531
532 532 //*****
533 533 // MISC
534 534 if (status == RTEMS_SUCCESSFUL) // LOAD
535 535 {
536 536 status = rtems_task_create(
537 537 Task_name[TASKID_LOAD], TASK_PRIORITY_LOAD, RTEMS_MINIMUM_STACK_SIZE,
538 538 RTEMS_DEFAULT_MODES,
539 539 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_LOAD]
540 540 );
541 541 }
542 542 if (status == RTEMS_SUCCESSFUL) // DUMB
543 543 {
544 544 status = rtems_task_create(
545 545 Task_name[TASKID_DUMB], TASK_PRIORITY_DUMB, RTEMS_MINIMUM_STACK_SIZE,
546 546 RTEMS_DEFAULT_MODES,
547 547 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
548 548 );
549 549 }
550 550 if (status == RTEMS_SUCCESSFUL) // HOUS
551 551 {
552 552 status = rtems_task_create(
553 553 Task_name[TASKID_HOUS], TASK_PRIORITY_HOUS, RTEMS_MINIMUM_STACK_SIZE,
554 554 RTEMS_DEFAULT_MODES,
555 555 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_HOUS]
556 556 );
557 557 }
558 558 if (status == RTEMS_SUCCESSFUL) // AVGV
559 559 {
560 560 status = rtems_task_create(
561 561 Task_name[TASKID_AVGV], TASK_PRIORITY_AVGV, RTEMS_MINIMUM_STACK_SIZE,
562 562 RTEMS_DEFAULT_MODES,
563 563 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVGV]
564 564 );
565 565 }
566 566
567 567 return status;
568 568 }
569 569
570 570 int start_recv_send_tasks( void )
571 571 {
572 572 rtems_status_code status;
573 573
574 574 status = rtems_task_start( Task_id[TASKID_RECV], recv_task, 1 );
575 575 if (status!=RTEMS_SUCCESSFUL) {
576 576 BOOT_PRINTF("in INIT *** Error starting TASK_RECV\n")
577 577 }
578 578
579 579 if (status == RTEMS_SUCCESSFUL) // SEND
580 580 {
581 581 status = rtems_task_start( Task_id[TASKID_SEND], send_task, 1 );
582 582 if (status!=RTEMS_SUCCESSFUL) {
583 583 BOOT_PRINTF("in INIT *** Error starting TASK_SEND\n")
584 584 }
585 585 }
586 586
587 587 return status;
588 588 }
589 589
590 590 int start_all_tasks( void ) // start all tasks except SEND RECV and HOUS
591 591 {
592 592 /** This function starts all RTEMS tasks used in the software.
593 593 *
594 594 * @return RTEMS directive status codes:
595 595 * - RTEMS_SUCCESSFUL - ask started successfully
596 596 * - RTEMS_INVALID_ADDRESS - invalid task entry point
597 597 * - RTEMS_INVALID_ID - invalid task id
598 598 * - RTEMS_INCORRECT_STATE - task not in the dormant state
599 599 * - RTEMS_ILLEGAL_ON_REMOTE_OBJECT - cannot start remote task
600 600 *
601 601 */
602 602 // starts all the tasks fot eh flight software
603 603
604 604 rtems_status_code status;
605 605
606 606 //**********
607 607 // SPACEWIRE
608 608 status = rtems_task_start( Task_id[TASKID_SPIQ], spiq_task, 1 );
609 609 if (status!=RTEMS_SUCCESSFUL) {
610 610 BOOT_PRINTF("in INIT *** Error starting TASK_SPIQ\n")
611 611 }
612 612
613 613 if (status == RTEMS_SUCCESSFUL) // LINK
614 614 {
615 615 status = rtems_task_start( Task_id[TASKID_LINK], link_task, 1 );
616 616 if (status!=RTEMS_SUCCESSFUL) {
617 617 BOOT_PRINTF("in INIT *** Error starting TASK_LINK\n")
618 618 }
619 619 }
620 620
621 621 if (status == RTEMS_SUCCESSFUL) // ACTN
622 622 {
623 623 status = rtems_task_start( Task_id[TASKID_ACTN], actn_task, 1 );
624 624 if (status!=RTEMS_SUCCESSFUL) {
625 625 BOOT_PRINTF("in INIT *** Error starting TASK_ACTN\n")
626 626 }
627 627 }
628 628
629 629 //******************
630 630 // SPECTRAL MATRICES
631 631 if (status == RTEMS_SUCCESSFUL) // AVF0
632 632 {
633 633 status = rtems_task_start( Task_id[TASKID_AVF0], avf0_task, LFR_MODE_STANDBY );
634 634 if (status!=RTEMS_SUCCESSFUL) {
635 635 BOOT_PRINTF("in INIT *** Error starting TASK_AVF0\n")
636 636 }
637 637 }
638 638 if (status == RTEMS_SUCCESSFUL) // PRC0
639 639 {
640 640 status = rtems_task_start( Task_id[TASKID_PRC0], prc0_task, LFR_MODE_STANDBY );
641 641 if (status!=RTEMS_SUCCESSFUL) {
642 642 BOOT_PRINTF("in INIT *** Error starting TASK_PRC0\n")
643 643 }
644 644 }
645 645 if (status == RTEMS_SUCCESSFUL) // AVF1
646 646 {
647 647 status = rtems_task_start( Task_id[TASKID_AVF1], avf1_task, LFR_MODE_STANDBY );
648 648 if (status!=RTEMS_SUCCESSFUL) {
649 649 BOOT_PRINTF("in INIT *** Error starting TASK_AVF1\n")
650 650 }
651 651 }
652 652 if (status == RTEMS_SUCCESSFUL) // PRC1
653 653 {
654 654 status = rtems_task_start( Task_id[TASKID_PRC1], prc1_task, LFR_MODE_STANDBY );
655 655 if (status!=RTEMS_SUCCESSFUL) {
656 656 BOOT_PRINTF("in INIT *** Error starting TASK_PRC1\n")
657 657 }
658 658 }
659 659 if (status == RTEMS_SUCCESSFUL) // AVF2
660 660 {
661 661 status = rtems_task_start( Task_id[TASKID_AVF2], avf2_task, 1 );
662 662 if (status!=RTEMS_SUCCESSFUL) {
663 663 BOOT_PRINTF("in INIT *** Error starting TASK_AVF2\n")
664 664 }
665 665 }
666 666 if (status == RTEMS_SUCCESSFUL) // PRC2
667 667 {
668 668 status = rtems_task_start( Task_id[TASKID_PRC2], prc2_task, 1 );
669 669 if (status!=RTEMS_SUCCESSFUL) {
670 670 BOOT_PRINTF("in INIT *** Error starting TASK_PRC2\n")
671 671 }
672 672 }
673 673
674 674 //****************
675 675 // WAVEFORM PICKER
676 676 if (status == RTEMS_SUCCESSFUL) // WFRM
677 677 {
678 678 status = rtems_task_start( Task_id[TASKID_WFRM], wfrm_task, 1 );
679 679 if (status!=RTEMS_SUCCESSFUL) {
680 680 BOOT_PRINTF("in INIT *** Error starting TASK_WFRM\n")
681 681 }
682 682 }
683 683 if (status == RTEMS_SUCCESSFUL) // CWF3
684 684 {
685 685 status = rtems_task_start( Task_id[TASKID_CWF3], cwf3_task, 1 );
686 686 if (status!=RTEMS_SUCCESSFUL) {
687 687 BOOT_PRINTF("in INIT *** Error starting TASK_CWF3\n")
688 688 }
689 689 }
690 690 if (status == RTEMS_SUCCESSFUL) // CWF2
691 691 {
692 692 status = rtems_task_start( Task_id[TASKID_CWF2], cwf2_task, 1 );
693 693 if (status!=RTEMS_SUCCESSFUL) {
694 694 BOOT_PRINTF("in INIT *** Error starting TASK_CWF2\n")
695 695 }
696 696 }
697 697 if (status == RTEMS_SUCCESSFUL) // CWF1
698 698 {
699 699 status = rtems_task_start( Task_id[TASKID_CWF1], cwf1_task, 1 );
700 700 if (status!=RTEMS_SUCCESSFUL) {
701 701 BOOT_PRINTF("in INIT *** Error starting TASK_CWF1\n")
702 702 }
703 703 }
704 704 if (status == RTEMS_SUCCESSFUL) // SWBD
705 705 {
706 706 status = rtems_task_start( Task_id[TASKID_SWBD], swbd_task, 1 );
707 707 if (status!=RTEMS_SUCCESSFUL) {
708 708 BOOT_PRINTF("in INIT *** Error starting TASK_SWBD\n")
709 709 }
710 710 }
711 711
712 712 //*****
713 713 // MISC
714 714 if (status == RTEMS_SUCCESSFUL) // HOUS
715 715 {
716 716 status = rtems_task_start( Task_id[TASKID_HOUS], hous_task, 1 );
717 717 if (status!=RTEMS_SUCCESSFUL) {
718 718 BOOT_PRINTF("in INIT *** Error starting TASK_HOUS\n")
719 719 }
720 720 }
721 721 if (status == RTEMS_SUCCESSFUL) // AVGV
722 722 {
723 723 status = rtems_task_start( Task_id[TASKID_AVGV], avgv_task, 1 );
724 724 if (status!=RTEMS_SUCCESSFUL) {
725 725 BOOT_PRINTF("in INIT *** Error starting TASK_AVGV\n")
726 726 }
727 727 }
728 728 if (status == RTEMS_SUCCESSFUL) // DUMB
729 729 {
730 730 status = rtems_task_start( Task_id[TASKID_DUMB], dumb_task, 1 );
731 731 if (status!=RTEMS_SUCCESSFUL) {
732 732 BOOT_PRINTF("in INIT *** Error starting TASK_DUMB\n")
733 733 }
734 734 }
735 735 if (status == RTEMS_SUCCESSFUL) // LOAD
736 736 {
737 737 status = rtems_task_start( Task_id[TASKID_LOAD], load_task, 1 );
738 738 if (status!=RTEMS_SUCCESSFUL) {
739 739 BOOT_PRINTF("in INIT *** Error starting TASK_LOAD\n")
740 740 }
741 741 }
742 742
743 743 return status;
744 744 }
745 745
746 746 rtems_status_code create_message_queues( void ) // create the two message queues used in the software
747 747 {
748 748 rtems_status_code status_recv;
749 749 rtems_status_code status_send;
750 750 rtems_status_code status_q_p0;
751 751 rtems_status_code status_q_p1;
752 752 rtems_status_code status_q_p2;
753 753 rtems_status_code ret;
754 754 rtems_id queue_id;
755 755
756 756 //****************************************
757 757 // create the queue for handling valid TCs
758 758 status_recv = rtems_message_queue_create( misc_name[QUEUE_RECV],
759 759 MSG_QUEUE_COUNT_RECV, CCSDS_TC_PKT_MAX_SIZE,
760 760 RTEMS_FIFO | RTEMS_LOCAL, &queue_id );
761 761 if ( status_recv != RTEMS_SUCCESSFUL ) {
762 762 PRINTF1("in create_message_queues *** ERR creating QUEU queue, %d\n", status_recv)
763 763 }
764 764
765 765 //************************************************
766 766 // create the queue for handling TM packet sending
767 767 status_send = rtems_message_queue_create( misc_name[QUEUE_SEND],
768 768 MSG_QUEUE_COUNT_SEND, MSG_QUEUE_SIZE_SEND,
769 769 RTEMS_FIFO | RTEMS_LOCAL, &queue_id );
770 770 if ( status_send != RTEMS_SUCCESSFUL ) {
771 771 PRINTF1("in create_message_queues *** ERR creating PKTS queue, %d\n", status_send)
772 772 }
773 773
774 774 //*****************************************************************************
775 775 // create the queue for handling averaged spectral matrices for processing @ f0
776 776 status_q_p0 = rtems_message_queue_create( misc_name[QUEUE_PRC0],
777 777 MSG_QUEUE_COUNT_PRC0, MSG_QUEUE_SIZE_PRC0,
778 778 RTEMS_FIFO | RTEMS_LOCAL, &queue_id );
779 779 if ( status_q_p0 != RTEMS_SUCCESSFUL ) {
780 780 PRINTF1("in create_message_queues *** ERR creating Q_P0 queue, %d\n", status_q_p0)
781 781 }
782 782
783 783 //*****************************************************************************
784 784 // create the queue for handling averaged spectral matrices for processing @ f1
785 785 status_q_p1 = rtems_message_queue_create( misc_name[QUEUE_PRC1],
786 786 MSG_QUEUE_COUNT_PRC1, MSG_QUEUE_SIZE_PRC1,
787 787 RTEMS_FIFO | RTEMS_LOCAL, &queue_id );
788 788 if ( status_q_p1 != RTEMS_SUCCESSFUL ) {
789 789 PRINTF1("in create_message_queues *** ERR creating Q_P1 queue, %d\n", status_q_p1)
790 790 }
791 791
792 792 //*****************************************************************************
793 793 // create the queue for handling averaged spectral matrices for processing @ f2
794 794 status_q_p2 = rtems_message_queue_create( misc_name[QUEUE_PRC2],
795 795 MSG_QUEUE_COUNT_PRC2, MSG_QUEUE_SIZE_PRC2,
796