##// END OF EJS Templates

Compare Commits r371:88d90c878c97...r374:79e8ac429728

Target:

Source:

Compare was calculated based on this common ancestor commit: 18e20227b986
Time Author Commit Description
r371:88d90c878c97
Added automatic map file production on build.
r372:fc82b08705ba
Added scrubbing Task, to increase scrubbing frequency and avoid entering idle task.
r373:a5fd85da05a7
Now uses FPU in scrubbing task to increase power consumption.
r374:79e8ac429728
Implemented Calibrations Task This task will ensure the calibrations signal frequency sweep by dividing by 2 the sampling frequency between each snapshot.
@@ -1,4 +1,4
1 header/lfr_common_headers = https://hephaistos.lpp.polytechnique.fr/rhodecode/HG_REPOSITORIES/LPP/INSTRUMENTATION/SOLO_LFR/lfr_common_headers
1 header/lfr_common_headers = https://hephaistos.lpp.polytechnique.fr/rhodecode/HG_REPOSITORIES/LPP/INSTRUMENTATION/USERS/JEANDET/lfr_common_headers
2
2
3 LFR_basic-parameters = https://hephaistos.lpp.polytechnique.fr/rhodecode/HG_REPOSITORIES/LPP/INSTRUMENTATION/USERS/CHUST/LFR_basic-parameters
3 LFR_basic-parameters = https://hephaistos.lpp.polytechnique.fr/rhodecode/HG_REPOSITORIES/LPP/INSTRUMENTATION/USERS/CHUST/LFR_basic-parameters
4
4
@@ -1,2 +1,2
1 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters
1 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters
2 e904b329ff977514bf36af92617afefd22fd06ab header/lfr_common_headers
2 1b9238c8848953d545d6ff9c9b8b15d19a597fb6 header/lfr_common_headers
@@ -136,6 +136,7 rtems_task load_task( rtems_task_argumen
136 rtems_task hous_task( rtems_task_argument argument );
136 rtems_task hous_task( rtems_task_argument argument );
137 rtems_task avgv_task( rtems_task_argument argument );
137 rtems_task avgv_task( rtems_task_argument argument );
138 rtems_task dumb_task( rtems_task_argument unused );
138 rtems_task dumb_task( rtems_task_argument unused );
139 rtems_task scrubbing_task( rtems_task_argument unused );
139
140
140 void init_housekeeping_parameters( void );
141 void init_housekeeping_parameters( void );
141 void increment_seq_counter(unsigned short *packetSequenceControl);
142 void increment_seq_counter(unsigned short *packetSequenceControl);
@@ -37,6 +37,8
37 #define CAL_NB_PTS 256
37 #define CAL_NB_PTS 256
38 #define CAL_DATA_MASK 0xfff
38 #define CAL_DATA_MASK 0xfff
39 #define CAL_F_DIVISOR 38 // 25 MHz => 160 256 (39 - 1)
39 #define CAL_F_DIVISOR 38 // 25 MHz => 160 256 (39 - 1)
40 #define CAL_F_DIVISOR_MIN 38
41 #define CAL_F_DIVISOR_MAX (38*2*2*2*2)
40 // INTERLEAVED MODE
42 // INTERLEAVED MODE
41 #define CAL_FS_INTER 240384.615
43 #define CAL_FS_INTER 240384.615
42 #define CAL_NB_PTS_INTER 384
44 #define CAL_NB_PTS_INTER 384
@@ -13,7 +13,7 else()
13 set(CMAKE_C_FLAGS_RELEASE "-O3")
13 set(CMAKE_C_FLAGS_RELEASE "-O3")
14 endif()
14 endif()
15
15
16 set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
16 set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <FLAGS> -Xlinker -Map=<TARGET>.map <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
17
17
18 include_directories("${rtems_dir}/sparc-rtems/leon3/lib/include")
18 include_directories("${rtems_dir}/sparc-rtems/leon3/lib/include")
19
19
@@ -15,6 +15,7
15
15
16 #include <rtems.h>
16 #include <rtems.h>
17
17
18
18 /* configuration information */
19 /* configuration information */
19
20
20 #define CONFIGURE_INIT
21 #define CONFIGURE_INIT
@@ -26,7 +27,7
26 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
27 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
27 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
28 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
28
29
29 #define CONFIGURE_MAXIMUM_TASKS 21 // number of tasks concurrently active including INIT
30 #define CONFIGURE_MAXIMUM_TASKS 23 // number of tasks concurrently active including INIT
30 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
31 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
31 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
32 #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE)
32 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
33 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
@@ -376,6 +377,8 void create_names( void ) // create all
376 Task_name[TASKID_PRC1] = rtems_build_name( 'P', 'R', 'C', '1' );
377 Task_name[TASKID_PRC1] = rtems_build_name( 'P', 'R', 'C', '1' );
377 Task_name[TASKID_AVF2] = rtems_build_name( 'A', 'V', 'F', '2' );
378 Task_name[TASKID_AVF2] = rtems_build_name( 'A', 'V', 'F', '2' );
378 Task_name[TASKID_PRC2] = rtems_build_name( 'P', 'R', 'C', '2' );
379 Task_name[TASKID_PRC2] = rtems_build_name( 'P', 'R', 'C', '2' );
380 Task_name[TASKID_SCRB] = rtems_build_name( 'S', 'C', 'R', 'B' );
381 Task_name[TASKID_CALI] = rtems_build_name( 'C', 'A', 'L', 'I' );
379
382
380 // rate monotonic period names
383 // rate monotonic period names
381 name_hk_rate_monotonic = rtems_build_name( 'H', 'O', 'U', 'S' );
384 name_hk_rate_monotonic = rtems_build_name( 'H', 'O', 'U', 'S' );
@@ -561,6 +564,14 int create_all_tasks( void ) // create a
561 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
564 RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_DUMB]
562 );
565 );
563 }
566 }
567 if (status == RTEMS_SUCCESSFUL) // SCRUBBING TASK
568 {
569 status = rtems_task_create(
570 Task_name[TASKID_SCRB], TASK_PRIORITY_SCRB, RTEMS_MINIMUM_STACK_SIZE,
571 RTEMS_DEFAULT_MODES,
572 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_SCRB]
573 );
574 }
564 if (status == RTEMS_SUCCESSFUL) // HOUS
575 if (status == RTEMS_SUCCESSFUL) // HOUS
565 {
576 {
566 status = rtems_task_create(
577 status = rtems_task_create(
@@ -577,6 +588,14 int create_all_tasks( void ) // create a
577 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVGV]
588 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVGV]
578 );
589 );
579 }
590 }
591 if (status == RTEMS_SUCCESSFUL) // CALI
592 {
593 status = rtems_task_create(
594 Task_name[TASKID_CALI], TASK_PRIORITY_CALI, RTEMS_MINIMUM_STACK_SIZE,
595 RTEMS_DEFAULT_MODES,
596 RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_CALI]
597 );
598 }
580
599
581 return status;
600 return status;
582 }
601 }
@@ -746,6 +765,13 int start_all_tasks( void ) // start all
746 BOOT_PRINTF("in INIT *** Error starting TASK_DUMB\n")
765 BOOT_PRINTF("in INIT *** Error starting TASK_DUMB\n")
747 }
766 }
748 }
767 }
768 if (status == RTEMS_SUCCESSFUL) // SCRUBBING
769 {
770 status = rtems_task_start( Task_id[TASKID_SCRB], scrubbing_task, 1 );
771 if (status!=RTEMS_SUCCESSFUL) {
772 BOOT_PRINTF("in INIT *** Error starting TASK_DUMB\n")
773 }
774 }
749 if (status == RTEMS_SUCCESSFUL) // LOAD
775 if (status == RTEMS_SUCCESSFUL) // LOAD
750 {
776 {
751 status = rtems_task_start( Task_id[TASKID_LOAD], load_task, 1 );
777 status = rtems_task_start( Task_id[TASKID_LOAD], load_task, 1 );
@@ -753,6 +779,13 int start_all_tasks( void ) // start all
753 BOOT_PRINTF("in INIT *** Error starting TASK_LOAD\n")
779 BOOT_PRINTF("in INIT *** Error starting TASK_LOAD\n")
754 }
780 }
755 }
781 }
782 if (status == RTEMS_SUCCESSFUL) // CALI
783 {
784 status = rtems_task_start( Task_id[TASKID_CALI], load_task, 1 );
785 if (status!=RTEMS_SUCCESSFUL) {
786 BOOT_PRINTF("in INIT *** Error starting TASK_LOAD\n")
787 }
788 }
756
789
757 return status;
790 return status;
758 }
791 }
@@ -521,6 +521,65 rtems_task dumb_task( rtems_task_argumen
521 }
521 }
522 }
522 }
523
523
524 rtems_task scrubbing_task( rtems_task_argument unused )
525 {
526 /** This RTEMS taks is used to avoid entering IDLE task and also scrub memory to increase scubbing frequency.
527 *
528 * @param unused is the starting argument of the RTEMS task
529 *
530 * The scrubbing reads continuously memory when no other tasks are ready.
531 *
532 */
533
534 BOOT_PRINTF("in SCRUBBING *** \n");
535 volatile int i=0;
536 volatile float valuef = 1.;
537 volatile uint32_t* RAM=(uint32_t*)0x40000000;
538 volatile uint32_t value;
539 while(1){
540 i=(i+1)%(1024*1024);
541 valuef += 10.f*(float)RAM[i];
542 }
543 }
544
545 rtems_task calibration_sweep_task( rtems_task_argument unused )
546 {
547 /** This RTEMS taks is used to change calibration signal smapling frequency between snapshots.
548 *
549 * @param unused is the starting argument of the RTEMS task
550 *
551 * If calibration is enabled, this task will divide by two the calibration signal smapling frequency between snapshots.
552 * When minimum sampling frequency is reach it will jump to maximum sampling frequency to loop indefinitely.
553 *
554 */
555 rtems_event_set event_out;
556 BOOT_PRINTF("in calibration sweep *** \n");
557 rtems_interval ticks_per_seconds = rtems_clock_get_ticks_per_second();
558 while(1){
559 // Waiting for next F0 snapshot
560 rtems_event_receive(RTEMS_EVENT_CAL_SWEEP_WAKE, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out);
561 if(time_management_regs->calDACCtrl & BIT_CAL_ENABLE)
562 {
563 unsigned int delta_snapshot;
564 delta_snapshot = (parameter_dump_packet.sy_lfr_n_swf_p[0] * CONST_256)
565 + parameter_dump_packet.sy_lfr_n_swf_p[1];
566 // We are woken almost in the center of a snapshot -> let's wait for sy_lfr_n_swf_p / 2
567 rtems_task_wake_after( ticks_per_seconds * delta_snapshot / 2);
568 if(time_management_regs->calDivisor >= CAL_F_DIVISOR_MAX){
569 time_management_regs->calDivisor = CAL_F_DIVISOR_MIN;
570 }
571 else{
572 time_management_regs->calDivisor *= 2;
573 }
574 }
575
576
577
578 }
579
580 }
581
582
524 //*****************************
583 //*****************************
525 // init housekeeping parameters
584 // init housekeeping parameters
526
585
@@ -204,6 +204,7 inline void waveform_isr_normal_sbm1_sbm
204 }
204 }
205 // send an event to the WFRM task for resynchro activities
205 // send an event to the WFRM task for resynchro activities
206 status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_SWF_RESYNCH );
206 status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_SWF_RESYNCH );
207 status = rtems_event_send( Task_id[TASKID_CALI], RTEMS_EVENT_CAL_SWEEP_WAKE );
207 }
208 }
208
209
209 //***
210 //***