From: Petr Benes Date: Fri, 13 May 2011 00:10:24 +0000 (+0200) Subject: CBS: reps_lib.c implemented X-Git-Url: http://rtime.felk.cvut.cz/gitweb/rtems-pluggable-edf.git/commitdiff_plain/87ca20eca5ecb247e80d5e392051ea8d911c1759?ds=sidebyside CBS: reps_lib.c implemented reps_lib.c is the CBS implementation sitting atop of EDF. The interface reps_lib.h is a renamed copy of AQuoSA qres_lib.h (aquosa.sourceforge.net). However, this implementation is not full and also limited to only one task bound to a server at a time. --- diff --git a/src/edf/reps_lib.c b/src/edf/reps_lib.c index dcc5506..8ac58a1 100644 --- a/src/edf/reps_lib.c +++ b/src/edf/reps_lib.c @@ -1,40 +1,99 @@ #include "reps_lib.h" +#include "scheduler_edf.h" +#include +/// List of servers where @p reps_sid_t is the index +reps_server_t server_list[REPS_MAX_SERVERS]; + +/** for now, the server id equals to rtems thread id */ reps_rv reps_create_server(reps_params_t *p_params, reps_sid_t *p_sid) { - return REPS_E_NOT_IMPLEMENTED; + unsigned int i; + for(i = 0; ischeduler_info; + node->rel_deadline = p_params->P; + node->cmp_time = p_params->Q; + } + return REPS_OK; } reps_rv reps_attach_thread(reps_sid_t server_id, tid_t tid){ - return REPS_E_NOT_IMPLEMENTED; + if (server_list[server_id].task) + return REPS_E_MULTIPLE_TASKS_IN_SERVER; + server_list[server_id].task = tid; + Objects_Locations location; + Thread_Control *the_thread = _Thread_Get(tid, &location); + RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; + node->rel_deadline = server_list[server_id].params.P; + node->cmp_time = server_list[server_id].params.Q; + the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; + rtems_timer_create(rtems_build_name( 'C', 'B', 'S', 'T' ), &node->timer_id); + return REPS_OK; } reps_rv reps_get_sid(tid_t tid, reps_sid_t *p_sid){ - return REPS_E_NOT_IMPLEMENTED; + unsigned int i; + for(i = 0; ischeduler_info; + node->cmp_time = 0; + rtems_timer_delete(node->timer_id); + the_thread->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; + the_thread->budget_callout = NULL; + + if (sid >= REPS_MAX_SERVERS) + return REPS_E_INVALID_SID; + server_list[sid].task = 0; + return REPS_OK; } reps_rv reps_get_exec_time (reps_sid_t sid, reps_time_t *exec_time){ - return REPS_E_NOT_IMPLEMENTED; + Objects_Locations location; + Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location); + RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; + *exec_time = node->cmp_time - the_thread->cpu_time_budget; + return REPS_OK; } reps_rv reps_get_params(reps_sid_t sid, reps_params_t *p_params){ - return REPS_E_NOT_IMPLEMENTED; + *p_params = server_list[sid].params; + return REPS_OK; } reps_rv reps_get_curr_budget(reps_sid_t sid, reps_time_t *curr_budget){ - return REPS_E_NOT_IMPLEMENTED; + Objects_Locations location; + Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location); + *curr_budget = the_thread->cpu_time_budget; + return REPS_OK; } reps_rv reps_reserve_spare(reps_params_t *p_params){ @@ -42,14 +101,23 @@ reps_rv reps_reserve_spare(reps_params_t *p_params){ } reps_rv reps_get_appr_budget (reps_sid_t sid, reps_time_t *appr_budget){ - return REPS_E_NOT_IMPLEMENTED; + Objects_Locations location; + Thread_Control *the_thread = _Thread_Get(server_list[sid].task, &location); + RBT_Node *node = (RBT_Node*)the_thread->scheduler_info; + *appr_budget = node->cmp_time; + return REPS_OK; } reps_rv reps_init(void){ + unsigned int i; + for(i = 0; i