------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real-time scheduling analysis tool. -- This program provides services to automatically check schedulability and -- other performance criteria of real-time architecture models. -- -- Copyright (C) 2002-2023, Frank Singhoff, Alain Plantec, Jerome Legrand, -- Hai Nam Tran, Stephane Rubini -- -- The Cheddar project was started in 2002 by -- Frank Singhoff, Lab-STICC UMR 6285, Université de Bretagne Occidentale -- -- Cheddar has been published in the "Agence de Protection des Programmes/France" in 2008. -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- The full list of contributors and sponsors can be found in README.md -- -- This program 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 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -- -- Contact : cheddar@listes.univ-brest.fr -- ------------------------------------------------------------------------------ -- Last update : -- $Rev: 3520 $ -- $Date: 2020-07-23 12:44:45 +0200 (Thu, 23 Jul 2020) $ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with execution_units; use execution_units; with execution_units.extended; use execution_units.extended; with time_unit_events; use time_unit_events; use time_unit_events.time_unit_package; package scheduler.mixed_criticality is type tab_factor is array (1..3) of Natural; type mixed_criticality_scheduler is abstract new generic_scheduler with record state : mode_range := Low_Criticality; is_change_mode : Boolean := False; nb_recursif : Natural := 0; index : Natural := 0; end record; type mixed_criticality_scheduler_ptr is access all mixed_criticality_scheduler'class; type mixed_criticality_tcb is new tcb with record dynamic_deadline : Natural; current_capacities : execution_units_table; current_dc_value : Natural; current_quality_exit : Natural; is_execution_continue : Boolean; completion_time : Natural := 0; end record; type mixed_criticality_tcb_ptr is access all mixed_criticality_tcb'class; procedure initialize (a_tcb : in out mixed_criticality_tcb); function build_tcb (my_scheduler : in mixed_criticality_scheduler; a_task : generic_task_ptr) return tcb_ptr; procedure check_before_scheduling (my_scheduler : in mixed_criticality_scheduler; my_tasks : in tasks_set; processor_name : in Unbounded_String); procedure specific_scheduler_initialization (my_scheduler : in out mixed_criticality_scheduler; si : in out scheduling_information; processor_name : in Unbounded_String; address_space_name : in Unbounded_String; my_tasks : in out tasks_set; my_schedulers : in scheduler_table; my_resources : in out resources_set; my_buffers : in out buffers_set; my_messages : in messages_set; msg : in out Unbounded_String); procedure do_election (my_scheduler : in out mixed_criticality_scheduler; si : in out scheduling_information; result : in out scheduling_sequence_ptr; msg : in out Unbounded_String; current_time : in Natural; processor_name : in Unbounded_String; address_space_name : in Unbounded_String; core_name : in Unbounded_String; options : in scheduling_option; event_to_generate : in time_unit_event_type_boolean_table; elected : in out tasks_range; no_task : in out Boolean); procedure find_elected_task (si : in scheduling_information; my_scheduler : in mixed_criticality_scheduler; core_name : in Unbounded_String; address_space_name : in Unbounded_String; processor_name : in Unbounded_String; current_time : in Natural; options : in scheduling_option; highiest_priority : in out Natural; elected : in out tasks_range); procedure verification_of_budget_overruns (elected_task : in out mixed_criticality_tcb_ptr; my_scheduler : in out mixed_criticality_scheduler; result : in out scheduling_sequence_ptr; find : in out Boolean; highiest_priority : in out Natural; si : in out scheduling_information; options : in scheduling_option; elected : in tasks_range; current_time : in Natural; current_mode : in mode_range ); procedure compute_score(my_scheduler : in mixed_criticality_scheduler); procedure update_simulation_data_on_mode_change (my_scheduler : in out mixed_criticality_scheduler; si : in out scheduling_information; elected : in tasks_range; no_task : Boolean); procedure do_mode_change (my_scheduler : in out mixed_criticality_scheduler; options : in scheduling_option; si : in scheduling_information; result : in out scheduling_sequence_ptr; current_time : in Natural; from_mode : in mode_range; to_mode: in mode_range ); procedure stop_tasks ( from_mode : in mode_range; si : in out scheduling_information); procedure produce_mode_change (my_scheduler : in mixed_criticality_scheduler; options : in scheduling_option; si : in scheduling_information; an_event : out time_unit_event_ptr; from_mode : in mode_range; to_mode : in mode_range); private end scheduler.mixed_criticality;