/*---------------------------------------------------------- * ---------------------------------------------------------------------- * 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 2 C. Pagetti 2009/09 *---------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include "edf_sched.h" typedef struct small_info{ int wcet; char name [20]; } small_info_t; /* Scheduled thread */ void * periodic (void * arg) { small_info_t the_info = *(small_info_t *) arg; while (1) { /* do useful work */ printf("%s\n",the_info.name); eat (the_info.wcet); 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; small_info_t NL_info, NF_info, AP_info, FF_info, FL_info, PL_info, PF_info; 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; NL_info.wcet = 20; strcpy(NL_info.name,"NL"); 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, &NL_info) ); /* 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; NL_info.wcet = 10; strcpy(NL_info.name,"NF"); 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, &NF_info) ); /* 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; PL_info.wcet = 10; strcpy(PL_info.name,"PL"); 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, &PL_info) ); /* 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; PF_info.wcet = 10; strcpy(PF_info.name,"PF"); 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, &PF_info) ); /* 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; FF_info.wcet = 1; strcpy(FF_info.name,"FF"); 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, &FF_info) ); /* 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; FL_info.wcet = 2; strcpy(FL_info.name,"FL"); 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, &FL_info) ); /* 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; AP_info.wcet = 1; strcpy(AP_info.name,"AP"); 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, &AP_info) ); CHK( pthread_join (sched, NULL) ); return 0; }