/*---------------------------------------------------------- * ---------------------------------------------------------------------- * Original file Copyright (C) 2000-2008, Universidad de Cantabria, SPAIN * MaRTE OS is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any * later version. * ------------------------------------------------------------------------ * * Modification of File 'edf_threads.c' exercise 1 C. Pagetti 2009/09 *---------------------------------------------------------------------------*/ #include #include #include #include #include #include #include //#include // debug #include "edf_sched.h" //#include /* Scheduled thread */ void * periodic (void * arg) { float amount_of_work = *(float *) arg; while (1) { /* do useful work */ eat (amount_of_work); posix_appsched_invoke_scheduler (0); } } #define MAIN_PRIO 5 int main () { pthread_attr_t attr; struct sched_param param; struct edf_sched_param user_param; pthread_t sched, NL, NF, FF, FL, AP, PF, PL; float load1, load2, load3, load4, load5, load6, load7; adjust (); // debug // init_serial_communication_with_gdb (SERIAL_PORT_1); // set_break_point_here; /* Set main task base priority */ param.sched_priority = MAIN_PRIO; CHK( pthread_setschedparam (pthread_self (), SCHED_FIFO, ¶m) ); /* Creation of the scheduler thread */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_FIFO); pthread_attr_setappschedulerstate (&attr, PTHREAD_APPSCHEDULER); param.sched_priority = MAIN_PRIO - 1; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&sched, &attr, edf_scheduler, NULL) ); pthread_attr_destroy(&attr); /* Creation of NL */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_APP); CHK( pthread_attr_setappscheduler (&attr, sched) ); user_param.period.tv_sec = 120; user_param.period.tv_nsec = 0; load1 = 20; CHK( pthread_attr_setappschedparam (&attr, &user_param, sizeof(user_param)) ); param.sched_priority = MAIN_PRIO - 3; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&NL, &attr, periodic, &load1) ); /* Creation of NF */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_APP); CHK( pthread_attr_setappscheduler (&attr, sched) ); user_param.period.tv_sec = 120; user_param.period.tv_nsec = 0; load2 = 10; CHK( pthread_attr_setappschedparam (&attr, &user_param, sizeof(user_param)) ); param.sched_priority = MAIN_PRIO - 3; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&NF, &attr, periodic, &load2) ); /* Creation of PL */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_APP); CHK( pthread_attr_setappscheduler (&attr, sched) ); user_param.period.tv_sec = 40; user_param.period.tv_nsec = 0; load3 = 10; CHK( pthread_attr_setappschedparam (&attr, &user_param, sizeof(user_param)) ); param.sched_priority = MAIN_PRIO - 3; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&PL, &attr, periodic, &load3) ); /* Creation of PF */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_APP); CHK( pthread_attr_setappscheduler (&attr, sched) ); user_param.period.tv_sec = 40; user_param.period.tv_nsec = 0; load4 = 10; CHK( pthread_attr_setappschedparam (&attr, &user_param, sizeof(user_param)) ); param.sched_priority = MAIN_PRIO - 3; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&PF, &attr, periodic, &load4) ); /* Creation of FF */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_APP); CHK( pthread_attr_setappscheduler (&attr, sched) ); user_param.period.tv_sec = 10; user_param.period.tv_nsec = 0; load5 = 1; CHK( pthread_attr_setappschedparam (&attr, &user_param, sizeof(user_param)) ); param.sched_priority = MAIN_PRIO - 3; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&FF, &attr, periodic, &load5) ); /* Creation of FL */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_APP); CHK( pthread_attr_setappscheduler (&attr, sched) ); user_param.period.tv_sec = 10; user_param.period.tv_nsec = 0; load6 = 2; CHK( pthread_attr_setappschedparam (&attr, &user_param, sizeof(user_param)) ); param.sched_priority = MAIN_PRIO - 3; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&FL, &attr, periodic, &load6) ); /* Creation of AP */ pthread_attr_init (&attr); pthread_attr_setschedpolicy (&attr, SCHED_APP); CHK( pthread_attr_setappscheduler (&attr, sched) ); user_param.period.tv_sec = 10; user_param.period.tv_nsec = 0; load7 = 1; CHK( pthread_attr_setappschedparam (&attr, &user_param, sizeof(user_param)) ); param.sched_priority = MAIN_PRIO - 3; CHK( pthread_attr_setschedparam (&attr, ¶m) ); CHK( pthread_create (&AP, &attr, periodic, &load7) ); CHK( pthread_join (sched, NULL) ); return 0; }