#include #include #include #include #include // TOTAL = 32 coefficients * 4 = 128 octets * 3 * 12 = 4608 octets // SX 12 coefficients float k14_sx_re = 1; float k14_sx_im = 1; float k15_sx_re = 1; float k15_sx_im = 1; float k24_sx_re = 1; float k24_sx_im = 1; float k25_sx_re = 1; float k25_sx_im = 1; float k34_sx_re = 1; float k34_sx_im = 1; float k35_sx_re = 1; float k35_sx_im = 1; // NY 8 coefficients float k24_ny_re = 1; float k24_ny_im = 1; float k25_ny_re = 1; float k25_ny_im = 1; float k34_ny_re = 1; float k34_ny_im = 1; float k35_ny_re = 1; float k35_ny_im = 1; // NZ 8 coefficients float k24_nz_re = 1; float k24_nz_im = 1; float k25_nz_re = 1; float k25_nz_im = 1; float k34_nz_re = 1; float k34_nz_im = 1; float k35_nz_re = 1; float k35_nz_im = 1; // PE 4 coefficients float k44_pe = 1; float k55_pe = 1; float k45_pe_re = 1; float k45_pe_im = 1; float alpha_M = M_PI/4; extern volatile int spec_mat_f0_a[ ]; extern volatile int spec_mat_f0_b[ ]; extern volatile int spec_mat_f0_c[ ]; extern volatile int spec_mat_f0_d[ ]; extern volatile int spec_mat_f0_e[ ]; extern volatile int spec_mat_f0_f[ ]; extern volatile int spec_mat_f0_g[ ]; extern volatile int spec_mat_f0_h[ ]; extern float averaged_spec_mat_f0[ ]; extern float compressed_spec_mat_f0[ ]; extern unsigned char LFR_BP1_F0[ ]; extern BP1_t data_BP1[ ]; extern rtems_id Task_id[ ]; /* array of task ids */ spectral_matrices_regs_t *spectral_matrices_regs; // Interrupt Service Routine for spectral matrices processing rtems_isr spectral_matrices_isr( rtems_vector_number vector ) { if (rtems_event_send( Task_id[TASKID_SMIQ], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) printf("In spectral_matrices_isr *** Error sending event to AVF0\n"); } rtems_task smiq_task(rtems_task_argument argument) // process the Spectral Matrices IRQ { rtems_event_set event_out; gptimer_regs_t *gptimer_regs; gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER; unsigned char nb_interrupt_f0 = 0; PRINTF("In SMIQ *** \n") while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 nb_interrupt_f0 = nb_interrupt_f0 + 1; if (nb_interrupt_f0 == (NB_SM_TO_RECEIVE_BEFORE_AVF0-1) ){ if (rtems_event_send( Task_id[6], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) printf("In smiq_task *** Error sending event to AVF0\n"); nb_interrupt_f0 = 0; } gptimer_regs->timer[1].ctrl = gptimer_regs->timer[1].ctrl | 0x00000010; } } rtems_task spw_bppr_task(rtems_task_argument argument) { rtems_status_code status; rtems_event_set event_out; static int nb_average_f0 = 0; //static int nb_average_f1 = 0; //static int nb_average_f2 = 0; while(1) spectral_matrices_regs = (struct spectral_matrices_regs_str *) REGS_ADDR_SPECTRAL_MATRICES; spectral_matrices_regs->address0 = (volatile int) spec_mat_f0_a; spectral_matrices_regs->address1 = (volatile int) spec_mat_f0_b; printf("In BPPR ***\n"); while(1){ // wait for an event to begin with the processing status = rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); if (status == RTEMS_SUCCESSFUL){ if ((spectral_matrices_regs->ctrl & 0x00000001)==1){ matrix_average(spec_mat_f0_a, averaged_spec_mat_f0); spectral_matrices_regs->ctrl = spectral_matrices_regs->ctrl & 0xfffffffe; //printf("f0_a\n"); nb_average_f0++; } if (((spectral_matrices_regs->ctrl>>1) & 0x00000001)==1){ matrix_average(spec_mat_f0_b, compressed_spec_mat_f0); spectral_matrices_regs->ctrl = spectral_matrices_regs->ctrl & 0xfffffffd; //printf("f0_b\n"); nb_average_f0++; } if (nb_average_f0 == NB_AVERAGE_NORMAL_f0){ matrix_compression(averaged_spec_mat_f0, 0, compressed_spec_mat_f0); //printf("f0 compressed\n"); nb_average_f0 = 0; matrix_reset(averaged_spec_mat_f0); } } } } void matrix_average(volatile int *spec_mat, float *averaged_spec_mat) { int i; for(i=0; i abs(sx_im) ) LFR_BP1[i*9+7] = LFR_BP1[i*9+1] | (0x80); // extract the sector of sx else LFR_BP1[i*9+7] = LFR_BP1[i*9+1] & (0x7f); // extract the sector of sx //====================================================================== // BP1 phase velocity estimator == PAR_LFR_SC_BP1_VPHI_F0 == 8 bits (7+1) ny = sin(alpha_M)*NVEC_V1 + cos(alpha_M)*NVEC_V2; nz = NVEC_V0; bx_bx_star = cos(alpha_M) * cos(alpha_M) * compressed_spec_mat[i*30+10] // re S22 + sin(alpha_M) * sin(alpha_M) * compressed_spec_mat[i*30+18] // re S33 - 2 * sin(alpha_M) * cos(alpha_M) * compressed_spec_mat[i*30+12]; // re S23 nebx_re = ny * (compressed_spec_mat[i*30+14] * k24_ny_re +compressed_spec_mat[i*30+16] * k25_ny_re +compressed_spec_mat[i*30+20] * k34_ny_re +compressed_spec_mat[i*30+22] * k35_ny_re) + nz * (compressed_spec_mat[i*30+14] * k24_nz_re +compressed_spec_mat[i*30+16] * k25_nz_re +compressed_spec_mat[i*30+20] * k34_nz_re +compressed_spec_mat[i*30+22] * k35_nz_re); nebx_im = ny * (compressed_spec_mat[i*30+15]*k24_ny_re +compressed_spec_mat[i*30+17] * k25_ny_re +compressed_spec_mat[i*30+21] * k34_ny_re +compressed_spec_mat[i*30+23] * k35_ny_re) + nz * (compressed_spec_mat[i*30+15] * k24_nz_im +compressed_spec_mat[i*30+17] * k25_nz_im +compressed_spec_mat[i*30+21] * k34_nz_im +compressed_spec_mat[i*30+23] * k35_nz_im); tmp = nebx_re / bx_bx_star; LFR_BP1[i*9+8] = ((unsigned char) (tmp * 128)) & 0x7f; // cf DOC for the compression if ( abs(nebx_re) > abs(nebx_im) ) LFR_BP1[i*9+8] = LFR_BP1[i*9+8] | (0x80); // extract the sector of nebx else LFR_BP1[i*9+8] = LFR_BP1[i*9+8] & (0x7f); // extract the sector of nebx } } void BP2_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat){ // BP2 autocorrelation int i, aux = 0; for(i = 0; iaddress0 = (volatile int) spec_mat_f0_a; spectral_matrices_regs->address1 = (volatile int) spec_mat_f0_b; nb_average = 0; PRINTF("In AVFO *** \n") while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 for(i=0; ictrl = spectral_matrices_regs->ctrl & 0xfffffffe; // reset the appropriate bit in the register nb_average = nb_average + NB_SM_TO_RECEIVE_BEFORE_AVF0; if (nb_average == NB_AVERAGE_NORMAL_f0) { nb_average = 0; status = rtems_event_send( Task_id[7], RTEMS_EVENT_0 ); // sending an event to the task 7, BPF0 if (status != RTEMS_SUCCESSFUL) printf("IN TASK AVF0 *** Error sending RTEMS_EVENT_0, code %d\n", status); } } } rtems_task bpf0_task(rtems_task_argument argument){ rtems_event_set event_out; PRINTF("In BPFO *** \n") while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 matrix_compression(averaged_spec_mat_f0, 0, compressed_spec_mat_f0); BP1_set(compressed_spec_mat_f0, NB_BINS_COMPRESSED_MATRIX_f0, LFR_BP1_F0); //PRINTF("IN TASK BPF0 *** Matrix compressed, parameters calculated\n") } } //******* // UNUSED rtems_task spw_bppr_task_rate_monotonic(rtems_task_argument argument) {/* rtems_status_code status; //static int nb_average_f1 = 0; //static int nb_average_f2 = 0; rtems_name name; rtems_id period; name = rtems_build_name( 'P', 'E', 'R', 'D' ); status = rtems_rate_monotonic_create( name, &period ); if( status != RTEMS_SUCCESSFUL ) { printf( "rtems_rate_monotonic_create failed with status of %d\n", status ); //exit( 1 ); } spectral_matrices_regs = (struct spectral_matrices_regs_str *) REGS_ADDR_SPECTRAL_MATRICES; spectral_matrices_regs->address0 = (volatile int) spec_mat_f0_a; spectral_matrices_regs->address1 = (volatile int) spec_mat_f0_b; printf("In BPPR BIS ***\n"); while(1){ // launch the rate monotonic task if ( rtems_rate_monotonic_period( period, 8 ) == RTEMS_TIMEOUT ){ printf("TIMEOUT\n"); //break; } status = rtems_event_send( Task_id[6], RTEMS_EVENT_0 ); // sending an event to the task 6, AVF0 if (status != RTEMS_SUCCESSFUL) printf("IN TASK BPPR BIS *** Error sending RTEMS_EVENT_0 to AVF0, code %d\n", status); } status = rtems_rate_monotonic_delete( period ); if ( status != RTEMS_SUCCESSFUL ) { printf( "rtems_rate_monotonic_delete failed with status of %d.\n", status ); //exit( 1 ); } status = rtems_task_delete( RTEMS_SELF ); // should not return printf( "rtems_task_delete returned with status of %d.\n", status ); //exit( 1 );*/ }