#include #include #include #include #include "types.h" #include "ts.h" #include "assemblage_includes.h" #include "assemblage.h" #include "threads.h" #include "returncode.h" #include "time_conversion.h" // SR for monitoring #include "sched_mon.h" #include "monano.h" #include "configure.h" #define NTHREAD 15 /* Critical instant : start time of the application */ struct timespec critical_instant, finaltime; // Task set struct nonencoded_task_params* tasks; // I/O output_t outs; // simulation length long max_step_simu; struct pthread_monano_t my_monano; struct pthread_monano_attr_t my_monano_attr; pthread_monano_id_t my_monano_id [NTHREAD]; // Output variables extern double aircraft_dynamics495_Va_Va_filter_100449_Va[2]; extern double aircraft_dynamics495_az_az_filter_100458_az[2]; extern double aircraft_dynamics495_Vz_Vz_filter_100452_Vz[2]; extern double aircraft_dynamics495_q_q_filter_100455_q[2]; extern double aircraft_dynamics495_h_h_filter_100446_h[2]; extern double Va_control_50474_delta_th_c_delta_th_c; extern double Vz_control_50483_delta_e_c_delta_e_c; void copy_output_vars(output_t* v, uint64_t step) { v->sig_outputs.Va = aircraft_dynamics495_Va_Va_filter_100449_Va[step%2]; v->sig_outputs.Vz = aircraft_dynamics495_Vz_Vz_filter_100452_Vz[step%2]; v->sig_outputs.q = aircraft_dynamics495_q_q_filter_100455_q[step%2]; v->sig_outputs.az = aircraft_dynamics495_az_az_filter_100458_az[step%2]; v->sig_outputs.h = aircraft_dynamics495_h_h_filter_100446_h[step%2]; v->sig_delta_th_c = Va_control_50474_delta_th_c_delta_th_c; v->sig_delta_e_c = Vz_control_50483_delta_e_c_delta_e_c; } int val (int id) { int v; switch (id) { case 0: v=5; break; case 1: v=13; break; case 2: v=3; break; case 3: v=4; break; case 4: v=8; break; case 5: v=7; break; case 6: v=6; break; case 7: v=14; break; case 8: v=10; break; case 9: v=2; break; case 10: v=12; break; case 11: v=1; break; case 12: v=9; break; case 13: v=11; break; case 14: v=0; break; default: v=-1; } return v; } void* my_callback(int anomaly_number, pthread_monano_id_t id) { switch (anomaly_number){ case 0: printf("Type Anomaly : REDUCE_WCET_ANOMALIE on thread number %d \n", id); break; case 1: printf("Type Anomaly : PRIORITY_ANOMALIE on thread number %d \n", id); break; case 2: printf("Type Anomaly : DEPENDENCY_ANOMALIE on thread number %d \n", id); break; case 3: printf("Type Anomaly : SPEED_PROCESSOR_ANOMALIE on all thread \n"); break; case 4: printf("Type Anomaly : DELAY_WCET_ANOMALIE on thread number %d \n", id); break; default : printf("Not a type Anomaly \n"); } return 0; } void rosace_init() { // Initial values outs.sig_outputs.Va = 0; outs.sig_outputs.Vz = 0; outs.sig_outputs.q = 0; outs.sig_outputs.az = 0; outs.sig_outputs.h = 0; outs.t_simu = 0; // Get the task set (required for CALL() macro) int tmp; get_task_set(&tmp, &tasks); #if SCHEDMON>0L { int read_back; SCHEDMON_mWriteReg(0x50000000, SCHEDMON_S00_AXI_SLV_REG0_OFFSET, 0x01000000); SCHEDMON_mWriteReg(0x50000000, SCHEDMON_S00_AXI_SLV_REG0_OFFSET, 0x03000000+100000); SCHEDMON_mReadReg(0x50000000, SCHEDMON_S00_AXI_SLV_REG0_OFFSET, read_back); printf("%x --\r\n", read_back); SCHEDMON_mWriteReg(0x50000000, SCHEDMON_S00_AXI_SLV_REG0_OFFSET, 0x02000000); //SCHEDMON_mReadReg(0x50000000, SCHEDMON_S00_AXI_SLV_REG0_OFFSET, read_back); //printf("%x --\r\n", read_back); } #endif #if SCHEDMON>1L SCHEDMON_mWriteReg(0x50000000, SCHEDMON_S00_AXI_SLV_REG1_OFFSET, 0x00000101); #endif } void* periodic_activation(void* arg) { int ego = *(int*)arg; /* Called by a thread to signal to MONANO that the thread has started its execution */ pthread_monano_signal_departure_time(&my_monano, my_monano_id[ego]); CALL(val(my_monano_id[ego])); /* Called by a thread to signal to MONANO that the thread has completed its execution */ pthread_monano_signal_end_time(&my_monano, my_monano_id[ego]); return 0; } void run_rosace(void) { struct sched_param param; struct pthread_monano_attr_t tparam [15]={ {99,{0,us_to_ns(200)},{0,us_to_ns(5000)},{0,us_to_ns(5000)}}, {86,{0,us_to_ns(100)},{0,us_to_ns(3100)},{0,us_to_ns(3100)}}, {85,{0,us_to_ns(100)},{0,us_to_ns(5000)},{0,us_to_ns(5000)}}, {98,{0,us_to_ns(100)},{0,us_to_ns(10000)},{0,us_to_ns(10000)}}, {97,{0,us_to_ns(100)},{0,us_to_ns(10000)},{0,us_to_ns(10000)}}, {96,{0,us_to_ns(100)},{0,us_to_ns(10000)},{0,us_to_ns(10000)}}, {94,{0,us_to_ns(100)},{0,us_to_ns(10000)},{0,us_to_ns(10000)}}, {95,{0,us_to_ns(100)},{0,us_to_ns(10000)},{0,us_to_ns(10000)}}, {92,{0,us_to_ns(100)},{0,us_to_ns(20000)},{0,us_to_ns(20000)}}, {91,{0,us_to_ns(100)},{0,us_to_ns(20000)},{0,us_to_ns(20000)}}, {89,{0,us_to_ns(100)},{0,us_to_ns(20000)},{0,us_to_ns(20000)}}, {88,{0,us_to_ns(500)},{0,us_to_ns(20000)},{0,us_to_ns(20000)}}, {87,{0,us_to_ns(500)},{0,us_to_ns(20000)},{0,us_to_ns(20000)}}, {90,{0,us_to_ns(500)},{0,us_to_ns(20000)},{0,us_to_ns(20000)}}, {93,{0,us_to_ns(500)},{0,us_to_ns(20000)},{0,us_to_ns(20000)}} }; int status, i; int *ego; /* initialize benchmark */ rosace_init(); ROSACE_update_altitude_command(11000.0); /* Monano init and register */ pthread_monano_init(&my_monano); pthread_monano_attr_init(&my_monano_attr); pthread_monano_register_anomaly_callback(&my_monano, my_callback); /* Upgrade main thread priority */ param.sched_priority=100; status=pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m); if(status<0) returncode("pthread_attr_setschedparam",status); for(i=0;i