diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,2 +1,2 @@ 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters -db74b38fe91cd826fa49fa4eb6f93d626637ceb9 header/lfr_common_headers +1b9238c8848953d545d6ff9c9b8b15d19a597fb6 header/lfr_common_headers diff --git a/header/fsw_misc.h b/header/fsw_misc.h --- a/header/fsw_misc.h +++ b/header/fsw_misc.h @@ -137,6 +137,7 @@ rtems_task hous_task( rtems_task_argumen rtems_task avgv_task( rtems_task_argument argument ); rtems_task dumb_task( rtems_task_argument unused ); rtems_task scrubbing_task( rtems_task_argument unused ); +rtems_task calibration_sweep_task( rtems_task_argument unused ); void init_housekeeping_parameters( void ); void increment_seq_counter(unsigned short *packetSequenceControl); diff --git a/header/tc_handler.h b/header/tc_handler.h --- a/header/tc_handler.h +++ b/header/tc_handler.h @@ -37,6 +37,8 @@ #define CAL_NB_PTS 256 #define CAL_DATA_MASK 0xfff #define CAL_F_DIVISOR 38 // 25 MHz => 160 256 (39 - 1) +#define CAL_F_DIVISOR_MIN 38 +#define CAL_F_DIVISOR_MAX (38*2*2*2*2) // INTERLEAVED MODE #define CAL_FS_INTER 240384.615 #define CAL_NB_PTS_INTER 384 diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -27,7 +27,7 @@ #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_TASKS 22 // number of tasks concurrently active including INIT +#define CONFIGURE_MAXIMUM_TASKS 23 // number of tasks concurrently active including INIT #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE) #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32 @@ -378,6 +378,7 @@ void create_names( void ) // create all Task_name[TASKID_AVF2] = rtems_build_name( 'A', 'V', 'F', '2' ); Task_name[TASKID_PRC2] = rtems_build_name( 'P', 'R', 'C', '2' ); Task_name[TASKID_SCRB] = rtems_build_name( 'S', 'C', 'R', 'B' ); + Task_name[TASKID_CALI] = rtems_build_name( 'C', 'A', 'L', 'I' ); // rate monotonic period names name_hk_rate_monotonic = rtems_build_name( 'H', 'O', 'U', 'S' ); @@ -587,6 +588,14 @@ int create_all_tasks( void ) // create a RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVGV] ); } + if (status == RTEMS_SUCCESSFUL) // CALI + { + status = rtems_task_create( + Task_name[TASKID_CALI], TASK_PRIORITY_CALI, RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_CALI] + ); + } return status; } @@ -770,6 +779,13 @@ int start_all_tasks( void ) // start all BOOT_PRINTF("in INIT *** Error starting TASK_LOAD\n") } } + if (status == RTEMS_SUCCESSFUL) // CALI + { + status = rtems_task_start( Task_id[TASKID_CALI], calibration_sweep_task, 1 ); + if (status!=RTEMS_SUCCESSFUL) { + BOOT_PRINTF("in INIT *** Error starting TASK_LOAD\n") + } + } return status; } diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -523,7 +523,7 @@ rtems_task dumb_task( rtems_task_argumen rtems_task scrubbing_task( rtems_task_argument unused ) { - /** This RTEMS taks is to avoid entering IDLE task and also scrub memory to increase scubbing frequency. + /** This RTEMS taks is used to avoid entering IDLE task and also scrub memory to increase scubbing frequency. * * @param unused is the starting argument of the RTEMS task * @@ -542,6 +542,44 @@ rtems_task scrubbing_task( rtems_task_ar } } +rtems_task calibration_sweep_task( rtems_task_argument unused ) +{ + /** This RTEMS taks is used to change calibration signal smapling frequency between snapshots. + * + * @param unused is the starting argument of the RTEMS task + * + * If calibration is enabled, this task will divide by two the calibration signal smapling frequency between snapshots. + * When minimum sampling frequency is reach it will jump to maximum sampling frequency to loop indefinitely. + * + */ + rtems_event_set event_out; + BOOT_PRINTF("in calibration sweep *** \n"); + rtems_interval ticks_per_seconds = rtems_clock_get_ticks_per_second(); + while(1){ + // Waiting for next F0 snapshot + rtems_event_receive(RTEMS_EVENT_CAL_SWEEP_WAKE, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); + if(time_management_regs->calDACCtrl & BIT_CAL_ENABLE) + { + unsigned int delta_snapshot; + delta_snapshot = (parameter_dump_packet.sy_lfr_n_swf_p[0] * CONST_256) + + parameter_dump_packet.sy_lfr_n_swf_p[1]; + // We are woken almost in the center of a snapshot -> let's wait for sy_lfr_n_swf_p / 2 + rtems_task_wake_after( ticks_per_seconds * delta_snapshot / 2); + if(time_management_regs->calDivisor >= CAL_F_DIVISOR_MAX){ + time_management_regs->calDivisor = CAL_F_DIVISOR_MIN; + } + else{ + time_management_regs->calDivisor *= 2; + } + } + + + + } + +} + + //***************************** // init housekeeping parameters diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -204,6 +204,7 @@ inline void waveform_isr_normal_sbm1_sbm } // send an event to the WFRM task for resynchro activities status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_SWF_RESYNCH ); + status = rtems_event_send( Task_id[TASKID_CALI], RTEMS_EVENT_CAL_SWEEP_WAKE ); } //***