#include #include #include #include float k14_re = 1; float k14_im = 1; float k14_bis_re = 1; float k14_bis_im = 1; float k14_tris_re = 1; float k14_tris_im = 1; float k15_re = 1; float k15_im = 1; float k15_bis_re = 1; float k15_bis_im = 1; float k24_re = 1; float k24_im = 1; float k24_bis_re = 1; float k24_bis_im = 1; float k24_tris_re = 1; float k24_tris_im = 1; float k25_re = 1; float k25_im = 1; float k25_bis_re = 1; float k25_bis_im = 1; float k34_re = 1; float k34_im = 1; float k44 = 1; float k55 = 1; float k45_re = 1; float k45_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; 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 );*/ }